RegressionTests__JavaScriptTests.st
author Claus Gittinger <cg@exept.de>
Thu, 28 Apr 2005 15:35:15 +0200
changeset 278 a66b70f02f50
parent 277 67c2a092033d
child 281 2935b3c27b05
permissions -rw-r--r--
comma operator

"{ Package: 'exept:regression' }"

"{ NameSpace: RegressionTests }"

TestCase subclass:#JavaScriptTests
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'Languages-JavaScript-Compiling & Parsing'
!

!JavaScriptTests class methodsFor:'documentation'!

documentation
"
    documentation to be added.

    [author:]
        cg (cg@FUSI)

    [instance variables:]

    [class variables:]

    [see also:]

"
!

history
    "Created: / 12-04-2005 / 11:54:25 / cg"
! !

!JavaScriptTests methodsFor:'helpers'!

doTestEachFromSpec:spec 
    spec do:[:triple | 
        |str checkSelectorOrNil valExpected val expectError|

        str := triple first.
        checkSelectorOrNil := triple second.
        expectError := false.
        valExpected := triple third.
        valExpected isArray ifTrue:[
            valExpected size > 0 ifTrue:[
                valExpected first == #eval ifTrue:[
                    valExpected := Parser evaluate:valExpected second
                ] ifFalse:[
                    valExpected first == #error ifTrue:[
                        expectError := true
                    ].
                ].
            ].
        ].
        expectError ifTrue:[
            self 
                should:[ (JavaScriptParser parseExpression:str) evaluate ]
                raise:Error
        ] ifFalse:[
            val := (JavaScriptParser parseExpression:str) evaluate.
            checkSelectorOrNil notNil ifTrue:[
                self assert:(val perform:checkSelectorOrNil).
            ].
            self assert:(val = valExpected).
        ].
    ]
!

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  
    "
!

testArray04
    self 
        execute:'test() {
                    var arr = new Array;
                    return arr;
                 }'
        for:nil
        arguments:#(  )
        expect:#( )

    "
     self run:#testArray04
     self new testArray04  
    "
!

testArray05
    self 
        execute:'test() {
                    var arr = new Array();
                    return arr;
                 }'
        for:nil
        arguments:#(  )
        expect:#( )

    "
     self run:#testArray05
     self new testArray05 
    "
!

testArray06
    self 
        execute:'test() {
                    var arr = new Array(5);
                    return arr;
                 }'
        for:nil
        arguments:#(  )
        expect:#( nil nil nil nil nil )

    "
     self run:#testArray06
     self new testArray06 
    "
!

testArray07
    self 
        execute:'test() {
                    var arr = new Array(3);
                    arr[1] = 41;    
                    arr[2] = -5;    
                    arr[3] = 20;    
                    return arr;
                 }'
        for:nil
        arguments:#()
        expect:#( 41 -5 20 ).

    "
     self run:#testArray07
     self new testArray07 
    "
!

testArray08
    self 
        execute:'test() {
                    var arr = new Array(3);
                    arr[1] = 41;    
                    arr[2] = -5;    
                    arr[3] = 20;    
                    return arr;
                 }'
        for:nil
        arguments:#(  )
        expect:#( 41 -5 20 )

    "
     self run:#testArray08
     self new testArray08 
    "
!

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
    "
!

testDoWhile01
    self 
        execute:'test(arg) {
                    var n;

                    n = 1;
                    do {
                        Transcript.showCR(n);
                    } while (++n <= 3);
                    return n;
                 }'
        for:nil
        arguments:#(5)
        expect:4

    "
     self run:#testDoWhile01
     self new testDoWhile01
    "
!

testDoWhile02
    self 
        execute:'test(arg) {
                    var n;

                    n = 1;
                    do {
                        Transcript.showCR(n);
                        break;
                    } while (true);
                    return n;
                 }'
        for:nil
        arguments:#(5)
        expect:1

    "
     self run:#testDoWhile02
     self new testDoWhile02
    "
!

testDoWhile03
    self 
        execute:'test(arg) {
                    var n;

                    n = 1;
                    do {
                        break;
                        Transcript.showCR(n);
                    } while (true);
                    return n;
                 }'
        for:nil
        arguments:#(5)
        expect:1

    "
     self run:#testDoWhile03
     self new testDoWhile03
    "
!

testDoWhile04
    self 
        execute:'test(arg) {
                    var n;

                    n = 1;
                    do {
                        if (++n == 3) continue;
                        Transcript.showCR(n);
                    } while (n <= 4);
                    return n;
                 }'
        for:nil
        arguments:#(5)
        expect:5

    "
     self run:#testDoWhile04
     self new testDoWhile04
    "
!

testDoWhile05
    self 
        execute:'test(arg) {
                    var n;

                    n = 1;
                    do {
                        if (++n == 3) break;
                        Transcript.showCR(n);
                    } while (n <= 4);
                    return n;
                 }'
        for:nil
        arguments:#(5)
        expect:3

    "
     self run:#testDoWhile05
     self new testDoWhile05
    "
!

testDoWhile06
    self 
        execute:'test(arg) {
                    var n;

                    n = 1;
                    do 
                        n += 1;
                    while (n < 4);
                    return n;
                 }'
        for:nil
        arguments:#(5)
        expect:4

    "
     self run:#testDoWhile06
     self new testDoWhile06
    "
!

testException01
    self 
        execute:'test(arr) {
                    try {
                    } catch
                 }'
        for:nil
        arguments:#( #(10 20 30) )
        expect:10

    "
     self run:#testArray01
     self new testArray01  
    "
