+module Error = Tiger_error
module Test = Tiger_test
let book =
[ IF; LPAREN; INT 5; GT; INT 4; RPAREN; THEN; INT 13; ELSE; STRING " "
]
)
+ ~is_error_expected_semant:Error.is_wrong_type (* TODO: Be more specific *)
; Test.case
"Book test: 8-queens"
~code:
[ (let code = "nil" in Test.case code ~code ~out_lexing:[NIL])
; (let code = "5" in Test.case code ~code ~out_lexing:[INT 5])
; (let code = "-5" in Test.case code ~code ~out_lexing:[MINUS; INT 5])
- ; (let code = "f()" in Test.case code ~code ~out_lexing:[ID "f"; LPAREN; RPAREN])
- ; (let code = "abc.i" in Test.case code ~code ~out_lexing:[ID "abc"; DOT; ID "i"])
- ; (let code = "abc[0]" in Test.case code ~code ~out_lexing:[ID "abc"; LBRACK; INT 0; RBRACK])
-
- ; (let code = "abc[0] := foo()" in Test.case code ~code
- ~out_lexing:
- [ID "abc"; LBRACK; INT 0; RBRACK; ASSIGN; ID "foo"; LPAREN; RPAREN])
-
- ; (let code = "abc [5] of nil" in Test.case code ~code
- ~out_lexing:
- [ID "abc"; LBRACK; INT 5; RBRACK; OF; NIL])
-
- ; (let code = "f(\"a\", 3, foo)" in Test.case code ~code
- ~out_lexing:
- [ID "f"; LPAREN; STRING "a"; COMMA; INT 3; COMMA; ID "foo"; RPAREN])
+ ; ( let code = "f()" in
+ Test.case
+ code
+ ~code
+ ~out_lexing:[ID "f"; LPAREN; RPAREN]
+ ~is_error_expected_semant:Error.is_unknown_id (* TODO: Be more specific *)
+ )
+ ; ( let code = "abc.i" in
+ Test.case
+ code
+ ~code
+ ~out_lexing:[ID "abc"; DOT; ID "i"]
+ ~is_error_expected_semant:Error.is_unknown_id (* TODO: Be more specific *)
+ )
+ ; ( let code = "abc[0]" in
+ Test.case
+ code
+ ~code
+ ~out_lexing:[ID "abc"; LBRACK; INT 0; RBRACK]
+ ~is_error_expected_semant:Error.is_unknown_id (* TODO: Be more specific *)
+ )
+ ; ( let code = "abc[0] := foo()" in
+ Test.case
+ code
+ ~code
+ ~out_lexing:
+ [ID "abc"; LBRACK; INT 0; RBRACK; ASSIGN; ID "foo"; LPAREN; RPAREN]
+ ~is_error_expected_semant:Error.is_unknown_id (* TODO: Be more specific *)
+ )
+ ; ( let code = "abc [5] of nil" in
+ Test.case
+ code
+ ~code
+ ~out_lexing:[ID "abc"; LBRACK; INT 5; RBRACK; OF; NIL]
+ ~is_error_expected_semant:Error.is_unknown_type (* TODO: Be more specific *)
+ )
+ ; ( let code = "f(\"a\", 3, foo)" in
+ Test.case
+ code
+ ~code
+ ~out_lexing:
+ [ID "f"; LPAREN; STRING "a"; COMMA; INT 3; COMMA; ID "foo"; RPAREN]
+ ~is_error_expected_semant:Error.is_unknown_id
+ )
+ ; ( let code =
+ "let
+ type a = int
+ type b = a
+ type c = b
+ var i : a := 2
+ var j : c := 3
+ in
+ i := j
+ end
+ "
+ in
+ Test.case
+ "Type aliases"
+ ~code
+ )
+ ; ( let code =
+ "let
+ type a = {x:int, y:int}
+ type b = {x:int, y:int} /* new type generated */
+ var foo : a := a {x = 1, y = 2}
+ var bar : b := b {x = 1, y = 2}
+ in
+ foo = bar /* incompatible types */
+ end
+ "
+ in
+ Test.case
+ code
+ ~code
+ ~is_error_expected_semant:Error.is_wrong_type (* TODO: Be more specific *)
+ )
]
let all =