--- 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.