!

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_plus
    self 
        execute:'expr(a, b) {
                    return (a + 0);
                 }'
        for:nil
        arguments:#(10 20)
        expect:10

    "
     self run:#testOperators01_plus
     self new testOperators01_plus
    "
!

testOperators02_plus
    self 
        execute:'expr(a, b) {
                    return (a + 1);
                 }'
        for:nil
        arguments:#(10 20)
        expect:11

    "
     self run:#testOperators02_plus
     self new testOperators02_plus
    "
!

testOperators03_minus
    self 
        execute:'expr(a, b) {
                    return (a - 1);
                 }'
        for:nil
        arguments:#(10 20)
        expect:9

    "
     self run:#testOperators03_minus
     self new testOperators03_minus
    "
!

testOperators04_plus
    self 
        execute:'expr(a, b) {
                    return (a + a);
                 }'
        for:nil
        arguments:#(10 20)
        expect:20

    "
     self run:#testOperators04_plus
     self new testOperators04_plus
    "
!

testOperators05_mul
    self 
        execute:'expr(a, b) {
                    return (a * 0);
                 }'
        for:nil
        arguments:#(10 20)
        expect:0

    "
     self run:#testOperators05_mul
     self new testOperators05_mul
    "
!

testOperators06_mul
    self 
        execute:'expr(a, b) {
                    return (a * 1);
                 }'
        for:nil
        arguments:#(10 20)
        expect:10

    "
     self run:#testOperators06_mul
     self new testOperators06_mul
    "
!

testOperators07_mul
    self 
        execute:'expr(a, b) {
                    return (a * -1);
                 }'
        for:nil
        arguments:#(10 20)
        expect:-10

    "
     self run:#testOperators07_mul
     self new testOperators07_mul
    "
!

testOperators08_mul
    self 
        execute:'expr(a, b) {
                    return (a * 10);
                 }'
        for:nil
        arguments:#(10 20)
        expect:100

    "
     self run:#testOperators08_mul
     self new testOperators08_mul
    "
!

testOperators09_mul
    self 
        execute:'expr(a, b) {
                    return (a * a);
                 }'
        for:nil
        arguments:#(10 20)
        expect:100

    "
     self run:#testOperators09_mul
     self new testOperators09_mul
    "
!

testOperators10_mul
    self 
        execute:'expr(a, b) {
                    return (a * b);
                 }'
        for:nil
        arguments:#(10 20)
        expect:200

    "
     self run:#testOperators10_mul
     self new testOperators10_mul
    "
!

testOperators11_minus
    self 
        execute:'expr(a, b) {
                    return (a - b);
                 }'
        for:nil
        arguments:#(10 20)
        expect:-10

    "
     self run:#testOperators11_minus
     self new testOperators11_minus
    "
!

testOperators12_unaryMinus
    self 
        execute:'expr(a) {
                    return (-a);
                 }'
        for:nil
        arguments:#(10)
        expect:-10

    "
     self run:#testOperators12_unaryMinus
     self new testOperators12_unaryMinus
    "
!

testOperators13_minus
    self 
        execute:'expr(a, b) {
                    return (a - -b);
                 }'
        for:nil
        arguments:#(10 20)
        expect:30

    "
     self run:#testOperators13_minus
     self new testOperators13_minus
    "
!

testOperators14_unaryMinus
    self 
        execute:'expr(a, b) {
                    return (a * -b);
                 }'
        for:nil
        arguments:#(10 1)
        expect:-10

    "
     self run:#testOperators14_unaryMinus
     self new testOperators14_unaryMinus
    "
!

testOperators15_div
    self 
        execute:'expr(a, b) {
                    return (a / 1.0);
                 }'
        for:nil
        arguments:#(10 1)
        expect:10.0

    "
     self run:#testOperators15_div
     self new testOperators15_div
    "
!

testOperators16a_postInc
    self 
        execute:'expr(a, b) {
                    return (a++);
                 }'
        for:nil
        arguments:#(10 1)
        expectError:#ParseError

    "
     self run:#testOperators16a_postInc
     self new testOperators16a_postInc
    "
!

testOperators16b_postInc
    self 
        execute:'expr(a, b) {
                    var aa = a;

                    return (aa++);
                 }'
        for:nil
        arguments:#(10 1)
        expect:10

    "
     self run:#testOperators16b_postInc
     self new testOperators16b_postInc
    "
!

testOperators17a_eq
    self 
        execute:'expr(a, b) {
                    return (a == b);
                 }'
        for:nil
        arguments:#(10 10)
        expect:true

    "
     self run:#testOperators17a_eq
     self new testOperators17a_eq
    "
!

testOperators17b_eq
    self 
        execute:'expr(a, b) {
                    return (a == b);
                 }'
        for:nil
        arguments:#(10 11)
        expect:false

    "
     self run:#testOperators17b_eq
     self new testOperators17b_eq
    "
!

testOperators17c_ne
    self 
        execute:'expr(a, b) {
                    return (a !!= b);
                 }'
        for:nil
        arguments:#(10 10)
        expect:false

    "
     self run:#testOperators17c_ne
     self new testOperators17c_ne
    "
!

testOperators17d_ne
    self 
        execute:'expr(a, b) {
                    return (a !!= b);
                 }'
        for:nil
        arguments:#(10 11)
        expect:true

    "
     self run:#testOperators17d_ne
     self new testOperators17d_ne
    "
!

