Add another test case
[tiger.ml.git] / tiger / src / exe / tiger_tests.ml
CommitLineData
78c9eca5
SK
1module List = ListLabels
2
3let test_01 =
19284c5d 4 let name = "an array type and an array variable" in
78c9eca5 5 let code =
8543fc37 6 " \
19284c5d 7 /* "^name^" */ \
8543fc37
SK
8 let \
9 type arrtype = array of int \
10 var arr1:arrtype := \
11 arrtype [10] of 0 \
12 in \
13 arr1 \
14 end \
78c9eca5
SK
15 "
16 in
17 let tokens =
18 let open Tiger.Parser.Token in
19 [ LET;
20 TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "int";
21 VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
22 ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
23 IN;
24 ID "arr1";
25 END
26 ]
27 in
19284c5d 28 (name, code, tokens)
8543fc37
SK
29
30let test_02 =
19284c5d 31 let name = "arr1 is valid since expression 0 is int = myint" in
8543fc37
SK
32 let code =
33 " \
19284c5d 34 /* "^name^" */ \
8543fc37
SK
35 let \
36 type myint = int \
37 type arrtype = array of myint \
b828a6e7 38 var arr1:arrtype := \
8543fc37
SK
39 arrtype [10] of 0 \
40 in \
41 arr1 \
42 end \
43 "
44 in
45 let tokens =
46 let open Tiger.Parser.Token in
47 [ LET;
48 TYPE; ID "myint"; EQ; ID "int";
49 TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "myint";
50 VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
51 ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
52 IN;
53 ID "arr1";
54 END
55 ]
56 in
19284c5d 57 (name, code, tokens)
8543fc37
SK
58
59let test_03 =
19284c5d 60 let name = "a record type and a record variable" in
8543fc37
SK
61 let code =
62 " \
19284c5d 63 /* "^name^" */ \
8543fc37
SK
64 let \
65 type rectype = \
66 { name : string \
67 , age : int \
68 } \
69 var rec1 : rectype := \
70 rectype \
71 { name = \"Nobody\" \
72 , age = 1000 \
73 } \
74 in \
75 rec1.name := \"Somebody\"; \
76 rec1 \
77 end \
78 "
79 in
80 let tokens =
81 let open Tiger.Parser.Token in
82 [ LET;
83 TYPE; ID "rectype"; EQ;
84 LBRACE; ID "name"; COLON; ID "string";
85 COMMA; ID "age"; COLON; ID "int";
86 RBRACE;
87 VAR; ID "rec1"; COLON; ID "rectype"; ASSIGN;
88 ID "rectype";
89 LBRACE; ID "name"; EQ; STRING "Nobody";
90 COMMA; ID "age"; EQ; INT 1000;
91 RBRACE;
92 IN;
93 ID "rec1"; DOT; ID "name"; ASSIGN; STRING "Somebody"; SEMICOLON;
94 ID "rec1";
95 END
96 ]
97 in
19284c5d 98 (name, code, tokens)
78c9eca5 99
1946b457
SK
100let test_04 =
101 let name = "define a recursive function" in
102 let code =
103 " \
104 /* "^name^" */ \
105 let \
106 \
107 /* calculate n! */ \
108 function nfactor(n: int): int = \
109 if n = 0 \
110 then 1 \
111 else n * nfactor(n-1) \
112 \
113 in \
114 nfactor(10) \
115 end \
116 "
117 in
118 let tokens =
119 let open Tiger.Parser.Token in
120 [ LET;
121 FUNCTION; ID "nfactor"; LPAREN; ID "n"; COLON; ID "int"; RPAREN; COLON; ID "int"; EQ;
122 IF; ID "n"; EQ; INT 0;
123 THEN; INT 1;
124 ELSE; ID "n"; TIMES; ID "nfactor"; LPAREN; ID "n"; MINUS; INT 1; RPAREN;
125 IN;
126 ID "nfactor"; LPAREN; INT 10; RPAREN;
127 END
128 ]
129 in
130 (name, code, tokens)
131
cb00a20d
SK
132let test_09 =
133 let name = "error : types of then - else differ" in
134 let code =
135 "
136 /* "^name^" */
137
138 if (5>4) then 13 else \" \"
139 "
140 in
141 let tokens =
142 let open Tiger.Parser.Token in
143 [ IF; LPAREN; INT 5; GT; INT 4; RPAREN; THEN; INT 13; ELSE; STRING " "
144 ]
145 in
146 (* TODO: Type error test case *)
147 (name, code, tokens)
148
78c9eca5
SK
149let tokens_of_code code =
150 let lexbuf = Lexing.from_string code in
151 let rec tokens () =
152 match Tiger.Lexer.token lexbuf with
b828a6e7
SK
153 | None -> []
154 | Some token -> token :: tokens ()
78c9eca5
SK
155 in
156 tokens ()
157
158let tests =
159 [ test_01
8543fc37
SK
160 ; test_02
161 ; test_03
1946b457 162 ; test_04
cb00a20d 163 ; test_09
78c9eca5
SK
164 ]
165
166let () =
8543fc37
SK
167 let bar_sep = String.make 80 '-' in
168 let bar_end = String.make 80 '=' in
858f923a
SK
169 List.iteri tests ~f:(fun i (name, code, tokens_expected) ->
170 let i = i + 1 in (* Because iteri starts with 0 *)
8543fc37 171 let open Printf in
858f923a 172 printf "%s\n Test %d : %S\n" bar_sep i name;
8543fc37
SK
173 let tokens_emitted = tokens_of_code code in
174 (try
175 assert (tokens_emitted = tokens_expected);
858f923a 176 print_endline " ---> OK";
8543fc37
SK
177 with Assert_failure _ ->
178 let tokens_to_string tokens =
b828a6e7 179 String.concat "; " (List.map ~f:Tiger.Parser.Token.to_string tokens)
8543fc37
SK
180 in
181 printf
858f923a 182 " ---> ERROR\n Expected: %s\n Emitted : %s\n\n"
8543fc37
SK
183 (tokens_to_string tokens_expected)
184 (tokens_to_string tokens_emitted)
185 );
186 );
187 print_endline bar_end;
This page took 0.033706 seconds and 4 git commands to generate.