1 #ifndef INTERPRETER_SUITE_H_
2 #define INTERPRETER_SUITE_H_
5 #include "ebisp/builtins.h"
6 #include "ebisp/expr.h"
7 #include "ebisp/interpreter.h"
13 struct Expr nil1 = NIL(gc);
14 struct Expr nil2 = NIL(gc);
15 ASSERT_TRUE(equal(nil1, nil2), {
16 fprintf(stderr, "Expected: ");
17 print_expr_as_sexpr(stderr, nil1);
18 fprintf(stderr, "\n");
20 fprintf(stderr, "Actual: ");
21 print_expr_as_sexpr(stderr, nil2);
22 fprintf(stderr, "\n");
26 CONS(gc, SYMBOL(gc, "a"),
27 CONS(gc, SYMBOL(gc, "b"),
28 CONS(gc, SYMBOL(gc, "c"),
31 CONS(gc, SYMBOL(gc, "a"),
32 CONS(gc, SYMBOL(gc, "b"),
33 CONS(gc, SYMBOL(gc, "c"),
35 ASSERT_TRUE(equal(list1, list2), {
36 fprintf(stderr, "Expected: ");
37 print_expr_as_sexpr(stderr, list1);
38 fprintf(stderr, "\n");
40 fprintf(stderr, "Actual: ");
41 print_expr_as_sexpr(stderr, list2);
42 fprintf(stderr, "\n");
54 struct Expr nil = NIL(gc);
56 struct Expr a = SYMBOL(gc, "a");
57 struct Expr b = SYMBOL(gc, "b");
58 struct Expr c = SYMBOL(gc, "c");
60 struct Expr a_pair = CONS(gc, a, NUMBER(gc, 10.0f));
61 struct Expr b_pair = CONS(gc, b, NUMBER(gc, 20.0f));
62 struct Expr c_pair = CONS(gc, c, NUMBER(gc, 30.0f));
67 CONS(gc, c_pair, nil)));
69 struct Expr assoc_result = assoc(a, alist);
71 ASSERT_TRUE(equal(a_pair, assoc_result), {
72 fprintf(stderr, "Expected: ");
73 print_expr_as_sexpr(stderr, a_pair);
74 fprintf(stderr, "\n");
76 fprintf(stderr, "Actual: ");
77 print_expr_as_sexpr(stderr, assoc_result);
78 fprintf(stderr, "\n");
90 struct Expr input = list(
95 CONS(gc, NUMBER(gc, 1), NUMBER(gc, 2)));
100 struct Expr e = NIL(gc);
102 struct EvalResult result = match_list(gc, "dsqe", input, &d, &s, &q, &e);
103 ASSERT_FALSE(result.is_error, {
104 fprintf(stderr, "Unpack failed: ");
105 print_expr_as_sexpr(stderr, result.expr);
106 fprintf(stderr, "\n");
109 ASSERT_TRUE(d == 42, {
110 fprintf(stderr, "Expected: 42, Actual: %ld\n", d);
112 ASSERT_TRUE(strcmp(s, "hello") == 0, {
113 fprintf(stderr, "Expected: hello, Actual: %s\n", s);
115 ASSERT_TRUE(strcmp(q, "world") == 0, {
116 fprintf(stderr, "Expected: world, Actual: %s\n", q);
118 ASSERT_TRUE(equal(e, CONS(gc, NUMBER(gc, 1), NUMBER(gc, 2))), {
119 fprintf(stderr, "Expected: ");
120 print_expr_as_sexpr(stderr, CONS(gc, NUMBER(gc, 1), NUMBER(gc, 2)));
121 fprintf(stderr, ", Actual: ");
122 print_expr_as_sexpr(stderr, e);
123 fprintf(stderr, "\n");
131 TEST(match_list_empty_list_test)
133 Gc *gc = create_gc();
136 struct EvalResult result = match_list(gc, "d", NIL(gc), &d);
138 ASSERT_TRUE(result.is_error, {
139 fprintf(stderr, "Unpack did not fail\n");
147 TEST(match_list_head_tail_test)
149 Gc *gc = create_gc();
151 struct Expr input = list(gc, "dddd", 1, 2, 3, 4);
154 struct Expr xs = NIL(gc);
156 struct EvalResult result = match_list(gc, "d*", input, &x, &xs);
157 ASSERT_TRUE(!result.is_error, {
158 fprintf(stderr, "Could not unpack input: ");
159 print_expr_as_sexpr(stderr, result.expr);
160 fprintf(stderr, "\n");
163 ASSERT_TRUE(x == 1, {
164 fprintf(stderr, "Expected: 1, Actual: %ld\n", x);
167 ASSERT_TRUE(equal(xs, list(gc, "ddd", 2, 3, 4)), {
168 fprintf(stderr, "Expected: (2 3 4), Actual: ");
169 print_expr_as_sexpr(stderr, xs);
170 fprintf(stderr, "\n");
178 TEST(match_list_wildcard_test)
180 Gc *gc = create_gc();
182 struct Expr input = list(
183 gc, "dddd", 1, 2, 3, 4);
185 long int x = 0, y = 0;
186 struct EvalResult result = match_list(gc, "dddd", input, &x, NULL, &y, NULL);
187 ASSERT_TRUE(!result.is_error, {
188 fprintf(stderr, "Matching failed: ");
189 print_expr_as_sexpr(stderr, result.expr);
190 fprintf(stderr, "\n");
193 ASSERT_LONGINTEQ(1L, x);
194 ASSERT_LONGINTEQ(3L, y);
201 TEST(match_list_singleton_tail_test)
203 Gc *gc = create_gc();
205 struct Expr input = list(gc, "d", 1);
207 struct Expr xs = NIL(gc);
208 struct EvalResult res = match_list(gc, "d*", input, &x, &xs);
210 ASSERT_TRUE(!res.is_error, {
211 fprintf(stderr, "Matching failed: ");
212 print_expr_as_sexpr(stderr, res.expr);
213 fprintf(stderr, "\n");
216 ASSERT_LONGINTEQ(1L, x);
217 ASSERT_TRUE(nil_p(xs), {
218 fprintf(stderr, "Tail doesn't appear to be NIL: ");
219 print_expr_as_sexpr(stderr, xs);
220 fprintf(stderr, "\n");
228 TEST_SUITE(interpreter_suite)
230 TEST_RUN(equal_test);
231 TEST_RUN(assoc_test);
232 TEST_RUN(match_list_test);
233 TEST_RUN(match_list_empty_list_test);
234 TEST_RUN(match_list_head_tail_test);
235 TEST_RUN(match_list_wildcard_test);
236 TEST_RUN(match_list_singleton_tail_test);
241 #endif // INTERPRETER_SUITE_H_