testOperators18a_eq
    self 
        execute:'expr(a, b) {
                    return (a == b);
                 }'
        for:nil
        arguments:#(10 10.0)
        expect:true

    "
     self run:#testOperators18a_eq
     self new testOperators18a_eq
    "
!

testOperators18b_ne
    self 
        execute:'expr(a, b) {
                    return (a !!= b);
                 }'
        for:nil
        arguments:#(10 11.0)
        expect:true

    "
     self run:#testOperators18b_ne
     self new testOperators18b_ne
    "
!

testOperators19a_identical
    self 
        execute:'expr(a, b) {
                    return (a === b);
                 }'
        for:nil
        arguments:#(10 10)
        expect:true

    "
     self run:#testOperators19a_identical
     self new testOperators19a_identical
    "
!

testOperators19b_identical
    self 
        execute:'expr(a, b) {
                    return (a === b);
                 }'
        for:nil
        arguments:#( 10 10.0 )
        expect:false

    "
     self run:#testOperators19b_identical
     self new testOperators19b_identical
    "
!

testOperators19c_notIdentical
    self 
        execute:'expr(a, b) {
                    return (a !!== b);
                 }'
        for:nil
        arguments:#( 10 10 )
        expect:false

    "
     self run:#testOperators19c_notIdentical
     self new testOperators19c_notIdentical
    "
!

testOperators19d_notIdentical
    self 
        execute:'expr(a, b) {
                    return (a !!== b);
                 }'
        for:nil
        arguments:#( 10 10.0 )
        expect:true

    "
     self run:#testOperators19d_notIdentical
     self new testOperators19d_notIdentical
    "
!

testOperators20a_eq
    self 
        execute:'expr(a, b) {
                    return (a == b);
                 }'
        for:nil
        arguments:#( 'foo' 'foo' )
        expect:true

    "
     self run:#testOperators20a_eq
     self new testOperators20a_eq
    "
!

testOperators20b_eq
    self 
        execute:'expr(a, b) {
                    return (a == b);
                 }'
        for:nil
        arguments:#( 'foo' 'Foo' )
        expect:false

    "
     self run:#testOperators20b_eq
     self new testOperators20b_eq
    "
!

testOperators20c_ne
    self 
        execute:'expr(a, b) {
                    return (a !!= b);
                 }'
        for:nil
        arguments:#( 'foo' 'Foo' )
        expect:true

    "
     self run:#testOperators20c_ne
     self new testOperators20c_ne
    "
!

testOperators20d_ne
    self 
        execute:'expr(a, b) {
                    return (a !!= b);
                 }'
        for:nil
        arguments:#( 'foo' 'foo' )
        expect:false

    "
     self run:#testOperators20d_ne
     self new testOperators20d_ne
    "
!

testOperators21a_ne
    self 
        execute:'expr(a) {
                    return (a !!= 0);
                 }'
        for:nil
        arguments:#('foo')
        expect:true

    "
     self run:#testOperators21a_ne
     self new testOperators21a_ne
    "
!

testOperators21b_ne
    self 
        execute:'expr(a) {
                    return (a !!= 0);
                 }'
        for:nil
        arguments:#(0)
        expect:false

    "
     self run:#testOperators21b_ne
     self new testOperators21b_ne
    "
!

testOperators22a_gt
    self 
        execute:'expr(a) {
                    return (a > 0);
                 }'
        for:nil
        arguments:#(0)
        expect:false

    "
     self run:#testOperators22a_gt
     self new testOperators22a_gt
    "
!

testOperators22b_gt
    self 
        execute:'expr(a) {
                    return (a > 0);
                 }'
        for:nil
        arguments:#(1)
        expect:true

    "
     self run:#testOperators22b_gt
     self new testOperators22b_gt
    "
!

testOperators23a_unaryMinus
    self 
        execute:'expr(a) {
                    return (-a);
                 }'
        for:nil
        arguments:#(1)
        expect:-1

    "
     self run:#testOperators23a_unaryMinus
     self new testOperators23a_unaryMinus
    "
!

testOperators23b_unaryMinus
    self 
        execute:'expr(a) {
                    return (0 - -a);
                 }'
        for:nil
        arguments:#(1)
        expect:1

    "
     self run:#testOperators23b_unaryMinus
     self new testOperators23b_unaryMinus
    "
!

testOperators24a_div
    self 
        execute:'expr(a) {
                    return (a / 4);
                 }'
        for:nil
        arguments:#(4)
        expect:1

    "
     self run:#testOperators24a_div
     self new testOperators24a_div
    "
!

testOperators24b_div
    self 
        execute:'expr(a) {
                    return (a / 4.0);
                 }'
        for:nil
        arguments:#(4)
        expect:1.0

    "
     self run:#testOperators24b_div
     self new testOperators24b_div
    "
!

testOperators24c_div
    self 
        execute:'expr(a) {
                    return (a / 4);
                 }'
        for:nil
        arguments:#(4.0)
        expect:1.0

    "
     self run:#testOperators24c_div
     self new testOperators24c_div
    "
!

testOperators24d_div
    self 
        execute:'expr(a) {
                    return (a / 4.0);
                 }'
        for:nil
        arguments:#(4.0)
        expect:1.0

    "
     self run:#testOperators24d_div
     self new testOperators24d_div
    "
!

testOperators25a_mod
    self 
        execute:'expr(a) {
                    return (a % 4);
                 }'
        for:nil
        arguments:#(4)
        expect:0

    "
     self run:#testOperators25a_mod
     self new testOperators25a_mod
    "
