1 #ifndef PARSER_SUITE_H_
2 #define PARSER_SUITE_H_
5 #include "ebisp/parser.h"
7 #include "ebisp/builtins.h"
9 TEST(read_expr_from_file_test)
13 struct ParseResult result = read_expr_from_file(gc, "test-data/simple-sum.lisp");
15 ASSERT_TRUE(!result.is_error, {
18 result.error_message);
21 struct Expr head = result.expr;
23 struct Expr expr = head;
24 ASSERT_INTEQ(EXPR_CONS, expr.type);
25 ASSERT_INTEQ(EXPR_ATOM, expr.cons->car.type);
26 ASSERT_INTEQ(ATOM_SYMBOL, expr.cons->car.atom->type);
27 ASSERT_STREQ("+", expr.cons->car.atom->sym);
29 expr = expr.cons->cdr;
30 ASSERT_INTEQ(EXPR_CONS, expr.type);
31 ASSERT_INTEQ(EXPR_ATOM, expr.cons->car.type);
32 ASSERT_INTEQ(ATOM_NUMBER, expr.cons->car.atom->type);
33 ASSERT_LONGINTEQ(1L, expr.cons->car.atom->num);
35 expr = expr.cons->cdr;
36 ASSERT_INTEQ(EXPR_CONS, expr.type);
37 ASSERT_INTEQ(EXPR_ATOM, expr.cons->car.type);
38 ASSERT_INTEQ(ATOM_NUMBER, expr.cons->car.atom->type);
39 ASSERT_LONGINTEQ(2L, expr.cons->car.atom->num);
41 expr = expr.cons->cdr;
42 ASSERT_INTEQ(EXPR_CONS, expr.type);
43 ASSERT_INTEQ(EXPR_ATOM, expr.cons->car.type);
44 ASSERT_INTEQ(ATOM_NUMBER, expr.cons->car.atom->type);
45 ASSERT_LONGINTEQ(3L, expr.cons->car.atom->num);
47 expr = expr.cons->cdr;
48 ASSERT_INTEQ(EXPR_ATOM, expr.type);
49 ASSERT_INTEQ(ATOM_SYMBOL, expr.atom->type);
50 ASSERT_STREQ("nil", expr.atom->sym);
57 TEST(parse_negative_numbers_test)
60 struct ParseResult result = read_expr_from_string(gc, "-12345");
62 ASSERT_FALSE(result.is_error, {
63 fprintf(stderr, "Parsing failed: %s", result.error_message);
65 ASSERT_EQ(enum ExprType, EXPR_ATOM, result.expr.type, {
66 fprintf(stderr, "Expected: %s\n", expr_type_as_string(_expected));
67 fprintf(stderr, "Actual: %s\n", expr_type_as_string(_actual));
69 ASSERT_EQ(enum AtomType, ATOM_NUMBER, result.expr.atom->type, {
70 fprintf(stderr, "Expected: %s\n", atom_type_as_string(_expected));
71 fprintf(stderr, "Actual: %s\n", atom_type_as_string(_actual));
73 ASSERT_LONGINTEQ(-12345L, result.expr.atom->num);
80 TEST(read_all_exprs_from_string_empty_test)
83 struct ParseResult result = read_all_exprs_from_string(gc, "");
85 ASSERT_TRUE(result.is_error, {
87 "Parsing is expected to fail, "
96 TEST(read_all_exprs_from_string_one_test)
99 struct ParseResult result = read_all_exprs_from_string(gc, "(+ 1 2)");
101 ASSERT_FALSE(result.is_error, {
103 "Parsing was unsuccessful: %s\n",
104 result.error_message);
107 ASSERT_EQ(long int, 1, length_of_list(result.expr), {
108 fprintf(stderr, "Expected: %ld\n", _expected);
109 fprintf(stderr, "Actual: %ld\n", _actual);
110 fprintf(stderr, "Expression: ");
111 print_expr_as_sexpr(stderr, result.expr);
112 fprintf(stderr, "\n");
120 TEST(read_all_exprs_from_string_two_test)
122 Gc *gc = create_gc();
123 struct ParseResult result = read_all_exprs_from_string(
127 ASSERT_FALSE(result.is_error, {
129 "Parsing was unsuccessful: %s\n",
130 result.error_message);
133 ASSERT_EQ(long int, 2, length_of_list(result.expr), {
134 fprintf(stderr, "Expected: %ld\n", _expected);
135 fprintf(stderr, "Actual: %ld\n", _actual);
136 fprintf(stderr, "Expression: ");
137 print_expr_as_sexpr(stderr, result.expr);
138 fprintf(stderr, "\n");
146 TEST(read_all_exprs_from_string_bad_test)
148 Gc *gc = create_gc();
149 struct ParseResult result = read_all_exprs_from_string(
153 ASSERT_TRUE(result.is_error, {
154 fprintf(stderr, "Parsing didn't fail as expected\n");
162 TEST(read_all_exprs_from_string_trailing_spaces_test)
164 Gc *gc = create_gc();
165 const char *source_code = "5 ";
166 struct ParseResult result = read_all_exprs_from_string(gc, source_code);
168 ASSERT_FALSE(result.is_error, {
169 fprintf(stderr, "Parsing failed: %s\n", result.error_message);
170 fprintf(stderr, "Position: %ld\n", result.end - source_code);
176 TEST_SUITE(parser_suite)
178 TEST_RUN(read_expr_from_file_test);
179 TEST_RUN(parse_negative_numbers_test);
180 TEST_RUN(read_all_exprs_from_string_empty_test);
181 TEST_RUN(read_all_exprs_from_string_one_test);
182 TEST_RUN(read_all_exprs_from_string_two_test);
183 // TODO(#467): read_all_exprs_from_string_bad_test is failing
184 TEST_IGNORE(read_all_exprs_from_string_bad_test);
185 TEST_RUN(read_all_exprs_from_string_trailing_spaces_test);
192 #endif // PARSER_SUITE_H_