Fix - check number of arguments in function calls
[tiger.ml.git] / compiler / src / lib / tiger / tiger_test_cases_book.ml
CommitLineData
38ffcb1f
SK
1module List = ListLabels
2
c0b10ff1 3module Error = Tiger_error
38ffcb1f
SK
4module Test = Tiger_test
5
6let read_file filepath =
7 let {Unix.st_size=size; _} = Unix.stat filepath in
8 let buf = Buffer.create size in
9 let ic = open_in filepath in
10 let rec read () =
11 try
12 Buffer.add_channel buf ic size;
13 read ()
14 with End_of_file ->
15 ()
16 in
17 read ();
18 close_in ic;
19 Buffer.contents buf
20
21let out_lexing_of_filename =
22 let open Tiger_parser in
23 function
24 | "test01.tig" ->
25 Some
26 [ LET;
27 TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "int";
28 VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
29 ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
30 IN;
31 ID "arr1";
32 END
33 ]
34 | "test02.tig" ->
35 Some
36 [ LET;
37 TYPE; ID "myint"; EQ; ID "int";
38 TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "myint";
39 VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
40 ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
41 IN;
42 ID "arr1";
43 END
44 ]
45 | "test03.tig" ->
46 Some
47 [ LET;
48 TYPE; ID "rectype"; EQ;
49 LBRACE; ID "name"; COLON; ID "string";
50 COMMA; ID "age"; COLON; ID "int";
51 RBRACE;
52 VAR; ID "rec1"; COLON; ID "rectype"; ASSIGN;
53 ID "rectype";
54 LBRACE; ID "name"; EQ; STRING "Nobody";
55 COMMA; ID "age"; EQ; INT 1000;
56 RBRACE;
57 IN;
58 ID "rec1"; DOT; ID "name"; ASSIGN; STRING "Somebody"; SEMICOLON;
59 ID "rec1";
60 END
61 ]
62 | "test04.tig" ->
63 Some
64 [ LET;
65 FUNCTION; ID "nfactor"; LPAREN; ID "n"; COLON; ID "int"; RPAREN; COLON; ID "int"; EQ;
66 IF; ID "n"; EQ; INT 0;
67 THEN; INT 1;
68 ELSE; ID "n"; TIMES; ID "nfactor"; LPAREN; ID "n"; MINUS; INT 1; RPAREN;
69 IN;
70 ID "nfactor"; LPAREN; INT 10; RPAREN;
71 END
72 ]
73 | "test09.tig" ->
74 Some
75 [IF; LPAREN; INT 5; GT; INT 4; RPAREN; THEN; INT 13; ELSE; STRING " "]
76 | _ ->
77 (* TODO: Fill-in other expected cases *)
78 None
79
80let out_parsing_of_filename _ =
81 (* TODO: Fill-in expected cases *)
82 None
83
89037894
SK
84let is_error_expected_parsing_of_filename =
85 let module E = Tiger_error in
86 function
87 | "test49.tig" ->
789ef466 88 Some Error.is_invalid_syntax
89037894
SK
89 (* TODO: Be more specific - test position *)
90 | _ ->
91 (* TODO: Fill-in other expected cases *)
92 None
93
1d155dc1
SK
94(* TODO: test18.tig - error : definition of recursive functions is interrupted*)
95(* TODO: test21.tig - error : procedure returns value and procedure is used in arexpr *)
354b4e33 96
c0b10ff1
SK
97let is_error_expected_semant_of_filename =
98 let module E = Tiger_error in
99 function
1d155dc1
SK
100 | "test17.tig"
101 | "test33.tig" ->
80c3c410
SK
102 Some Error.is_unknown_type
103 (* TODO: Be more specific - which type? *)
1d155dc1
SK
104 | "test20.tig" ->
105 Some Error.is_unknown_id
106 (* TODO: Be more specific - the unknown id is "i" *)
107 | "test22.tig" ->
108 Some Error.is_no_such_field_in_record
109 (* TODO: Be more specific - which field? *)
110 | "test24.tig" ->
111 Some Error.is_not_an_array
112 (* TODO: Be more specific *)
113 | "test25.tig" ->
114 Some Error.is_not_a_record
115 (* TODO: Be more specific *)
54e838f4
SK
116 | "test35.tig"
117 | "test36.tig" ->
118 Some Error.is_wrong_number_of_args
119 (* TODO: Be more specific - how many expected, how many given? *)
354b4e33 120 | "test09.tig"
80c3c410
SK
121 | "test11.tig"
122 | "test13.tig"
123 | "test14.tig"
354b4e33
SK
124 | "test23.tig"
125 | "test26.tig"
126 | "test28.tig"
127 | "test29.tig"
128 | "test31.tig"
129 | "test32.tig"
130 | "test34.tig"
c0b10ff1
SK
131 | "test43.tig" ->
132 Some Error.is_wrong_type
133 (* TODO: Be more specific - what expected, what given? *)
134 | _ ->
135 (* TODO: Fill-in other expected cases *)
136 None
38ffcb1f
SK
137
138let test_case_of_filename filename ~dir =
139 Test.case
140 filename
141 ~code:(read_file (Filename.concat dir filename))
142 ~out_lexing:(out_lexing_of_filename filename)
143 ~out_parsing:(out_parsing_of_filename filename)
89037894 144 ~is_error_expected_parsing:(is_error_expected_parsing_of_filename filename)
38ffcb1f
SK
145 ~is_error_expected_semant:(is_error_expected_semant_of_filename filename)
146
f7fa9b32
SK
147let is_filename_starts_with_dot filename =
148 match filename.[0] with
149 | exception Invalid_argument _ ->
150 (* Filename should not be an empty string *)
151 assert false
152 | '.' -> true
153 | _ -> false
154
155let is_filename_not_hidden filename =
156 not (is_filename_starts_with_dot filename)
157
38ffcb1f
SK
158let read ~from_dir:dir =
159 Sys.readdir dir
160 |> Array.to_list
f7fa9b32 161 |> List.filter ~f:is_filename_not_hidden
c09092a9 162 |> List.filter ~f:(fun filename -> Filename.check_suffix filename ".tig")
38ffcb1f
SK
163 |> List.sort ~cmp:compare
164 |> List.map ~f:(test_case_of_filename ~dir)
This page took 0.028802 seconds and 4 git commands to generate.