!

testOperators25b_mod
    self 
        execute:'expr(a) {
                    return (a % 4.0);
                 }'
        for:nil
        arguments:#(4)
        expect:0.0

    "
     self run:#testOperators25b_mod
     self new testOperators25b_mod
    "
!

testOperators25c_mod
    self 
        execute:'expr(a) {
                    return (a % 4);
                 }'
        for:nil
        arguments:#(4.0)
        expect:0.0

    "
     self run:#testOperators25c_mod
     self new testOperators25c_mod
    "
!

testOperators25d_mod
    self 
        execute:'expr(a) {
                    return (a % 4.0);
                 }'
        for:nil
        arguments:#(4.0)
        expect:0.0

    "
     self run:#testOperators25d_mod
     self new testOperators25d_mod
    "
!

testOperators25e_mod
    self 
        execute:'expr(a) {
                    return (a % 4);
                 }'
        for:nil
        arguments:#(-4)
        expect:0

    "
     self run:#testOperators25e_mod
     self new testOperators25e_mod
    "
!

testOperators25f_mod
    self 
        execute:'expr(a) {
                    return (a % 4.0);
                 }'
        for:nil
        arguments:#(-4)
        expect:0.0

    "
     self run:#testOperators25f_mod
     self new testOperators25f_mod
    "
!

testOperators25g_mod
    self 
        execute:'expr(a) {
                    return (a % 4);
                 }'
        for:nil
        arguments:#(-4.0)
        expect:0.0

    "
     self run:#testOperators25g_mod
     self new testOperators25g_mod
    "
!

testOperators25h_mod
    self 
        execute:'expr(a) {
                    return (a % 4.0);
                 }'
        for:nil
        arguments:#(-4.0)
        expect:0.0

    "
     self run:#testOperators25h_mod
     self new testOperators25h_mod
    "
!

testOperators26a_postInc
    self 
        execute:'expr(a) {
                    var x = a;

                    return (x++);
                 }'
        for:nil
        arguments:#(1)
        expect:1

    "
     self run:#testOperators26a_postInc
     self new testOperators26a_postInc
    "
!

testOperators26b_postDec
    self 
        execute:'expr(a) {
                    var x = a;

                    return (x--);
                 }'
        for:nil
        arguments:#(1)
        expect:1

    "
     self run:#testOperators26b_postDec
     self new testOperators26b_postDec
    "
!

testOperators26c_preInc
    self 
        execute:'expr(a) {
                    var x = a;

                    return (++x);
                 }'
        for:nil
        arguments:#(1)
        expect:2

    "
     self run:#testOperators26c_preInc
     self new testOperators26c_preInc
    "
!

testOperators26d_preDec
    self 
        execute:'expr(a) {
                    var x = a;

                    return (--x);
                 }'
        for:nil
        arguments:#(1)
        expect:0

    "
     self run:#testOperators26d_preDec
     self new testOperators26d_preDec
    "
!

testOperators27a_postInc
    self 
        execute:'expr(a) {
                    var x = a;

                    x++;
                    return (x);
                 }'
        for:nil
        arguments:#(1)
        expect:2

    "
     self run:#testOperators27a_postInc
     self new testOperators27a_postInc
    "
!

testOperators27b_postDec
    self 
        execute:'expr(a) {
                    var x = a;

                    x--;
                    return (x);
                 }'
        for:nil
        arguments:#(1)
        expect:0

    "
     self run:#testOperators27b_postDec
     self new testOperators27b_postDec
    "
!

testOperators27c_preInc
    self 
        execute:'expr(a) {
                    var x = a;

                    ++x;
                    return (x);
                 }'
        for:nil
        arguments:#(1)
        expect:2

    "
     self run:#testOperators27c_preInc
     self new testOperators27c_preInc
    "
!

testOperators27d_preDec
    self 
        execute:'expr(a) {
                    var x = a;

                    --x;
                    return (x);
                 }'
        for:nil
        arguments:#(1)
        expect:0

    "
     self run:#testOperators27d_preDec
     self new testOperators27d_preDec
    "
!

testOperators28_not
    self 
        execute:'expr(a) {
                    return (!! a);
                 }'
        for:nil
        arguments:#(true)
        expect:false

    "
     self run:#testOperators28_not
     self new testOperators28_not
    "
!

testOperators29a_plusAssign
    self 
        execute:'expr(a, b, c, d) {
                    var s = 0;
                    s += a;
                    s += b;
                    s += c;
                    s += d;
                    s += 1;
                    return (s);
                 }'
        for:nil
        arguments:#( 1 2 3 4 )
        expect:11

    "
     self run:#testOperators29a_plusAssign
     self new testOperators29a_plusAssign
    "
!

testOperators29c_minusAssign
    self 
        execute:'expr(a, b, c, d) {
                    var s = 0;
                    s -= a;
                    s -= b;
                    s -= c;
                    s -= d;
                    s -= 1;
                    return (s);
                 }'
        for:nil
        arguments:#( 1 2 3 4 )
        expect:-11

    "
     self run:#testOperators29c_minusAssign
     self new testOperators29c_minusAssign
    "
!

testOperators30_timesAssign
    self 
        execute:'expr(a, b, c, d) {
                    var s = 1;
                    s *= a;
                    s *= b;
                    s *= c;
                    s *= d;
                    s *= 2;
                    return (s);
                 }'
        for:nil
        arguments:#( 1 2 3 4 )
        expect:48

    "
     self run:#testOperators30_timesAssign
     self new testOperators30_timesAssign
    "
