[("parse consts test one",exp_test"bool[] null"(no_loc(CNull(RArrayTBool))))
;("parse consts test two",exp_test"42"(no_loc(CInt42L)))
;("parse consts test three",exp_test"true"(no_loc(CBooltrue)))
;("parse consts test four",exp_test"false"(no_loc(CBoolfalse)))
;("parse consts test five",exp_test"\"hello world\""(no_loc(CStr"hello world")))
;("parse consts test six",exp_test"new int[]{1, 2, 3}"(no_loc(CArr(TInt,[no_loc(CInt1L);no_loc(CInt2L);no_loc(CInt3L)]))))
]
letparse_exp_tests=
[("parse exp test 1",exp_test"1"(no_loc(CInt1L)))
;("parse exp test 2",exp_test"1+2"(no_loc(Bop(Add,no_loc(CInt1L),no_loc(CInt2L)))))
;("parse exp test 3",exp_test"1+2+3"(no_loc(Bop(Add,no_loc(Bop(Add,no_loc(CInt1L),no_loc(CInt2L))),no_loc(CInt3L)))))
;("parse exp test 4",exp_test"1+2*3"(no_loc(Bop(Add,no_loc(CInt1L),no_loc(Bop(Mul,no_loc(CInt2L),no_loc(CInt3L)))))))
;("parse exp test 5",exp_test"1+(2+3)"(no_loc(Bop(Add,no_loc(CInt1L),no_loc(Bop(Add,no_loc(CInt2L),no_loc(CInt3L)))))))
;("parse exp test 6",exp_test"(1+2)*3"(no_loc(Bop(Mul,no_loc(Bop(Add,no_loc(CInt1L),no_loc(CInt2L))),no_loc(CInt3L)))))
;("parse exp test 7",exp_test"1+2*3+4"(no_loc(Bop(Add,no_loc(Bop(Add,no_loc(CInt1L),no_loc(Bop(Mul,no_loc(CInt2L),no_loc(CInt3L))))),no_loc(CInt4L)))))
;("parse exp test 8",exp_test"1-2 == 3+4"(no_loc(Bop(Eq,no_loc(Bop(Sub,no_loc(CInt1L),no_loc(CInt2L))),no_loc(Bop(Add,no_loc(CInt3L),no_loc(CInt4L)))))))
;("parse exp test 9",exp_test"(1+2)*(3+4)"(no_loc(Bop(Mul,no_loc(Bop(Add,no_loc(CInt1L),no_loc(CInt2L))),no_loc(Bop(Add,no_loc(CInt3L),no_loc(CInt4L)))))))
;("parse exp test 10",exp_test"true & true | false"(no_loc(Bop(Or,no_loc(Bop(And,no_loc(CBooltrue),no_loc(CBooltrue))),no_loc(CBoolfalse)))))
;("parse exp test 11",exp_test"true & (true | false)"(no_loc(Bop(And,no_loc(CBooltrue),no_loc(Bop(Or,no_loc(CBooltrue),no_loc(CBoolfalse)))))))
;("parse exp test 12",exp_test"!(~5 == ~6) & -5+10 < 0"(no_loc(Bop(And,no_loc(Uop(Lognot,no_loc(Bop(Eq,no_loc(Uop(Bitnot,no_loc(CInt5L))),no_loc(Uop(Bitnot,no_loc(CInt6L))))))),no_loc(Bop(Lt,no_loc(Bop(Add,no_loc(Uop(Neg,no_loc(CInt5L))),no_loc(CInt10L))),no_loc(CInt0L)))))))
;("parse exp test 13",exp_test"1+2 >> (3-4 >>> 7*8) << 9"(no_loc(Bop(Shl,no_loc(Bop(Shr,no_loc(Bop(Add,no_loc(CInt1L),no_loc(CInt2L))),no_loc(Bop(Sar,no_loc(Bop(Sub,no_loc(CInt3L),no_loc(CInt4L))),no_loc(Bop(Mul,no_loc(CInt7L),no_loc(CInt8L))))))),no_loc(CInt9L)))))
;("parse exp test 21",exp_test"new int[3]"(no_loc(NewArr(TInt,no_loc(CInt3L)))))
;("parse exp test 22",exp_test"new int[][]{new int[]{10,11},new int[]{20,21},new int[]{30,31}}"(no_loc(CArr(TRef(RArrayTInt),[no_loc(CArr(TInt,[no_loc(CInt10L);no_loc(CInt11L)]));no_loc(CArr(TInt,[no_loc(CInt20L);no_loc(CInt21L)]));no_loc(CArr(TInt,[no_loc(CInt30L);no_loc(CInt31L)]))]))))
;("parse exp test 23",exp_test"proc1 ()"(no_loc(Call(no_loc(Id"proc1"),[]))))
;("parse exp test 24",exp_test"array[0]"(no_loc(Index(no_loc(Id("array")),no_loc(CInt0L)))))
;("parse exp test 25",exp_test"i + y[1][1]"(no_loc(Bop(Add,no_loc(Id("i")),no_loc(Index(no_loc(Index(no_loc(Id("y")),no_loc(CInt1L))),no_loc(CInt1L)))))))
;("parse exp test 26",exp_test"-!~x[0][0]"(no_loc(Uop(Neg,no_loc(Uop(Lognot,no_loc(Uop(Bitnot,no_loc(Index(no_loc(Index(no_loc(Id("x")),no_loc(CInt0L))),no_loc(CInt0L)))))))))))
;("parse exp test 27",exp_test"print_string (string_concat (str1, str2))"(no_loc(Call(no_loc(Id"print_string"),[no_loc(Call(no_loc(Id"string_concat"),[no_loc(Id("str1"));no_loc(Id("str2"))]))]))))
[("parse stmt test 1",stmt_test"var n = 8;"(no_loc(Decl("n",no_loc(CInt8L)))))
;("parse stmt test 2",stmt_test"var x=a[0];"(no_loc(Decl("x",no_loc(Index(no_loc(Id("a")),no_loc(CInt0L)))))))
;("parse stmt test 3",stmt_test"return;"(no_loc(Ret(None))))
;("parse stmt test 4",stmt_test"return x+y;"(no_loc(Ret(Some(no_loc(Bop(Add,no_loc(Id("x")),no_loc(Id("y")))))))))
;("parse stmt test 5",stmt_test"a[j>>1]=v;"(no_loc(Assn(no_loc(Index(no_loc(Id("a")),no_loc(Bop(Shr,no_loc(Id("j")),no_loc(CInt1L))))),no_loc(Id("v"))))))
;("parse stmt test 6",stmt_test"foo(a,1,n);"(no_loc(SCall(no_loc(Id"foo"),[no_loc(Id("a"));no_loc(CInt1L);no_loc(Id("n"))]))))
;("parse stmt test 7",stmt_test"a[i]=a[i>>1];"(no_loc(Assn(no_loc(Index(no_loc(Id("a")),no_loc(Id("i")))),no_loc(Index(no_loc(Id("a")),no_loc(Bop(Shr,no_loc(Id("i")),no_loc(CInt1L)))))))))
;("parse stmt test 8",stmt_test"var a = new int[8];"(no_loc(Decl("a",no_loc(NewArr(TInt,no_loc(CInt8L)))))))
;("parse stmt test 9",stmt_test"if((j<n)&(a[j]<a[j+1])) { j=j+1; }"(no_loc(If(no_loc(Bop(And,no_loc(Bop(Lt,no_loc(Id("j")),no_loc(Id("n")))),no_loc(Bop(Lt,no_loc(Index(no_loc(Id("a")),no_loc(Id("j")))),no_loc(Index(no_loc(Id("a")),no_loc(Bop(Add,no_loc(Id("j")),no_loc(CInt1L))))))))),[no_loc(Assn(no_loc(Id("j")),no_loc(Bop(Add,no_loc(Id("j")),no_loc(CInt1L)))))],[]))))
;("parse stmt test 10",stmt_test"if (c == 1) { var i = 0; var j = 0; var k = 0; }"(no_loc(If(no_loc(Bop(Eq,no_loc(Id("c")),no_loc(CInt1L))),[no_loc(Decl("i",no_loc(CInt0L)));no_loc(Decl("j",no_loc(CInt0L)));no_loc(Decl("k",no_loc(CInt0L)))],[]))))
;("parse stmt test 11",stmt_test"while((i>1)&(a[i>>1]<v)) { a[i]=a[i>>1]; i=i>>1; }"(no_loc(While(no_loc(Bop(And,no_loc(Bop(Gt,no_loc(Id("i")),no_loc(CInt1L))),no_loc(Bop(Lt,no_loc(Index(no_loc(Id("a")),no_loc(Bop(Shr,no_loc(Id("i")),no_loc(CInt1L))))),no_loc(Id("v")))))),[no_loc(Assn(no_loc(Index(no_loc(Id("a")),no_loc(Id("i")))),no_loc(Index(no_loc(Id("a")),no_loc(Bop(Shr,no_loc(Id("i")),no_loc(CInt1L)))))));no_loc(Assn(no_loc(Id("i")),no_loc(Bop(Shr,no_loc(Id("i")),no_loc(CInt1L)))))]))))
;("parse stmt test 12",stmt_test"for (; i > 0; i=i-1;) { for (var j = 1; j <= i; j=j+1;) { if (numbers[j-1] > numbers[i]) { temp = numbers[j-1]; numbers[j-1] = numbers[i]; numbers[i] = temp; } } }"(no_loc(For([],Some(no_loc(Bop(Gt,no_loc(Id("i")),no_loc(CInt0L)))),Some(no_loc(Assn(no_loc(Id("i")),no_loc(Bop(Sub,no_loc(Id("i")),no_loc(CInt1L)))))),[no_loc(For(["j",no_loc(CInt1L)],Some(no_loc(Bop(Lte,no_loc(Id("j")),no_loc(Id("i"))))),Some(no_loc(Assn(no_loc(Id("j")),no_loc(Bop(Add,no_loc(Id("j")),no_loc(CInt1L)))))),[no_loc(If(no_loc(Bop(Gt,no_loc(Index(no_loc(Id("numbers")),no_loc(Bop(Sub,no_loc(Id("j")),no_loc(CInt1L))))),no_loc(Index(no_loc(Id("numbers")),no_loc(Id("i")))))),[no_loc(Assn(no_loc(Id("temp")),no_loc(Index(no_loc(Id("numbers")),no_loc(Bop(Sub,no_loc(Id("j")),no_loc(CInt1L)))))));no_loc(Assn(no_loc(Index(no_loc(Id("numbers")),no_loc(Bop(Sub,no_loc(Id("j")),no_loc(CInt1L))))),no_loc(Index(no_loc(Id("numbers")),no_loc(Id("i"))))));no_loc(Assn(no_loc(Index(no_loc(Id("numbers")),no_loc(Id("i")))),no_loc(Id("temp"))))],[]))]))]))))
;("parse stmt test 13",stmt_test"for (var i = 0, var j = 0; ;) { }"(no_loc(For(["i",no_loc(CInt0L);"j",no_loc(CInt0L)],None,None,[]))))