Test Suite for Iphigeneia

 Functionality "Interpret Iphigeneia program" is implemented by
 shell command "(cat >foo.txt && src/iphi foo.txt)"
 Tests for functionality "Interpret Iphigeneia program"

Test 'var ... in ...' and assignment.

var k in k := 5
= k=5

Test 'begin ... end'.

var k in begin
    k := 5;
    k := k + 1
end
= k=6

Test nested 'var ... in ...' and arithmetic operators.

var i in var j in var k in begin
    i := 2;
    j := 3;
    k := i + j;   (*  5 *)
    i := j * k;   (* 15 *)
    j := i / 2;   (*  7 *)
    j := j - 1    (*  6 *)
end
= j=6
= i=15
= k=5

Test 'if ... then ... else' command with negative result.

var i in var j in begin
    i := 2;
    if i > 4 then
      j := i * 2
    else
      j := i + 1
end
= j=3
= i=2

Test 'if ... then ... else' command with positive result.

var i in var j in begin
    i := 2;
    j := 1;
    if i < 4 & j = 1 then
      j := i * 6
    else
      j := i + 1
end
= j=12
= i=2

Test 'while ... do ...'.

var i in var j in begin
    i := 100;
    j := 0;
    while i > 0 do begin
        j := j + i;
        i := i - 1
    end
end
= i=0
= j=5050

Test 'while ... do ...'.

var a in var b in var c in
begin
    a := 10;
    b := 1;
    c := 2;
    while a > 0 do
        begin
            b := b * c;
            c := c + b;
            a := a - 1
        end
end
= a=0
= c=140982598893793678070294688422804665931354981644880911847733136248186424030732278900819020480668973702640170212905160639132296847654374706155245147715674612235227680384069415566749494180212370357849936526549755341591854042821940420766722160615645816921368300
= b=140982598893793678070294688422804665931354981644880911847733136248186424030732278900819020480668973702640170212905160639132296847278898210361175931159590631877400396153764977561991761037132722898953457959352992281368361865140291306311370294857131871923863552

Test 'if ... then ... else' expression with negative result.

var a in var b in var c in
begin
    a := 10;
    b := 2;
    c := if a > 20 then a - b else a / b
end
= c=5
= b=2
= a=10

Test 'if ... then ... else' expression with positive result.

var a in var b in var c in
begin
    a := 10;
    b := 2;
    c := if a < 20 then a - b else a / b
end
= c=8
= b=2
= a=10

Test 'let ... in ...'.

var a in a := let b = 7 in 10 - b;
= a=3

Test 'valueof ... in ...'.

var a in var b in begin
    a := 10;
    b := valueof c in begin
        c := a * 2
    end + 7
end
= b=27
= a=10

Test that 'var ... in ...' does not shadow.

var a in var b in
begin
    a := 1;
    b := 2;
    var a in
        a := 3
end
= ["Variable a already declared"]

Test that 'let ... in ...' does shadow.

var a in var b in
begin
    a := 2;
    b := 3;
    a := let b = 7 in a * b
end
= a=14
= b=3

Test 'loop ...' and 'repeat'.

var a in a :=
    let c = 5 in let d = 1 in
        loop
            if c = 0 then
                d
            else
                let d = d * c in
                    let c = c - 1 in
                        repeat
= a=120