#!/bin/sh test() { QUIET="$1" CODE="$2" echo "--- $CODE ---" printf '%s' "$CODE" >"build/tmp.golem" ./build/golemc "build/tmp.golem" >"build/tmp.orgaasm" [ "$QUIET" != "-q" ] && cat "build/tmp.orgaasm" orgaasm "build/tmp.orgaasm" "build/tmp.rom" orgaemu "build/tmp.rom" [ "$QUIET" != "-q" ] && echo "" } tup -q || ./build.sh || exit 1 test "$1" "main() {5 + 2; return 4;}" test "$1" "main() {6 + 3;}" test "$1" "main() {'a' - 'b';}" test "$1" "main() { buzz(); } buzz() { return 42; }" test "$1" "main() { fizz(50 + buzz() - 3) * 4; } fizz() { return 3; } buzz() { return 42; }" test "$1" "global abc; main(){ return abc; }" test "$1" "global abc = 5; main() { dbg abc; return abc; }" test "$1" "main() { return abc; } global abc = 5;" test "$1" "global abc = 5; main(){ inc(); return abc; } inc() { abc = abc + 1; }" test "$1" "main() { wrt('H'); wrt('e'); wrt('l'); wrt('l'); wrt('o'); wrt('!'); wrt('\n'); }" test "$1" "main() { a(a(0)); } a(x) { return x + 1; }" test "$1" "main() { wrt(inc(inc('0'))); wrt('\n'); } inc(x) { return x + 1; }" test "$1" "main() { wrt(up('u')); wrt('w'); wrt(up('u')); wrt('\n'); } up(c) { return c + 'A' - 'a'; }" test "$1" "main() { wrt(add('A' - 'a', 'u')); wrt('\n'); } add(a, b) { return a + b; }" test "$1" "main() return 0;" test "$1" "main() { { wrt('c'); } { wrt('b'); { wrt('A'); } wrt('B'); } wrt('\n'); }" test "$1" "main() { local i; i = '0'; loop { wrt i; i = i + 1; if (i > '9') break; } wrt '\n'; }" test "$1" "global a[5] = 4; main() { wrt([a] + '0'); wrt '\n'; }" test "$1" "global a[5] = 4; main() { wrt([a + 1] + '0'); wrt '\n'; }" test "$1" "global a[5] = 4; main() { wrt([a + 4] + '0'); wrt '\n'; }" test "$1" "global a[5] = 4; main() { wrt([a + 5] + '0'); wrt '\n'; }" test "$1" "global a[3]; main() { [a] = 'U'; [a+1] = 'w'; [a+2] = '\n'; wrt[a]; wrt[a+1]; wrt[a]; wrt[a+2]; }" test "$1" "main() { wrt('0' + div(6, 3)); wrt('\n'); } div(a, b) { return a / b; }" test "$1" "main() { \"uwu\"; \"owo\"; }" test "$1" "main() { wrt('0' + (5 < 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (7 < 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (9 < 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (5 > 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (7 > 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (9 > 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (5 <= 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (7 <= 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (9 <= 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (5 >= 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (7 >= 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (9 >= 7)); wrt '\n'; }" test "$1" "main() { local a; dbg a; inc(&a); dbg a; } inc(p) { [p] = [p] + 1; }" test "$1" "global a; main() { dbg a; inc(&a); dbg a; } inc(p) { [p] = [p] + 1; }" test "$1" "main() 0; //ayayayayayayaya comment" test "$1" "main() return;" test "$1" "main() { local a; a = 5; dbg a; a++; dbg a; }" test "$1" "main() { local a; a = 5; dbg a; a--; dbg a; }" test "$1" "main() { local a = 5; dbg a; a--; dbg a; }" test "$1" "main() { wrt [\"(\"]; wrt '\n'; }" test "$1" "main() { wrt inc('0') |> dec() |> inc() |> inc(); wrt '\n'; } inc(a) return a + 1; dec(a) return a - 1;" test "$1" "main();" test "$1" "main() {}" test "$1" "main() {;;;;;;;;;;;;;;;;;}" test "$1" "global a = 8, b, c = 4; main() { dbg a; dbg c; }" test "$1" "global a, b = 6, c = 4; main() { dbg b; dbg c; }" test "$1" "main() { local a = 5, b = 7, c; dbg a; dbg b; }" test "$1" "main() { dbg 5 % 3; }" test "$1" "main() { dbg [{1, 2, 3} + 2]; dbg [{1, 2, 3}]; }" test "$1" "main() { err 'u'; }" test "$1" "enum a, b, c; main() { dbg a; dbg b; dbg c; }" test "$1" 'main() { dbg `howdy; }' test "$1" 'main() { dbg v(1) |> i |> d(2) |> i; } v(a)=>a;i(a)=>d(a,1);d(a,b)=>a+b;' rm -f build/tmp.*