!

testOperators31a_shiftLeft
    self 
        execute:'expr(a) {
                    return (a << 1);
                 }'
        for:nil
        arguments:#( 1 )
        expect:2

    "
     self run:#testOperators31a_shiftLeft
     self new testOperators31a_shiftLeft
    "
!

testOperators31b_shiftLeft
    self 
        execute:'expr(a) {
                    return (a << 32);
                 }'
        for:nil
        arguments:#( 1 )
        expect:16r100000000

    "
     self run:#testOperators31b_shiftLeft
     self new testOperators31b_shiftLeft
    "
!

testOperators31c_shiftLeftAssign
    self 
        execute:'expr(a) {
                    var b = a;

                    b <<= 1;
                    return b;
                 }'
        for:nil
        arguments:#( 1 )
        expect:2

    "
     self run:#testOperators31c_shiftLeftAssign
     self new testOperators31c_shiftLeftAssign
    "
!

testOperators32a_shiftRight
    self 
        execute:'expr(a) {
                    return (a >> 1);
                 }'
        for:nil
        arguments:#( 2 )
        expect:1

    "
     self run:#testOperators32a_shiftRight
     self new testOperators32a_shiftRight
    "
!

testOperators32b_shiftRightAssign
    self 
        execute:'expr(a) {
                    var b = a;

                    b >>= 1;
                    return b;
                 }'
        for:nil
        arguments:#( 5 )
        expect:2

    "
     self run:#testOperators32b_shiftRightAssign
     self new testOperators32b_shiftRightAssign
    "
!

testOperators33_bitOrAssign
    self 
        execute:'expr(a, b) {
                    var s = 0;
                    s |= a;
                    s |= b;
                    return (s);
                 }'
        for:nil
        arguments:#(1 4)
        expect:5

    "
     self run:#testOperators33_bitOrAssign
     self new testOperators33_bitOrAssign
    "
!

testOperators34_bitAndAssign
    self 
        execute:'expr(a, b) {
                    var s = 0xFFFF;
                    s &= a;
                    s &= b;
                    return (s);
                 }'
        for:nil
        arguments:#(3 5)
        expect:1

    "
     self run:#testOperators34_bitAndAssign
     self new testOperators34_bitAndAssign
    "
!

testOperators35a_bitXorAssign
    self 
        execute:'expr(a) {
                    var s = 0xFFFF;
                    s ^= a;
                    return (s);
                 }'
        for:nil
        arguments:#( 1 )
        expect:16rFFFE

    "
     self run:#testOperators35a_xorAssign
     self new testOperators35a_xorAssign
    "
!

testOperators35b_bitXor
    self 
        execute:'expr(a) {
                    var s = 0xFFFF;
                    s = s ^ a;
                    return (s);
                 }'
        for:nil
        arguments:#( 1 )
        expect:16rFFFE

    "
     self run:#testOperators35b_xor
     self new testOperators35b_xor
    "
!

testOperators36a_mod
    self 
        execute:'expr(a) {
                    return (a % 2);
                 }'
        for:nil
        arguments:#(10)
        expect:0

    "
     self run:#testOperators36a_mod
     self new testOperators36a_mod
    "
!

testOperators36b_mod
    self 
        execute:'expr(a) {
                    return (a % 2);
                 }'
        for:nil
        arguments:#(9)
        expect:1

    "
     self run:#testOperators36b_mod
     self new testOperators36b_mod
    "
!

testOperators37a_cond
    self 
        execute:'expr(a) {
                    return (a ? 1 : 0);
                 }'
        for:nil
        arguments:#(true)
        expect:1

    "
     self run:#testOperators37a_cond
     self new testOperators37a_cond
    "
!

testOperators37b_cond
    self 
        execute:'expr(a) {
                    return (a ? 1 : 0);
                 }'
        for:nil
        arguments:#(false)
        expect:0

    "
     self run:#testOperators37b_cond
     self new testOperators37b_cond
    "
!

testOperators37c_cond
    self 
        execute:'expr(a, b) {
                    return (a ? (b ? 0 : 1) : (b ? 2 : 3));
                 }'
        for:nil
        arguments:#(false false)
        expect:3

    "
     self run:#testOperators37c_cond
     self new testOperators37c_cond
    "
!

testOperators37d_cond
    self 
        execute:'expr(a) {
                    return (a == 1 ? 2 : 3);
                 }'
        for:nil
        arguments:#(1)
        expect:2

    "
     self run:#testOperators37d_cond
     self new testOperators37d_cond
    "
!

testOperators38a_eq
    self 
        execute:'expr(a) {
                    return (a == 1);
                 }'
        for:nil
        arguments:#(1)
        expect:true

    "
     self run:#testOperators38a_eq
     self new testOperators38a_eq
    "
!

testOperators38b_eq
    self 
        execute:'expr(a) {
                    return (a == 1);
                 }'
        for:nil
        arguments:#(1.0)
        expect:true

    "
     self run:#testOperators38b_eq
     self new testOperators38b_eq
    "
!

testOperators38c_ne
    self 
        execute:'expr(a) {
                    return (a !!= 1);
                 }'
        for:nil
        arguments:#(1.0)
        expect:false

    "
     self run:#testOperators38c_ne
     self new testOperators38c_ne
    "
!

testOperators38d_ne
    self 
        execute:'expr(a) {
                    return (a !!= 1);
                 }'
        for:nil
        arguments:#(2.0)
        expect:true

    "
     self run:#testOperators38d_ne
     self new testOperators38d_ne
    "
