text: function assert(actual, expected, message) {
      if (arguments.length == 1)
          expected = true;
  
      if (actual === expected)
          return;
  
      if (actual !== null && expected !== null
      &&  typeof actual == 'object' && typeof expected == 'object'
      &&  actual.toString() === expected.toString())
          return;
  
      throw Error("assertion failed: got |" + actual + "|" +
                  ", expected |" + expected + "|" +
                  (message ? " (" + message + ")" : ""));
  }
  
  // load more elaborate version of assert if available
  try { __loadScript("test_assert.js"); } catch(e) {}
  
  /*----------------*/
  
  function test_while()
  {
      var i, c;
      i = 0;
      c = 0;
      while (i < 3) {
          c++;
          i++;
      }
      assert(c === 3);
  }
  
  function test_while_break()
  {
      var i, c;
      i = 0;
      c = 0;
      while (i < 3) {
          c++;
          if (i == 1)
              break;
          i++;
      }
      assert(c === 2 && i === 1);
  }
  
  function test_do_while()
  {
      var i, c;
      i = 0;
      c = 0;
      do {
          c++;
          i++;
      } while (i < 3);
      assert(c === 3 && i === 3);
  }
  
  function test_for()
  {
      var i, c;
      c = 0;
      for(i = 0; i < 3; i++) {
          c++;
      }
      assert(c === 3 && i === 3);
  
      c = 0;
      for(var j = 0; j < 3; j++) {
          c++;
      }
      assert(c === 3 && j === 3);
  }
  
  function test_for_in()
  {
      var i, tab, a, b;
  
      tab = [];
      for(i in {x:1, y: 2}) {
          tab.push(i);
      }
      assert(tab.toString(), "x,y", "for_in");
  
      /* prototype chain test */
      a = {x:2, y: 2, "1": 3};
      b = {"4" : 3 };
      Object.setPrototypeOf(a, b);
      tab = [];
      for(i in a) {
          tab.push(i);
      }
      assert(tab.toString(), "1,x,y,4", "for_in");
  
      /* non enumerable properties hide enumerables ones in the
         prototype chain */
      a = {y: 2, "1": 3};
      Object.defineProperty(a, "x", { value: 1 });
      b = {"x" : 3 };
      Object.setPrototypeOf(a, b);
      tab = [];
      for(i in a) {
          tab.push(i);
      }
      assert(tab.toString(), "1,y", "for_in");
  
      /* array optimization */
      a = [];
      for(i = 0; i < 10; i++)
          a.push(i);
      tab = [];
      for(i in a) {
          tab.push(i);
      }
      assert(tab.toString(), "0,1,2,3,4,5,6,7,8,9", "for_in");
  
      /* iterate with a field */
      a={x:0};
      tab = [];
      for(a.x in {x:1, y: 2}) {
          tab.push(a.x);
      }
      assert(tab.toString(), "x,y", "for_in");
  
      /* iterate with a variable field */
      a=[0];
      tab = [];
      for(a[0] in {x:1, y: 2}) {
          tab.push(a[0]);
      }
      assert(tab.toString(), "x,y", "for_in");
  
      /* variable definition in the for in */
      tab = [];
      for(var j in {x:1, y: 2}) {
          tab.push(j);
      }
      assert(tab.toString(), "x,y", "for_in");
  
      /* variable assigment in the for in */
      tab = [];
      for(var k = 2 in {x:1, y: 2}) {
          tab.push(k);
      }
      assert(tab.toString(), "x,y", "for_in");
  }
  
  function test_for_in2()
  {
      var i;
      tab = [];
      for(i in {x:1, y: 2, z:3}) {
          if (i === "y")
              continue;
          tab.push(i);
      }
      assert(tab.toString() == "x,z");
  
      tab = [];
      for(i in {x:1, y: 2, z:3}) {
          if (i === "z")
              break;
          tab.push(i);
      }
      assert(tab.toString() == "x,y");
  }
  
  function test_for_break()
  {
      var i, c;
      c = 0;
      L1: for(i = 0; i < 3; i++) {
          c++;
          if (i == 0)
              continue;
          while (1) {
              break L1;
          }
      }
      assert(c === 2 && i === 1);
  }
  
  function test_switch1()
  {
      var i, a, s;
      s = "";
      for(i = 0; i < 3; i++) {
          a = "?";
          switch(i) {
          case 0:
              a = "a";
              break;
          case 1:
              a = "b";
              break;
          default:
              a = "c";
              break;
          }
          s += a;
      }
      assert(s === "abc" && i === 3);
  }
  
  function test_switch2()
  {
      var i, a, s;
      s = "";
      for(i = 0; i < 4; i++) {
          a = "?";
          switch(i) {
          case 0:
              a = "a";
              break;
          case 1:
              a = "b";
              break;
          case 2:
              continue;
          default:
              a = "" + i;
              break;
          }
          s += a;
      }
      assert(s === "ab3" && i === 4);
  }
  
  function test_try_catch1()
  {
      try {
          throw "hello";
      } catch (e) {
          assert(e, "hello", "catch");
          return;
      }
      assert(false, "catch");
  }
  
  function test_try_catch2()
  {
      var a;
      try {
          a = 1;
      } catch (e) {
          a = 2;
      }
      assert(a, 1, "catch");
  }
  
  function test_try_catch3()
  {
      var s;
      s = "";
      try {
          s += "t";
      } catch (e) {
          s += "c";
      } finally {
          s += "f";
      }
      assert(s, "tf", "catch");
  }
  
  function test_try_catch4()
  {
      var s;
      s = "";
      try {
          s += "t";
          throw "c";
      } catch (e) {
          s += e;
      } finally {
          s += "f";
      }
      assert(s, "tcf", "catch");
  }
  
  function test_try_catch5()
  {
      var s;
      s = "";
      for(;;) {
          try {
              s += "t";
              break;
              s += "b";
          } finally {
              s += "f";
          }
      }
      assert(s, "tf", "catch");
  }
  
  function test_try_catch6()
  {
      function f() {
          try {
              s += 't';
              return 1;
          } finally {
              s += "f";
          }
      }
      var s = "";
      assert(f() === 1);
      assert(s, "tf", "catch6");
  }
  
  function test_try_catch7()
  {
      var s;
      s = "";
  
      try {
          try {
              s += "t";
              throw "a";
          } finally {
              s += "f";
          }
      } catch(e) {
          s += e;
      } finally {
          s += "g";
      }
      assert(s, "tfag", "catch");
  }
  
  function test_try_catch8()
  {
      var i, s;
      
      s = "";
      for(var i in {x:1, y:2}) {
          try {
              s += i;
              throw "a";
          } catch (e) {
              s += e;
          } finally {
              s += "f";
          }
      }
      assert(s === "xafyaf");
  }
  
  test_while();
  test_while_break();
  test_do_while();
  test_for();
  test_for_break();
  test_switch1();
  test_switch2();
  test_for_in();
  test_for_in2();
  
  test_try_catch1();
  test_try_catch2();
  test_try_catch3();
  test_try_catch4();
  test_try_catch5();
  test_try_catch6();
  test_try_catch7();
  test_try_catch8();
  