Test for semantic errors
authorSiraaj Khandkar <siraaj@khandkar.net>
Thu, 13 Sep 2018 14:40:30 +0000 (10:40 -0400)
committerSiraaj Khandkar <siraaj@khandkar.net>
Thu, 13 Sep 2018 14:41:27 +0000 (10:41 -0400)
(just 1 of, for now)

compiler/src/lib/tiger/tiger_error.ml
compiler/src/lib/tiger/tiger_error.mli
compiler/src/lib/tiger/tiger_test.ml
compiler/src/lib/tiger/tiger_test.mli
compiler/src/lib/tiger/tiger_test_cases.ml

index 20a1f7d..ce506d9 100644 (file)
@@ -110,3 +110,19 @@ let to_string =
         (Abs.op_show oper)
         (Typ.to_string right)
         (Pos.to_string pos)
+
+let is_unknown_id t =
+  match t with
+  | Unknown_id _ ->
+      true
+  | Invalid_syntax _
+  | Unknown_type _
+  | Id_not_a_function _
+  | Wrong_type_of_expression_in_var_dec _
+  | Wrong_type_used_as_record _
+  | Wrong_type_of_field_value _
+  | Wrong_type_of_arg _
+  | Wrong_number_of_args _
+  | Invalid_operand_type _
+  | Different_operand_types _ ->
+      false
index 4009ed5..6383a62 100644 (file)
@@ -50,3 +50,5 @@ exception T of t
 val raise : t -> 'a
 
 val to_string : t -> string
+
+val is_unknown_id : t -> bool
index 12ddb22..89e317f 100644 (file)
@@ -45,7 +45,7 @@ type t =
   ; code        : string
   ; out_lexing  : (Tiger_parser.token list) option
   ; out_parsing : Tiger_absyn.t option
-  ; is_error_expected : (Tiger_error.t -> bool)
+  ; is_error_expected_semant : (Tiger_error.t -> bool)
   }
 
 type color =
@@ -81,7 +81,7 @@ let status_skip ?(info="") () =
 let case
     ?(out_lexing)
     ?(out_parsing)
-    ?(is_error_expected=(fun _ -> false))
+    ?(is_error_expected_semant=(fun _ -> false))
     ~code
     name
   =
@@ -89,7 +89,7 @@ let case
   ; code
   ; out_lexing
   ; out_parsing
-  ; is_error_expected
+  ; is_error_expected_semant
   }
 
 let bar_sep = String.make 80 '-'
@@ -181,27 +181,34 @@ let run tests =
         (execution_status, output_status, output_value)
   in
   List.iter tests ~f:(
-    fun {name; code; out_lexing; out_parsing; is_error_expected} ->
+    fun
+      { name
+      ; code
+      ; out_lexing
+      ; out_parsing
+      ; is_error_expected_semant
+      }
+    ->
       let (stat_lex_exe, stat_lex_out_cmp, _) =
         run_pass
           ~f:pass_lexing
           ~input:code
           ~expect_output:out_lexing
-          ~is_error_expected
+          ~is_error_expected:(fun _ -> false)
       in
       let (stat_pars_exe, stat_pars_out_cmp, absyn_opt) =
         run_pass
           ~f:pass_parsing
           ~input:code
           ~expect_output:out_parsing
-          ~is_error_expected
+          ~is_error_expected:(fun _ -> false)
       in
       let (stat_semant_exe, stat_semant_out_cmp, _) =
         run_pass
           ~f:pass_semant
           ~input:absyn_opt
           ~expect_output:(Some ())
-          ~is_error_expected
+          ~is_error_expected:is_error_expected_semant
       in
       p "%s" bar_sep; p_ln ();
       p "Test: %S" name; p_ln ();
index 3f7143c..5cbc445 100644 (file)
@@ -3,7 +3,7 @@ type t
 val case
   :  ?out_lexing  : Tiger_parser.token list
   -> ?out_parsing : Tiger_absyn.t
-  -> ?is_error_expected : (Tiger_error.t -> bool)
+  -> ?is_error_expected_semant : (Tiger_error.t -> bool)
   -> code         : string
   -> string
   -> t
index 5684f73..c7ea1fc 100644 (file)
@@ -1,3 +1,4 @@
+module Error = Tiger_error
 module Test = Tiger_test
 
 let book =
@@ -184,7 +185,13 @@ let micro =
   [ (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 = "f()" in
+      Test.case
+        code
+        ~code
+        ~out_lexing:[ID "f"; LPAREN; RPAREN]
+        ~is_error_expected_semant:Error.is_unknown_id
+    )
   ; (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])
 
@@ -196,9 +203,14 @@ let micro =
       ~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(\"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 all =
This page took 0.033845 seconds and 4 git commands to generate.