# Test the trap/catch mechanism.

printf( "Starting the try/catch tests...\n" );

assert = strip (function (t)
{
  if (!test(t))
  {
    message ("...failed.\a");
    exception ();
  }
});


try { x=21; exception (); x=0; } x*=2;
assert (x == 42);

try { x=99; catch x=0; exception (); }
assert (x == 99);

try
{
  x = 0;
  exception ();
catch
  try
  {
    exception ();
  catch
    try
    {
      exception ();
    catch
      try
      {
  	exception ();
      catch
  	try
  	{
  	  exception ();
  	catch
  	  try
  	  {
  	    exception ();
  	  catch
  	    try
  	    {
  	      exception ();
  	    catch
  	      try
  	      {
  		exception ();
  	      catch
  		try
  		{
  		  exception ();
  		catch
		  x = 1;
		}
	      }
	    }
	  }
	}
      }
    }
  }
}
assert (x);

x = 0;
try {try {try {try {try {try {try {try {
x = 0; exception ();
catch
x = 1;
}}}}}}}}
assert (x);

N = 10;
x = i = 0;
f = function (n)
{
  if (n)
  {
    try
    {
      self (n-1);
    catch
      i += 1;
      assert (x);
      exception ();
    }
  else
    x = 1;
    exception ();
  }
};
try {f (N); catch assert (x); }
assert (i == N);

fact = function (n)
{
  try {
    if (n<2) {exception();}
    return n*self(n-1);
  catch
    return 1.0;
  }
};
assert (fact (6) == 720);

fact = function (n)
{
  if (n<2) {exception();}
  try {
    n *= self(n-1);
  }
  return n;
};
assert (fact (7) == 5040);

printf ("...passed.\n");


syntax highlighted by Code2HTML, v. 0.9.1