RegressionTests__JavaScriptTests.st
changeset 265 896de964f5e7
parent 262 4b68b98a3232
child 267 afe36203bec9
--- a/RegressionTests__JavaScriptTests.st	Wed Apr 20 11:17:01 2005 +0200
+++ b/RegressionTests__JavaScriptTests.st	Wed Apr 27 13:00:50 2005 +0200
@@ -31,21 +31,7 @@
     "Created: / 12-04-2005 / 11:54:25 / cg"
 ! !
 
-!JavaScriptTests methodsFor:'initialize / release'!
-
-setUp
-    "common setup - invoked before testing."
-
-    super setUp
-!
-
-tearDown
-    "common cleanup - invoked after testing."
-
-    super tearDown
-! !
-
-!JavaScriptTests methodsFor:'tests'!
+!JavaScriptTests methodsFor:'helpers'!
 
 doTestEachFromSpec:spec 
     spec do:[:triple | 
@@ -80,6 +66,2289 @@
     ]
 !
 
+execute:code for:receiver arguments:arguments expect:expectedResult
+    |f result|
+
+    "/ Transcript showCR:(thisContext sender selector , '...').
+
+    f := JavaScriptCompiler
+        compile:code
+        forClass:nil
+        inCategory:nil
+        notifying:nil.
+
+"/ f inspect.
+
+    self assert:(f ~~ #Error).
+    self assert:(f notNil).
+
+    f decompileTo:Transcript.
+
+    result := f valueWithReceiver:receiver arguments:arguments.    
+    self assert:(result = expectedResult).
+!
+
+execute:code for:receiver arguments:arguments expectError:expectedError
+    |f|
+
+    "/ Transcript showCR:(thisContext sender selector , '...').
+
+    f := JavaScriptCompiler
+        compile:code
+        forClass:nil
+        inCategory:nil
+        notifying:nil.
+
+    expectedError == #ParseError ifTrue:[
+        self assert:(f == #Error).
+        ^ self
+    ].
+
+    self assert:(f ~~ #Error).
+    self assert:(f notNil).
+
+    f decompileTo:Transcript.
+
+    self 
+        should:[f valueWithReceiver:receiver arguments:arguments]
+        raise:expectedError
+! !
+
+!JavaScriptTests methodsFor:'tests'!
+
+testArray01
+    self 
+        execute:'test(arr) {
+                    return arr[1];
+                 }'
+        for:nil
+        arguments:#( #(10 20 30) )
+        expect:10
+
+    "
+     self run:#testArray01
+     self new testArray01  
+    "
+!
+
+testArray02
+    self 
+        execute:'test(arr) {
+                    arr[1];
+                 }'
+        for:nil
+        arguments:#( #(10 20 30) )
+        expect:nil
+
+    "
+     self run:#testArray02
+     self new testArray02  
+    "
+!
+
+testArray03
+    self 
+        execute:'test(arr, val) {
+                    arr[1] = val;
+                    return arr;
+                 }'
+        for:nil
+        arguments:#( #(10 20 30) 99 )
+        expect:#(99 20 30)
+
+    "
+     self run:#testArray03
+     self new testArray03  
+    "
+!
+
+testConditionalExpression01
+    self 
+        execute:'max(a, b) {
+                    return (a > b) ? a : b;
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:20
+
+    "
+     self run:#testConditionalExpression01
+     self new testConditionalExpression01
+    "
+!
+
+testConditionalExpression02
+    self 
+        execute:'max(a, b) {
+                    return (a < b) ? a : b;
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:10
+
+    "
+     self run:#testConditionalExpression02
+     self new testConditionalExpression02
+    "
+!
+
+testFor01
+    self 
+        execute:'test(arg) {
+                    var n;
+
+                    for (n = 0; n < 10; n++) {
+                        Transcript.show("hello ");
+                        Transcript.showCR(n);
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testFor01
+     self new testFor01  
+    "
+!
+
+testFor01b
+    |outStream output|
+
+    outStream := '' writeStream.
+
+    self 
+        execute:'test(arg, out) {
+                    var n;
+
+                    for (n = 0; n < arg; n++) {
+                        out.show("hello ");
+                        out.showCR(n);
+                    }
+                 }'
+        for:nil
+        arguments:(Array with:4 with:outStream)
+        expect:nil.
+
+    output := outStream contents.
+    self assert:(output = 'hello 0
+hello 1
+hello 2
+hello 3
+').
+
+    "
+     self run:#testFor01b
+     self new testFor01b  
+    "
+!
+
+testFor01c
+    self 
+        execute:'test(arg) {
+                    var n, m;
+
+                    for (n = 0, m = 10; n < 10; n++, m--) {
+                        Transcript.show(n);
+                        Transcript.show(" -> ");
+                        Transcript.showCR(m);
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testFor01c
+     self new testFor01c  
+    "
+!
+
+testFor02
+    |outStream output|
+
+    outStream := '' writeStream.
+
+    self 
+        execute:'test(arg, out) {
+                    var n;
+
+                    for (n = 0; n < arg; n++) {
+                        out.show("hello ");
+                        out.showCR(n);
+                    }
+                 }'
+        for:nil
+        arguments:(Array with:4 with:outStream)
+        expect:nil.
+
+    output := outStream contents.
+    self assert:(output = 'hello 0
+hello 1
+hello 2
+hello 3
+').
+
+    "
+     self run:#testFor02
+     self new testFor02  
+    "
+!
+
+testFor02b
+    |outStream output|
+
+    outStream := '' writeStream.
+
+    self 
+        execute:'test(arg, out) {
+                    var n;
+
+                    for (n = 0; n < arg; ) {
+                        out.show("hello ");
+                        out.showCR(n++);
+                    }
+                 }'
+        for:nil
+        arguments:(Array with:4 with:outStream)
+        expect:nil.
+
+    output := outStream contents.
+    self assert:(output = 'hello 0
+hello 1
+hello 2
+hello 3
+').
+
+    "
+     self run:#testFor02b
+     self new testFor02b  
+    "
+!
+
+testFor03b
+    |outStream output|
+
+    outStream := '' writeStream.
+
+    self 
+        execute:'test(arg, out) {
+                    var n = 0;
+
+                    for (; n < arg; ) {
+                        out.show("hello ");
+                        out.showCR(n++);
+                    }
+                 }'
+        for:nil
+        arguments:(Array with:4 with:outStream)
+        expect:nil.
+
+    output := outStream contents.
+    self assert:(output = 'hello 0
+hello 1
+hello 2
+hello 3
+').
+
+    "
+     self run:#testFor03b
+     self new testFor03b  
+    "
+!
+
+testFor04b
+    |outStream output|
+
+    outStream := '' writeStream.
+
+    self 
+        execute:'test(arg, out) {
+                    var n = 0;
+
+                    for (; ; ) {
+                        if (n >= arg) return;
+                        out.show("hello ");
+                        out.showCR(n++);
+                    }
+                 }'
+        for:nil
+        arguments:(Array with:4 with:outStream)
+        expect:nil.
+
+    output := outStream contents.
+    self assert:(output = 'hello 0
+hello 1
+hello 2
+hello 3
+').
+
+    "
+     self run:#testFor04b
+     self new testFor04b  
+    "
+!
+
+testFor05
+    self 
+        execute:'test(arg) {
+                    for (var n = 0; n < arg; n++) {
+                        Transcript.showCR(n);
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testFor05
+     self new testFor05  
+    "
+!
+
+testFor05b
+    |outStream output|
+
+    outStream := '' writeStream.
+
+    self 
+        execute:'test(arg, out) {
+                    var n = 0;
+
+                    for (; ; ) {
+                        if (n >= arg) break;
+                        out.show("hello ");
+                        out.showCR(n++);
+                    }
+                 }'
+        for:nil
+        arguments:(Array with:4 with:outStream)
+        expect:nil.
+
+    output := outStream contents.
+    self assert:(output = 'hello 0
+hello 1
+hello 2
+hello 3
+').
+
+    "
+     self run:#testFor05b
+     self new testFor05b  
+    "
+!
+
+testFor05c
+    self 
+        execute:'test(arg, out) {
+                    var n = 0;
+
+                    for (; ; ) {
+                        if (n >= arg) break;
+                        out.show("hello ");
+                        out.showCR(n++);
+                    }
+                 }'
+        for:nil
+        arguments:(Array with:4 with:Transcript)
+        expect:nil.
+
+    "
+     self run:#testFor05c
+     self new testFor05c  
+    "
+!
+
+testFor05d
+    self 
+        execute:'test(arg, out) {
+                    var n = 0;
+
+                    for (; ; ) {
+                        n++;
+                        if (n >= arg) break;
+                        if (n == 2) continue;
+                        out.show("hello ");
+                        out.showCR(n);
+                    }
+                 }'
+        for:nil
+        arguments:(Array with:5 with:Transcript)
+        expect:nil.
+
+    "
+     self run:#testFor05d
+     self new testFor05d  
+    "
+!
+
+testFor06
+    self 
+        execute:'test(arg) {
+                    for (var n = 0, var m = 10; n < 10; n++, m--) {
+                        Transcript.show(n);
+                        Transcript.show(" -> ");
+                        Transcript.showCR(m);
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testFor06
+     self new testFor06  
+    "
+!
+
+testIf01
+    self 
+        execute:'max(a, b) {
+                    if (a > b) return a;
+                    return b;
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:20
+
+    "
+     self run:#testIf01
+     self new testIf01
+    "
+!
+
+testIf02
+    self 
+        execute:'max(a, b) {
+                    if (a > b) ;
+                    else return b;
+                    return a;
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:20
+
+    "
+     self run:#testIf02
+     self new testIf02
+    "
+!
+
+testIf03
+    self 
+        execute:'max(a, b) {
+                    if (a > b) return a;
+                    else return b;
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:20
+
+    "
+     self run:#testIf03
+     self new testIf03
+    "
+!
+
+testLiteralReturn01
+    self 
+        execute:'function f() { return (0); }'
+        for:nil
+        arguments:#()
+        expect:0
+
+    "
+     self run:#testLiteralReturn01
+     self new testLiteralReturn01
+    "
+!
+
+testLiteralReturn02
+    self 
+        execute:'function f() { return (0.0); }'
+        for:nil
+        arguments:#()
+        expect:0.0
+
+    "
+     self run:#testLiteralReturn02
+     self new testLiteralReturn02
+    "
+!
+
+testLiteralReturn03
+    self 
+        execute:'function f() { return ("foo"); }'
+        for:nil
+        arguments:#()
+        expect:'foo'
+
+    "
+     self run:#testLiteralReturn03
+     self new testLiteralReturn03
+    "
+!
+
+testLiteralReturn04
+    self 
+        execute:'function f() { return (true); }'
+        for:nil
+        arguments:#()
+        expect:true
+
+    "
+     self run:#testLiteralReturn04
+     self new testLiteralReturn04
+    "
+!
+
+testLiteralReturn05
+    self 
+        execute:'function f() { return (false); }'
+        for:nil
+        arguments:#()
+        expect:false
+
+    "
+     self run:#testLiteralReturn05
+     self new testLiteralReturn05
+    "
+!
+
+testLiteralReturn06
+    self 
+        execute:'function f() { return (null); }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testLiteralReturn06
+     self new testLiteralReturn06
+    "
+!
+
+testLiteralReturn07
+    self 
+        execute:'function f() { return (nil); }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testLiteralReturn07
+     self new testLiteralReturn07
+    "
+!
+
+testLiteralReturn08
+    self 
+        execute:'function f() { return ("hello"); }'
+        for:nil
+        arguments:#()
+        expect:'hello'
+
+    "
+     self run:#testLiteralReturn08
+     self new testLiteralReturn08
+    "
+!
+
+testNew01
+    self 
+        execute:'test() {
+                    var a;
+
+                    a = Array.new(5);
+                    return a;
+                 }'
+        for:nil
+        arguments:#()
+        expect:#(nil nil nil nil nil).
+
+    "
+     self run:#testNew01
+     self new testNew01  
+    "
+!
+
+testNew02
+    self 
+        execute:'test() {
+                    var a;
+
+                    a = new Array(5);
+                    return a;
+                 }'
+        for:nil
+        arguments:#()
+        expect:#(nil nil nil nil nil).
+
+    "
+     self run:#testNew02
+     self new testNew02  
+    "
+!
+
+testNew03
+    self 
+        execute:'test() {
+                    var days;
+
+                    days = new Array(7);
+                    days[1] = "Monday";
+                    days[2] = "Tuesday";
+                    days[3] = "Wednesday";
+                    days[4] = "Thursday";
+                    days[5] = "Friday";
+                    days[6] = "Saturday";
+                    days[7] = "Sunday";
+
+                    return days;
+                 }'
+        for:nil
+        arguments:#()
+        expect:#('Monday' 'Tuesday' 'Wednesday' 'Thursday' 'Friday' 'Saturday' 'Sunday')
+
+    "
+     self run:#testNew03
+     self new testNew03  
+    "
+!
+
+testNew04
+    self 
+        execute:'test() {
+                    var days;
+
+                    days = new Array(7,2);
+                    days[1,1] = "Monday";
+                    days[2,1] = "Tuesday";
+                    days[3,1] = "Wednesday";
+                    days[4,1] = "Thursday";
+                    days[5,1] = "Friday";
+                    days[6,1] = "Saturday";
+                    days[7,1] = "Sunday";
+
+                    return days;
+                 }'
+        for:nil
+        arguments:#()
+        expect:#('Monday' 'Tuesday' 'Wednesday' 'Thursday' 'Friday' 'Saturday' 'Sunday')
+
+    "
+     self run:#testNew04
+     self new testNew04  
+    "
+!
+
+testOperators01
+    self 
+        execute:'expr(a, b) {
+                    return (a + 0);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:10
+
+    "
+     self run:#testOperators01
+     self new testOperators01
+    "
+!
+
+testOperators02
+    self 
+        execute:'expr(a, b) {
+                    return (a + 1);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:11
+
+    "
+     self run:#testOperators02
+     self new testOperators02
+    "
+!
+
+testOperators03
+    self 
+        execute:'expr(a, b) {
+                    return (a - 1);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:9
+
+    "
+     self run:#testOperators03
+     self new testOperators03
+    "
+!
+
+testOperators04
+    self 
+        execute:'expr(a, b) {
+                    return (a + a);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:20
+
+    "
+     self run:#testOperators04
+     self new testOperators04
+    "
+!
+
+testOperators05
+    self 
+        execute:'expr(a, b) {
+                    return (a * 0);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:0
+
+    "
+     self run:#testOperators05
+     self new testOperators05
+    "
+!
+
+testOperators06
+    self 
+        execute:'expr(a, b) {
+                    return (a * 1);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:10
+
+    "
+     self run:#testOperators06
+     self new testOperators06
+    "
+!
+
+testOperators07
+    self 
+        execute:'expr(a, b) {
+                    return (a * -1);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:-10
+
+    "
+     self run:#testOperators07
+     self new testOperators07
+    "
+!
+
+testOperators08
+    self 
+        execute:'expr(a, b) {
+                    return (a * 10);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:100
+
+    "
+     self run:#testOperators08
+     self new testOperators08
+    "
+!
+
+testOperators09
+    self 
+        execute:'expr(a, b) {
+                    return (a * a);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:100
+
+    "
+     self run:#testOperators09
+     self new testOperators09
+    "
+!
+
+testOperators10
+    self 
+        execute:'expr(a, b) {
+                    return (a * b);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:200
+
+    "
+     self run:#testOperators10
+     self new testOperators10
+    "
+!
+
+testOperators11
+    self 
+        execute:'expr(a, b) {
+                    return (a - b);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:-10
+
+    "
+     self run:#testOperators11
+     self new testOperators11
+    "
+!
+
+testOperators12
+    self 
+        execute:'expr(a) {
+                    return (-a);
+                 }'
+        for:nil
+        arguments:#(10)
+        expect:-10
+
+    "
+     self run:#testOperators12
+     self new testOperators12
+    "
+!
+
+testOperators13
+    self 
+        execute:'expr(a, b) {
+                    return (a - -b);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:30
+
+    "
+     self run:#testOperators13
+     self new testOperators13
+    "
+!
+
+testOperators14
+    self 
+        execute:'expr(a, b) {
+                    return (a * -b);
+                 }'
+        for:nil
+        arguments:#(10 1)
+        expect:-10
+
+    "
+     self run:#testOperators14
+     self new testOperators14
+    "
+!
+
+testOperators15
+    self 
+        execute:'expr(a, b) {
+                    return (a / 1.0);
+                 }'
+        for:nil
+        arguments:#(10 1)
+        expect:10.0
+
+    "
+     self run:#testOperators15
+     self new testOperators15
+    "
+!
+
+testOperators16a
+    self 
+        execute:'expr(a, b) {
+                    return (a++);
+                 }'
+        for:nil
+        arguments:#(10 1)
+        expectError:#ParseError
+
+    "
+     self run:#testOperators16a
+     self new testOperators16a
+    "
+!
+
+testOperators16b
+    self 
+        execute:'expr(a, b) {
+                    var aa = a;
+
+                    return (aa++);
+                 }'
+        for:nil
+        arguments:#(10 1)
+        expect:10
+
+    "
+     self run:#testOperators16b
+     self new testOperators16b
+    "
+!
+
+testOperators17a
+    self 
+        execute:'expr(a, b) {
+                    return (a == b);
+                 }'
+        for:nil
+        arguments:#(10 10)
+        expect:true
+
+    "
+     self run:#testOperators17a
+     self new testOperators17a
+    "
+!
+
+testOperators17b
+    self 
+        execute:'expr(a, b) {
+                    return (a == b);
+                 }'
+        for:nil
+        arguments:#(10 11)
+        expect:false
+
+    "
+     self run:#testOperators17b
+     self new testOperators17b
+    "
+!
+
+testOperators17c
+    self 
+        execute:'expr(a, b) {
+                    return (a !!= b);
+                 }'
+        for:nil
+        arguments:#(10 10)
+        expect:false
+
+    "
+     self run:#testOperators17c
+     self new testOperators17c
+    "
+!
+
+testOperators17d
+    self 
+        execute:'expr(a, b) {
+                    return (a !!= b);
+                 }'
+        for:nil
+        arguments:#(10 11)
+        expect:true
+
+    "
+     self run:#testOperators17d
+     self new testOperators17d
+    "
+!
+
+testOperators18a
+    self 
+        execute:'expr(a, b) {
+                    return (a == b);
+                 }'
+        for:nil
+        arguments:#(10 10.0)
+        expect:true
+
+    "
+     self run:#testOperators18a
+     self new testOperators18a
+    "
+!
+
+testOperators18b
+    self 
+        execute:'expr(a, b) {
+                    return (a !!= b);
+                 }'
+        for:nil
+        arguments:#(10 11.0)
+        expect:true
+
+    "
+     self run:#testOperators19a
+     self new testOperators19a
+    "
+!
+
+testOperators19a
+    self 
+        execute:'expr(a, b) {
+                    return (a === b);
+                 }'
+        for:nil
+        arguments:#(10 10)
+        expect:true
+
+    "
+     self run:#testOperators19a
+     self new testOperators19a
+    "
+!
+
+testOperators19b
+    self 
+        execute:'expr(a, b) {
+                    return (a === b);
+                 }'
+        for:nil
+        arguments:#(10 10.0)
+        expect:false
+
+    "
+     self run:#testOperators19b
+     self new testOperators19b
+    "
+!
+
+testOperators19c
+    self 
+        execute:'expr(a, b) {
+                    return (a !!== b);
+                 }'
+        for:nil
+        arguments:#(10 10)
+        expect:false
+
+    "
+     self run:#testOperators19c
+     self new testOperators19c
+    "
+!
+
+testOperators19d
+    self 
+        execute:'expr(a, b) {
+                    return (a !!== b);
+                 }'
+        for:nil
+        arguments:#(10 10.0)
+        expect:true
+
+    "
+     self run:#testOperators19d
+     self new testOperators19d
+    "
+!
+
+testOperators20a
+    self 
+        execute:'expr(a, b) {
+                    return (a == b);
+                 }'
+        for:nil
+        arguments:#('foo' 'foo')
+        expect:true
+
+    "
+     self run:#testOperators20a
+     self new testOperators20a
+    "
+!
+
+testOperators20b
+    self 
+        execute:'expr(a, b) {
+                    return (a == b);
+                 }'
+        for:nil
+        arguments:#('foo' 'Foo')
+        expect:false
+
+    "
+     self run:#testOperators20b
+     self new testOperators20b
+    "
+!
+
+testOperators20c
+    self 
+        execute:'expr(a, b) {
+                    return (a !!= b);
+                 }'
+        for:nil
+        arguments:#('foo' 'Foo')
+        expect:true
+
+    "
+     self run:#testOperators20c
+     self new testOperators20c
+    "
+!
+
+testOperators20d
+    self 
+        execute:'expr(a, b) {
+                    return (a !!= b);
+                 }'
+        for:nil
+        arguments:#('foo' 'foo')
+        expect:false
+
+    "
+     self run:#testOperators20d
+     self new testOperators20d
+    "
+!
+
+testOperators21a
+    self 
+        execute:'expr(a) {
+                    return (a !!= 0);
+                 }'
+        for:nil
+        arguments:#('foo')
+        expect:true
+
+    "
+     self run:#testOperators21a
+     self new testOperators21a
+    "
+!
+
+testOperators21b
+    self 
+        execute:'expr(a) {
+                    return (a !!= 0);
+                 }'
+        for:nil
+        arguments:#(0)
+        expect:false
+
+    "
+     self run:#testOperators21b
+     self new testOperators21b
+    "
+!
+
+testOperators22a
+    self 
+        execute:'expr(a) {
+                    return (a > 0);
+                 }'
+        for:nil
+        arguments:#(0)
+        expect:false
+
+    "
+     self run:#testOperators22a
+     self new testOperators22a
+    "
+!
+
+testOperators22b
+    self 
+        execute:'expr(a) {
+                    return (a > 0);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:true
+
+    "
+     self run:#testOperators22b
+     self new testOperators22b
+    "
+!
+
+testOperators23
+    self 
+        execute:'expr(a) {
+                    return (-a);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:-1
+
+    "
+     self run:#testOperators23
+     self new testOperators23
+    "
+!
+
+testOperators24a
+    self 
+        execute:'expr(a) {
+                    return (a / 4);
+                 }'
+        for:nil
+        arguments:#(4)
+        expect:1
+
+    "
+     self run:#testOperators24a
+     self new testOperators24a
+    "
+!
+
+testOperators24b
+    self 
+        execute:'expr(a) {
+                    return (a / 4.0);
+                 }'
+        for:nil
+        arguments:#(4)
+        expect:1.0
+
+    "
+     self run:#testOperators24b
+     self new testOperators24b
+    "
+!
+
+testOperators24c
+    self 
+        execute:'expr(a) {
+                    return (a / 4);
+                 }'
+        for:nil
+        arguments:#(4.0)
+        expect:1.0
+
+    "
+     self run:#testOperators24c
+     self new testOperators24c
+    "
+!
+
+testOperators24d
+    self 
+        execute:'expr(a) {
+                    return (a / 4.0);
+                 }'
+        for:nil
+        arguments:#(4.0)
+        expect:1.0
+
+    "
+     self run:#testOperators24d
+     self new testOperators24d
+    "
+!
+
+testOperators25a
+    self 
+        execute:'expr(a) {
+                    return (a % 4);
+                 }'
+        for:nil
+        arguments:#(4)
+        expect:0
+
+    "
+     self run:#testOperators25a
+     self new testOperators25a
+    "
+!
+
+testOperators25b
+    self 
+        execute:'expr(a) {
+                    return (a % 4.0);
+                 }'
+        for:nil
+        arguments:#(4)
+        expect:0.0
+
+    "
+     self run:#testOperators25b
+     self new testOperators25b
+    "
+!
+
+testOperators25c
+    self 
+        execute:'expr(a) {
+                    return (a % 4);
+                 }'
+        for:nil
+        arguments:#(4.0)
+        expect:0.0
+
+    "
+     self run:#testOperators25c
+     self new testOperators25c
+    "
+!
+
+testOperators25d
+    self 
+        execute:'expr(a) {
+                    return (a % 4.0);
+                 }'
+        for:nil
+        arguments:#(4.0)
+        expect:0.0
+
+    "
+     self run:#testOperators25d
+     self new testOperators25d
+    "
+!
+
+testOperators25e
+    self 
+        execute:'expr(a) {
+                    return (a % 4);
+                 }'
+        for:nil
+        arguments:#(-4)
+        expect:0
+
+    "
+     self run:#testOperators25e
+     self new testOperators25e
+    "
+!
+
+testOperators25f
+    self 
+        execute:'expr(a) {
+                    return (a % 4.0);
+                 }'
+        for:nil
+        arguments:#(-4)
+        expect:0.0
+
+    "
+     self run:#testOperators25f
+     self new testOperators25f
+    "
+!
+
+testOperators25g
+    self 
+        execute:'expr(a) {
+                    return (a % 4);
+                 }'
+        for:nil
+        arguments:#(-4.0)
+        expect:0.0
+
+    "
+     self run:#testOperators25g
+     self new testOperators25g
+    "
+!
+
+testOperators25h
+    self 
+        execute:'expr(a) {
+                    return (a % 4.0);
+                 }'
+        for:nil
+        arguments:#(-4.0)
+        expect:0.0
+
+    "
+     self run:#testOperators25h
+     self new testOperators25h
+    "
+!
+
+testOperators26a
+    self 
+        execute:'expr(a) {
+                    var x = a;
+
+                    return (x++);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:1
+
+    "
+     self run:#testOperators26a
+     self new testOperators26a
+    "
+!
+
+testOperators26b
+    self 
+        execute:'expr(a) {
+                    var x = a;
+
+                    return (x--);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:1
+
+    "
+     self run:#testOperators26b
+     self new testOperators26b
+    "
+!
+
+testOperators26c
+    self 
+        execute:'expr(a) {
+                    var x = a;
+
+                    return (++x);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:2
+
+    "
+     self run:#testOperators26c
+     self new testOperators26c
+    "
+!
+
+testOperators26d
+    self 
+        execute:'expr(a) {
+                    var x = a;
+
+                    return (--x);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:0
+
+    "
+     self run:#testOperators26d
+     self new testOperators26d
+    "
+!
+
+testOperators27a
+    self 
+        execute:'expr(a) {
+                    var x = a;
+
+                    x++;
+                    return (x);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:2
+
+    "
+     self run:#testOperators27a
+     self new testOperators27a
+    "
+!
+
+testOperators27b
+    self 
+        execute:'expr(a) {
+                    var x = a;
+
+                    x--;
+                    return (x);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:0
+
+    "
+     self run:#testOperators27b
+     self new testOperators27b
+    "
+!
+
+testOperators27c
+    self 
+        execute:'expr(a) {
+                    var x = a;
+
+                    ++x;
+                    return (x);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:2
+
+    "
+     self run:#testOperators27c
+     self new testOperators27c
+    "
+!
+
+testOperators27d
+    self 
+        execute:'expr(a) {
+                    var x = a;
+
+                    --x;
+                    return (x);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:0
+
+    "
+     self run:#testOperators27d
+     self new testOperators27d
+    "
+!
+
+testOperators28
+    self 
+        execute:'expr(a) {
+                    return (!! a);
+                 }'
+        for:nil
+        arguments:#(true)
+        expect:false
+
+    "
+     self run:#testOperators28
+     self new testOperators28
+    "
+!
+
+testOperators29
+    self 
+        execute:'expr(a, b, c, d) {
+                    var s = 0;
+                    s += a;
+                    s += b;
+                    s += c;
+                    s += d;
+                    return (s);
+                 }'
+        for:nil
+        arguments:#(1 2 3 4)
+        expect:10
+
+    "
+     self run:#testOperators29
+     self new testOperators29
+    "
+!
+
+testOperators30
+    self 
+        execute:'expr(a, b, c, d) {
+                    var s = 1;
+                    s *= a;
+                    s *= b;
+                    s *= c;
+                    s *= d;
+                    return (s);
+                 }'
+        for:nil
+        arguments:#(1 2 3 4)
+        expect:24
+
+    "
+     self run:#testOperators30
+     self new testOperators30
+    "
+!
+
+testOperators31a
+    self 
+        execute:'expr(a) {
+                    return (a << 1);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:2
+
+    "
+     self run:#testOperators31a
+     self new testOperators31a
+    "
+!
+
+testOperators31b
+    self 
+        execute:'expr(a) {
+                    return (a << 32);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:16r100000000
+
+    "
+     self run:#testOperators31b
+     self new testOperators31b
+    "
+!
+
+testOperators32a
+    self 
+        execute:'expr(a) {
+                    return (a >> 1);
+                 }'
+        for:nil
+        arguments:#(2)
+        expect:1
+
+    "
+     self run:#testOperators32a
+     self new testOperators32a
+    "
+!
+
+testOperators33
+    self 
+        execute:'expr(a, b) {
+                    var s = 0;
+                    s |= a;
+                    s |= b;
+                    return (s);
+                 }'
+        for:nil
+        arguments:#(1 4)
+        expect:5
+
+    "
+     self run:#testOperators33
+     self new testOperators33
+    "
+!
+
+testOperators34
+    self 
+        execute:'expr(a, b) {
+                    var s = 0xFFFF;
+                    s &= a;
+                    s &= b;
+                    return (s);
+                 }'
+        for:nil
+        arguments:#(3 5)
+        expect:1
+
+    "
+     self run:#testOperators34
+     self new testOperators34
+    "
+!
+
+testOperators35a
+    self 
+        execute:'expr(a) {
+                    var s = 0xFFFF;
+                    s ^= a;
+                    return (s);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:16rFFFE
+
+    "
+     self run:#testOperators35a
+     self new testOperators35a
+    "
+!
+
+testOperators35b
+    self 
+        execute:'expr(a) {
+                    var s = 0xFFFF;
+                    s = s ^ a;
+                    return (s);
+                 }'
+        for:nil
+        arguments:#(1)
+        expect:16rFFFE
+
+    "
+     self run:#testOperators35b
+     self new testOperators35b
+    "
+!
+
+testPrecidences01
+    self 
+        execute:'expr(a, b) {
+                    return (a + 4 * 5 + b);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:(10 + (4 * 5) + 20)
+
+    "
+     self run:#testPrecidences01
+     self new testPrecidences01
+    "
+!
+
+testPrecidences02
+    self 
+        execute:'expr(a, b) {
+                    return (a * 4 + b * 5);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:140
+
+    "
+     self run:#testPrecidences02
+     self new testPrecidences02
+    "
+!
+
+testPrecidences03
+    self 
+        execute:'expr(a, b) {
+                    return -(a + b);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:-30
+
+    "
+     self run:#testPrecidences03
+     self new testPrecidences03
+    "
+!
+
+testPrecidences04
+    self 
+        execute:'expr(a, b) {
+                    return -a + b;
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:10
+
+    "
+     self run:#testPrecidences04
+     self new testPrecidences04
+    "
+!
+
+testPrecidences05
+    self 
+        execute:'expr(a, b) {
+                    return -a + -b;
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:-30
+
+    "
+     self run:#testPrecidences05
+     self new testPrecidences05
+    "
+!
+
+testRecursion01
+    self 
+        execute:'test(n) {
+                     function factorial(n) {
+                        if (n > 0) {
+                            return n * factorial(n-1);
+                        } else {
+                            return 1;
+                        }
+                     };
+
+                     return factorial(n);
+                 }'
+        for:nil
+        arguments:#(10)
+        expect:(10 factorial)
+
+    "
+     self run:#testRecursion01
+     self new testRecursion01
+    "
+
+    "Modified: / 20-04-2005 / 11:55:30 / cg"
+!
+
+testScanner01
+    self 
+        execute:'f() { }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testScanner01
+     self new testScanner01
+    "
+!
+
+testScanner02
+    self 
+        execute:'f(a) { }'
+        for:nil
+        arguments:#(1)
+        expect:nil
+
+    "
+     self run:#testScanner02
+     self new testScanner02
+    "
+!
+
+testScanner03
+    self 
+        execute:'f(a, b) { }'
+        for:nil
+        arguments:#(1 2)
+        expect:nil
+
+    "
+     self run:#testScanner03
+     self new testScanner03
+    "
+!
+
+testScanner04
+    self 
+        execute:'f(a, b) { return (null); }'
+        for:nil
+        arguments:#(1 2)
+        expect:nil
+
+    "
+     self run:#testScanner04
+     self new testScanner04
+    "
+!
+
+testScanner05
+    self 
+        execute:'f(a, b) { return (null); }'
+        for:nil
+        arguments:#(1)
+        expectError:(Method wongNumberOfArgumentsSignal)
+
+    "
+     self run:#testScanner05
+     self new testScanner05
+    "
+
+    "Modified: / 20-04-2005 / 11:53:20 / cg"
+!
+
+testScanner06
+    self 
+        execute:'f() { /* a comment */ return (null); }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testScanner06
+     self new testScanner06
+    "
+!
+
+testScanner07
+    self 
+        execute:'f() { // an EOL comment
+ return (null); }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testScanner07
+     self new testScanner07
+    "
+!
+
+testScanner08
+    self 
+        execute:'f() { // a comment in an /* an EOL comment
+ return (null); }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testScanner08
+     self new testScanner08
+    "
+!
+
+testScanner09
+    self 
+        execute:'f() { // a comment in an /* an EOL */ comment
+ return (null); }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testScanner09
+     self new testScanner09
+    "
+!
+
+testScanner10
+    self 
+        execute:'f() { /** a comment */ 
+ return (null); }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testScanner10
+     self new testScanner10
+    "
+!
+
+testScanner11
+    self 
+        execute:'f() { /**/ 
+ return (null); }'
+        for:nil
+        arguments:#()
+        expect:nil
+
+    "
+     self run:#testScanner11
+     self new testScanner11
+    "
+!
+
+testScanner12
+    self 
+        execute:'f() { /*/ 
+ return (null); }'
+        for:nil
+        arguments:#()
+        expectError:#ParseError
+
+    "
+     self run:#testScanner12
+     self new testScanner12
+    "
+!
+
+testScanner13
+    self 
+        execute:'f_1() { /*/ 
+ return (null); }'
+        for:nil
+        arguments:#()
+        expectError:#ParseError
+
+    "
+     self run:#testScanner13
+     self new testScanner13
+    "
+!
+
+testString01
+    self 
+        execute:'test(str) {
+                    return "foo".size;
+                 }'
+        for:nil
+        arguments:#( nil )
+        expect:3
+
+    "
+     self run:#testString01
+     self new testString01  
+    "
+!
+
+testString02
+    self 
+        execute:'test(str) {
+                    return str.size();
+                 }'
+        for:nil
+        arguments:#( 'hello' )
+        expect:5
+
+    "
+     self run:#testString02
+     self new testString02  
+    "
+!
+
+testString03
+    self 
+        execute:'test(str) {
+                    return str.size;
+                 }'
+        for:nil
+        arguments:#( 'hello' )
+        expect:5
+
+    "
+     self run:#testString03
+     self new testString03  
+    "
+!
+
+testVarDeclaration01
+    self 
+        execute:'expr(a, b) {
+                    var x = 10;
+
+                    return x;
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:10
+
+    "
+     self run:#testVarDeclaration01
+     self new testVarDeclaration01
+    "
+!
+
+testVarDeclaration02
+    self 
+        execute:'expr(a, b) {
+                    var x = 10;
+
+                    return (a + x);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:20
+
+    "
+     self run:#testVarDeclaration02
+     self new testVarDeclaration02
+    "
+!
+
+testVarDeclaration03
+    self 
+        execute:'expr(a, b) {
+                    var x = 10;
+                    var y = x+10;
+
+                    return (y);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expect:20
+
+    "
+     self run:#testVarDeclaration03
+     self new testVarDeclaration03
+    "
+!
+
+testVarDeclaration04
+    self 
+        execute:'expr(a, b) {
+                    var y = x+10;
+                    var x = 10;
+
+                    return (y);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expectError:#ParseError
+
+    "
+     self run:#testVarDeclaration04
+     self new testVarDeclaration04
+    "
+!
+
+testVarDeclaration05
+    "our JS only allows variables declarations at a blocks top"
+
+    self 
+        execute:'expr(a, b) {
+                    var y = 10;
+
+                    y = y + 10;
+
+                    var x = 10;
+
+                    return (y);
+                 }'
+        for:nil
+        arguments:#(10 20)
+        expectError:#ParseError
+
+    "
+     self run:#testVarDeclaration05
+     self new testVarDeclaration05
+    "
+!
+
+testVarDeclaration06
+
+    self 
+        execute:'expr(x) {
+                    var y = x + 20;
+
+                    return (y);
+                 }'
+        for:nil
+        arguments:#(10)
+        expect:30
+
+    "
+     self run:#testVarDeclaration06
+     self new testVarDeclaration06
+    "
+!
+
+testVarDeclaration07
+
+    self 
+        execute:'expr(x) {
+                    var x = x + 20;
+
+                    return (x);
+                 }'
+        for:nil
+        arguments:#(10)
+        expectError:Error
+
+    "
+     self run:#testVarDeclaration07
+     self new testVarDeclaration07
+    "
+!
+
+testWhile01
+    self 
+        execute:'test(arg) {
+                    var n;
+
+                    n = arg;
+                    while (n > 0) {
+                        n--;
+                        Transcript.showCR("hello");
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testWhile01
+     self new testWhile01  
+    "
+!
+
+testWhile02
+    self 
+        execute:'test(arg) {
+                    var n;
+
+                    n = 1;
+                    while (n <= arg) {
+                        n++;
+                        Transcript.showCR("hello");
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testWhile02
+     self new testWhile02
+    "
+!
+
+testWhile03
+    self 
+        execute:'test(arg) {
+                    var n;
+
+                    n = 1;
+                    while (n <= arg) {
+                        Transcript.showCR(n++);
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testWhile03
+     self new testWhile03
+    "
+!
+
+testWhile04
+    self 
+        execute:'test(arg) {
+                    var n;
+
+                    n = 1;
+                    while (n++ <= arg) {
+                        Transcript.showCR(n);
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testWhile04
+     self new testWhile04
+    "
+!
+
+testWhile04b
+    self 
+        execute:'test(arg) {
+                    var n;
+
+                    n = 1;
+                    while (n++ <= arg) {
+                        Transcript.showCR(n);
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testWhile04b
+     self new testWhile04b
+    "
+!
+
+testWhile05
+    self 
+        execute:'test(arg) {
+                    var n;
+
+                    n = 1;
+                    while (n++ <= arg) {
+                        if (n == 3) continue;
+                        Transcript.showCR(n);
+                    }
+                 }'
+        for:nil
+        arguments:#(5)
+        expect:nil
+
+    "
+     self run:#testWhile05
+     self new testWhile05
+    "
+!
+
 test_01_parse_literals
     |spec|
 
@@ -103,7 +2372,13 @@
                         ('true'                 nil              true)
                         ('false'                nil              false)
 
+                        ('"aString"'            #isString        'aString' )
+                        ('''anotherString'''    #isString        'anotherString' )
+                        ('''anoth"er"String'''  #isString        'anoth"er"String' )
+                        ('"anoth''er''String"'  #isString        'anoth''er''String' )
                         ('"hello"'              #isString        'hello' )
+                        ('"\b"'                 #isString        (#eval 'Character backspace asString') )
+                        ('"\f"'                 #isString        (#eval 'Character ff asString') )
                         ('"\t"'                 #isString        (#eval 'Character tab asString') )
                         ('"\r"'                 #isString        (#eval 'Character return asString') )
                         ('"\n"'                 #isString        (#eval 'Character nl asString') )
@@ -142,20 +2417,42 @@
     "
 !
 
+test_03_parse_comments
+    |spec|
+
+    spec := #(
+                        ('// ignored
+                          1'                    #isInteger        1 )
+                        ('/* ignored */ 2'      #isInteger        2 )
+                        ('/* ign//ored */ 3'    #isInteger        3 )
+               ).
+
+    self doTestEachFromSpec:spec.
+
+    "
+     self run:#test_03_parse_comments
+     self new test_03_parse_comments
+    "
+!
+
 test_10_parse_expression1
     |spec|
 
-    spec := #( ('1+1'               nil                2 )
-             ('1-1'               nil                0 )
-             ('2*2'               nil                4 )
-             ('4/2'               nil                2 )
-             ('1>0'               nil                true )
-             ('1<0'               nil                false )
-             ('1<=0'              nil                false )
-             ('1>=0'              nil                true )
-             ('1==0'              nil                false )
-             ('1!!=0'              nil                true )
-             ('1!!=1'              nil                false )
+    spec := #( 
+             ('1+1'                     nil                2 )
+             ('1-1'                     nil                0 )
+             ('2*2'                     nil                4 )
+             ('1234567890*1234567890'   nil                1524157875019052100 )
+             ('4/2'                     nil                2 )
+             ('5%3'                     nil                2 )
+
+             ('1>0'                     nil                true )
+             ('1<0'                     nil                false )
+             ('1<=0'                    nil                false )
+             ('1>=0'                    nil                true )
+             ('1==0'                    nil                false )
+             ('1!!=0'                    nil                true )
+             ('1!!=1'                    nil                false )
            ).
     self doTestEachFromSpec:spec.
 
@@ -170,6 +2467,7 @@
 
     spec := #( 
                 ('1=0'               nil                ( #error ) )
+                ('"abc"[0]'          nil                ( #error ) ) 
                 ('"abc"[1]'          nil                $a ) 
              ).
     self doTestEachFromSpec:spec.