Test every book test case
[tiger.ml.git] / compiler / src / lib / tiger / tiger_test_cases_book.ml
diff --git a/compiler/src/lib/tiger/tiger_test_cases_book.ml b/compiler/src/lib/tiger/tiger_test_cases_book.ml
new file mode 100644 (file)
index 0000000..1ef024d
--- /dev/null
@@ -0,0 +1,99 @@
+module List = ListLabels
+
+module Test = Tiger_test
+
+let read_file filepath =
+  let {Unix.st_size=size; _} = Unix.stat filepath in
+  let buf = Buffer.create size in
+  let ic = open_in filepath in
+  let rec read () =
+    try
+      Buffer.add_channel buf ic size;
+      read ()
+    with End_of_file ->
+      ()
+  in
+  read ();
+  close_in ic;
+  Buffer.contents buf
+
+let out_lexing_of_filename =
+  let open Tiger_parser in
+  function
+  | "test01.tig" ->
+      Some
+        [ LET;
+            TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "int";
+            VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
+              ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
+          IN;
+            ID "arr1";
+          END
+        ]
+  | "test02.tig" ->
+      Some
+        [ LET;
+          TYPE; ID "myint"; EQ; ID "int";
+          TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "myint";
+          VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
+            ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
+        IN;
+          ID "arr1";
+        END
+      ]
+  | "test03.tig" ->
+      Some
+        [ LET;
+            TYPE; ID "rectype"; EQ;
+              LBRACE; ID "name"; COLON; ID "string";
+              COMMA;  ID "age";  COLON; ID "int";
+              RBRACE;
+            VAR; ID "rec1"; COLON; ID "rectype"; ASSIGN;
+              ID "rectype";
+              LBRACE; ID "name"; EQ; STRING "Nobody";
+              COMMA;  ID "age";  EQ; INT 1000;
+              RBRACE;
+          IN;
+            ID "rec1"; DOT; ID "name"; ASSIGN; STRING "Somebody"; SEMICOLON;
+            ID "rec1";
+          END
+        ]
+  | "test04.tig" ->
+      Some
+        [ LET;
+            FUNCTION; ID "nfactor"; LPAREN; ID "n"; COLON; ID "int"; RPAREN; COLON; ID "int"; EQ;
+              IF; ID "n"; EQ; INT 0;
+              THEN; INT 1;
+              ELSE; ID "n"; TIMES; ID "nfactor"; LPAREN; ID "n"; MINUS; INT 1; RPAREN;
+          IN;
+            ID "nfactor"; LPAREN; INT 10; RPAREN;
+          END
+        ]
+  | "test09.tig" ->
+      Some
+        [IF; LPAREN; INT 5; GT; INT 4; RPAREN; THEN; INT 13; ELSE; STRING " "]
+  | _ ->
+    (* TODO: Fill-in other expected cases *)
+    None
+
+let out_parsing_of_filename _ =
+  (* TODO: Fill-in expected cases *)
+  None
+
+let is_error_expected_semant_of_filename _ =
+  (* TODO: Fill-in expected cases *)
+  None
+
+let test_case_of_filename filename ~dir =
+  Test.case
+    filename
+    ~code:(read_file (Filename.concat dir filename))
+    ~out_lexing:(out_lexing_of_filename filename)
+    ~out_parsing:(out_parsing_of_filename filename)
+    ~is_error_expected_semant:(is_error_expected_semant_of_filename filename)
+
+let read ~from_dir:dir =
+  Sys.readdir dir
+  |> Array.to_list
+  |> List.sort ~cmp:compare
+  |> List.map ~f:(test_case_of_filename ~dir)
This page took 0.029816 seconds and 4 git commands to generate.