!

testOperators39a_identical
    self 
        execute:'expr(a) {
                    return (a === 1);
                 }'
        for:nil
        arguments:#(1)
        expect:true

    "
     self run:#testOperators39a_identical
     self new testOperators39a_identical
    "
!

testOperators39b_identical
    self 
        execute:'expr(a) {
                    return (a === 1);
                 }'
        for:nil
        arguments:#(1.0)
        expect:false

    "
     self run:#testOperators39b_identical
     self new testOperators39b_identical
    "
!

testOperators39c_notIdentical
    self 
        execute:'expr(a) {
                    return (a !!== 1);
                 }'
        for:nil
        arguments:#(1.0)
        expect:true

    "
     self run:#testOperators39c_notIdentical
     self new testOperators39c_notIdentical
    "
!

testOperators39d_notIdentical
    self 
        execute:'expr(a) {
                    return (a !!== 1);
                 }'
        for:nil
        arguments:#(1)
        expect:false

    "
     self run:#testOperators39d_notIdentical
     self new testOperators39d_notIdentical
    "
!

testOperators40a_bitAnd
    self 
        execute:'expr(a) {
                    return (a & 1);
                 }'
        for:nil
        arguments:#(1)
        expect:1

    "
     self run:#testOperators40a_bitAnd
     self new testOperators40a_bitAnd
    "
!

testOperators40b_bitAnd
    self 
        execute:'expr(a) {
                    return (a & 1);
                 }'
        for:nil
        arguments:#(7)
        expect:1

    "
     self run:#testOperators40b_bitAnd
     self new testOperators40b_bitAnd
    "
!

testOperators41a_bitOr
    self 
        execute:'expr(a) {
                    return (a | 1);
                 }'
        for:nil
        arguments:#(6)
        expect:7

    "
     self run:#testOperators41a_bitOr
     self new testOperators41a_bitOr
    "
!

testOperators42a_bitXor
    self 
        execute:'expr(a) {
                    return (a ^ 1);
                 }'
        for:nil
        arguments:#(7)
        expect:6

    "
     self run:#testOperators42a_bitXor
     self new testOperators42a_bitXor
    "
!

testOperators43a_bitNot
    self 
        execute:'expr(a) {
                    return (~a);
                 }'
        for:nil
        arguments:#(1)
        expect:-2

    "
     self run:#testOperators43a_bitNot
     self new testOperators43a_bitNot
    "
!

testOperators44a_logAnd
    self 
        execute:'expr(a, b) {
                    return (a && (b > 5));
                 }'
        for:nil
        arguments:#(true 6)
        expect:true.

    self 
        execute:'expr(a, b) {
                    return (a && (b > 5));
                 }'
        for:nil
        arguments:#(true 5)
        expect:false

    "
     self run:#testOperators44a_logAnd
     self new testOperators44a_logAnd
    "
!

testOperators44b_logAnd
    "the right part of a logical and should not be evaluated,
     if the left is already false"

    self 
        execute:'expr(a, bIn) {
                    var x, b;

                    b = bIn;
                    x = (a && (b++ > 5));
                    return b;
                 }'
        for:nil
        arguments:#(true 5)
        expect:6.

    self 
        execute:'expr(a, bIn) {
                    var x, b;

                    b = bIn;
                    x = (a && (b++ > 5));
                    return b;
                 }'
        for:nil
        arguments:#(false 5)
        expect:5

    "
     self run:#testOperators44b_logAnd
     self new testOperators44b_logAnd
    "
!

testOperators45a_logOr
    self 
        execute:'expr(a, b) {
                    return (a || (b > 5));
                 }'
        for:nil
        arguments:#(true 6)
        expect:true.

    self 
        execute:'expr(a, b) {
                    return (a || (b > 5));
                 }'
        for:nil
        arguments:#(false 6)
        expect:true.

    self 
        execute:'expr(a, b) {
                    return (a || (b > 5));
                 }'
        for:nil
        arguments:#(false 5)
        expect:false

    "
     self run:#testOperators45a_logOr
     self new testOperators45a_logOr
    "
!

testOperators45b_logOr
    "the right part of a logical or should not be evaluated,
     if the left is already true"

    self 
        execute:'expr(a, bIn) {
                    var x, b;

                    b = bIn;
                    x = (a || (b++ > 5));
                    return b;
                 }'
        for:nil
        arguments:#(true 5)
        expect:5.

    self 
        execute:'expr(a, bIn) {
                    var x, b;

                    b = bIn;
                    x = (a || (b++ > 5));
                    return b;
                 }'
        for:nil
        arguments:#(false 5)
        expect:6

    "
     self run:#testOperators45b_logOr
     self new testOperators45b_logOr
    "
!

testOperators46_comma
    "the right part of a logical or should not be evaluated,
     if the left is already true"

    self 
        execute:'expr(a, b, c) {
                    var x;

                    x = a+1, b+1, c+1;
                    return x;
                 }'
        for:nil
        arguments:#(1 2 3)
        expect:4.

    self 
        execute:'expr(aIn, bIn, cIn) {
                    var x;
                    var a = aIn;
                    var b = bIn;
                    var c = cIn;

                    x = ++a , ++b, ++c, a+b+c;
                    return x;
                 }'
        for:nil
        arguments:#(1 2 3)
        expect:9.

    self 
        execute:'expr(aIn, bIn, cIn) {
                    var x;
                    var a = aIn;
                    var b = bIn;
                    var c = cIn;

                    x = a++ , b++, c++, a+b+c;
                    return x;
                 }'
        for:nil
        arguments:#(1 2 3)
        expect:9.

    self 
        execute:'expr(aIn, bIn, cIn) {
                    var x;
                    var a = aIn;
                    var b = bIn;
                    var c = cIn;

                    x = a++ , b++, c++, ++a + ++b + ++c;
                    return x;
                 }'
        for:nil
        arguments:#(1 2 3)
        expect:12.

    self 
        execute:'expr(aIn, bIn, cIn) {
                    var x;
                    var a = aIn;
                    var b = bIn;
                    var c = cIn;

                    x = a++ , b++, c++, a++ + b++ + c++;
                    return x;
                 }'
        for:nil
        arguments:#(1 2 3)
        expect:9.
    "
     self run:#testOperators46_comma
     self new testOperators46_comma
    "
!

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"
!

testReturn01
    self 
        execute:'test(n) {
                     return 1;
                 }'
        for:nil
        arguments:#(10)
        expect:1

    "
     self run:#testReturn01
     self new testReturn01
    "

    "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
    "
!

testScanner20
    #(

         ' = '                  $=    
         '/* ignored */= '      $=    
         '/* ignored */ = '     $=    
         ' + '                  $+    
         ' - '                  $-    
         ' * '                  $*    
         ' / '                  $/    
         ' % '                  $%    
         ' & '                  $&    
         ' ^ '                  $^    
         ' | '                  $|    
         ' !! '                  $!!    
         ' < '                  $<    
         ' > '                  $>    

         ' << '        #'<<'  
         ' >> '        #'>>'  
         ' == '        #'=='    
         ' <= '        #'<='    
         ' >= '        #'>='    
         ' !!= '        #'!!='    
         ' || '        #'||'    
         ' && '        #'&&'    
         ' ++ '        #'++'    
         ' -- '        #'--'    

         ' += '        #'+='    
         ' -= '        #'-='    
         ' *= '        #'*='    
         ' /= '        #'/='  
         ' %= '        #'%='  
         ' &= '        #'&='    
         ' ^= '        #'^='    
         ' |= '        #'|='    

         ' >>> '       #'>>>'  
         ' >>= '       #'>>='  
         ' <<= '       #'<<='  
         ' === '       #'==='    
         ' !!== '       #'!!=='    
    ) pairWiseDo:[:src :expectedToken |
        |scannedToken|

        scannedToken := (JavaScriptScanner for:src) nextToken.
        self assert:(scannedToken == expectedToken)
    ].

    "
     self run:#testScanner20
     self new testScanner20
    "
!

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  
    "
!

testSwitch01
    self 
        execute:'test(arg) {
                    switch (arg) {
                    }
                 }'
        for:nil
        arguments:#(5)
        expect:nil

    "
     self run:#testSwitch01
     self new testSwitch01  
    "
!

testSwitch02
    self 
        execute:'test(arg) {
                    switch (arg) {
                        Transcript.show("hello ");
                        return 1;
                    }
                    return 0;
                 }'
        for:nil
        arguments:#(5)
        expect:0

    "
     self run:#testSwitch02
     self new testSwitch02  
    "
!

testSwitch03
    self 
        execute:'test(arg) {
                    switch (arg) {
                        Transcript.show("hello ");
                        Transcript.show("world ");
                        Transcript.cr();
                        return 1;
                    }
                    return 0;
                 }'
        for:nil
        arguments:#(5)
        expect:0

    "
     self run:#testSwitch03
     self new testSwitch03  
    "
!

testSwitch04
    self 
        execute:'test(arg) {
                    switch (arg) {
                    default:
                        Transcript.show("hello ");
                        Transcript.show("world ");
                        Transcript.cr();
                        return 1;
                    }
                    return 0;
                 }'
        for:nil
        arguments:#(5)
        expect:1

    "
     self run:#testSwitch04
     self new testSwitch04  
    "
!

testSwitch05
    self 
        execute:'test(arg) {
                    switch (arg) {
                    default:
                        Transcript.show("hello ");
                        Transcript.show("world ");
                        return 1;
                        Transcript.cr();
                    }
                    return 0;
                 }'
        for:nil
        arguments:#(5)
        expect:1

    "
     self run:#testSwitch05
     self new testSwitch05  
    "
!

testSwitch06a
    self 
        execute:'test(arg) {
                    switch (arg) {
                    case 1:
                        Transcript.showCR("one");
                        return 10;
                    case 2:
                        Transcript.showCR("two");
                        return 20;
                    }
                    return 0;
                 }'
        for:nil
        arguments:#(5)
        expect:0

    "
     self run:#testSwitch06a
     self new testSwitch06a  
    "
!

testSwitch06b
    self 
        execute:'test(arg) {
                    switch (arg) {
                    case 1:
                        Transcript.showCR("one");
                        return 10;
                    case 2:
                        Transcript.showCR("two");
                        return 20;
                    }
                    return 0;
                 }'
        for:nil
        arguments:#(1)
        expect:10

    "
     self run:#testSwitch06b
     self new testSwitch06b  
    "
!

testSwitch06c
    self 
        execute:'test(arg) {
                    switch (arg) {
                    case 1:
                        Transcript.showCR("one");
                        return 10;
                    case 2:
                        Transcript.showCR("two");
                        return 20;
                    }
                    return 0;
                 }'
        for:nil
        arguments:#(2)
        expect:20

    "
     self run:#testSwitch06c
     self new testSwitch06c  
    "
!

testSwitch06d
    self 
        execute:'test(arg) {
                    switch (arg) {
                    case "hallo":
                        Transcript.showCR("Hallo");
                        return 10;
                    case "hello":
                        Transcript.showCR("Hello");
                        return 20;
                    }
                    return 0;
                 }'
        for:nil
        arguments:#('hello')
        expect:20

    "
     self run:#testSwitch06d
     self new testSwitch06d  
    "
!

testSwitch06e
    self 
        execute:'test(arg) {
                    switch (arg) {
                    case 1:
                        Transcript.showCR("Hallo");
                        return 10;
                    case 2:
                        Transcript.showCR("Hello");
                        return 20;
                    }
                    return 0;
                 }'
        for:nil
        arguments:#(3)
        expect:0

    "
     self run:#testSwitch06e
     self new testSwitch06e  
    "
!

testSwitch06f
    self 
        execute:'test(arg) {
                    var a = 0;
                    switch (arg) {
                    case 1:
                        a = 10;
                        break;
                    case 2:
                        a = 20;
                        break;
                    }
                    return a;
                 }'
        for:nil
        arguments:#(1)
        expect:10

    "
     self run:#testSwitch06f
     self new testSwitch06f  
    "
!

testSwitch06g
    self 
        execute:'test(arg) {
                    var a = 0;
                    switch (arg) {
                    case 1:
                        a = 10;
                        break;
                    case 2:
                        a = 20;
                        break;
                    }
                    return a;
                 }'
        for:nil
        arguments:#(2)
        expect:20

    "
     self run:#testSwitch06g
     self new testSwitch06g  
    "
!

testSwitch06h
    self 
        execute:'test(arg) {
                    var a = 0;
                    switch (arg) {
                    case 1:
                        a = 10;
                        break;
                    case 2:
                        a = 20;
                        break;
                    }
                    return a;
                 }'
        for:nil
        arguments:#(3)
        expect:0

    "
     self run:#testSwitch06h
     self new testSwitch06h  
    "
!

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
    "
!

testVarDeclaration08

    self 
        execute:'expr(aIn, bIn, cIn) {
                    var a = aIn, b = bIn, c = cIn;

                    return (a);
                 }'
        for:nil
        arguments:#(1 2 3)
        expect:1

    "
     self run:#testVarDeclaration08
     self new testVarDeclaration08
    "
!

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|

    spec := #(
                        ('1'                    #isInteger       1)
                        ('0'                    #isInteger       0)
                        ('-1'                   #isInteger       -1)
                        ('12345678901234567890' #isInteger       12345678901234567890)
                        ('0x0'                  #isInteger       0)
                        ('0x1'                  #isInteger       1)
                        ('0xFFFF'               #isInteger       16rFFFF)
                        ('0xffff'               #isInteger       16rFFFF)
                        ('0xFFFFFFFFFFFFFFFF'   #isInteger       16rFFFFFFFFFFFFFFFF)
                        ('0777'                 #isInteger       8r777)

                        ('1.2345'               #isFloat         1.2345)
                        ('-1.2345'              #isFloat         -1.2345)

                        ('nil'                  #isNil           nil)
                        ('null'                 #isNil           nil)
                        ('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') )
                        ('"\''"'                #isString        '''' )
                        ('"\""'                #isString         '"' )

                        ('[ 1 , 2 , 3]'         #isArray         #(1 2 3) )
                        ('[1,2,3]'              #isArray         #(1 2 3) )
                        ('[1,2,3]'              #isArray         #(1 2 3) )
                        ('["a","b","c"]'        #isArray         #('a' 'b' 'c') )
                        ('[]'                   #isArray         #() )
                        ('[null]'               #isArray         #( nil ) )

                        ('[1,[2,[3]]]'          #isArray         #(1 (2 (3))) )

               ).

    self doTestEachFromSpec:spec.

    "
     self run:#test_01_parse_literals
     self new test_01_parse_literals
    "
!

test_02_parse_literals2
    |spec|

    spec := #(
                        ('"\x00"'               #isString        (#eval '(Character value:0) asString') )
                        ('"\x01"'               #isString        (#eval '(Character value:1) asString') )
                        ('"\x1a"'               #isString        (#eval '(Character value:16r1a) asString') )
                        ('"\x000"'              #isString        (#eval '(Character value:0) asString , ''0'' ') )
                        ('"\xgg"'               #isString        (#error ) )
                        ('"\xg"'                #isString        (#error ) )
                        ('"\x"'                 #isString        (#error ) )
                        ('"\x0g"'               #isString        (#error ) )
                        ('"\u1234"'             #isString        (#eval '(Character value:16r1234) asString ') )
                        ('"\uFFFF"'             #isString        (#eval '(Character value:16rFFFF) asString ') )
               ).

    self doTestEachFromSpec:spec.

    "
     self run:#test_02_parse_literals2
     self new test_02_parse_literals2
    "
!

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 )
             ('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.

    "
     self run:#test_10_parse_expression1
     self new test_10_parse_expression1
    "
!

test_11_parse_expression2
    |spec|

    spec := #( 
                ('1=0'               nil                ( #error ) )
                ('"abc"[0]'          nil                ( #error ) ) 
                ('"abc"[1]'          nil                $a ) 
             ).
    self doTestEachFromSpec:spec.

    "
     self run:#test_11_parse_expression2
     self new test_11_parse_expression2
    "
! !

!JavaScriptTests class methodsFor:'documentation'!

version
    ^ '$Header$'
! !