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.ebi");
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_INTEGER, 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_INTEGER, 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_INTEGER, 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_reals_test)
61 const char *input = "3.1415";
62 struct ParseResult result = read_expr_from_string(gc, input);
64 ASSERT_FALSE(result.is_error, {
65 fprintf(stderr, "Parsing failed: %s\n", result.error_message);
68 EPIC_ASSERT_EQ(struct Expr, result.expr, REAL(gc, 3.1416f));
75 TEST(parse_negative_integers_test)
78 struct ParseResult result = read_expr_from_string(gc, "-12345");
80 ASSERT_FALSE(result.is_error, {
81 fprintf(stderr, "Parsing failed: %s", result.error_message);
83 ASSERT_EQ(enum ExprType, EXPR_ATOM, result.expr.type, {
84 fprintf(stderr, "Expected: %s\n", expr_type_as_string(_expected));
85 fprintf(stderr, "Actual: %s\n", expr_type_as_string(_actual));
87 ASSERT_EQ(enum AtomType, ATOM_INTEGER, result.expr.atom->type, {
88 fprintf(stderr, "Expected: %s\n", atom_type_as_string(_expected));
89 fprintf(stderr, "Actual: %s\n", atom_type_as_string(_actual));
91 ASSERT_LONGINTEQ(-12345L, result.expr.atom->num);
98 TEST(read_all_exprs_from_string_empty_test)
100 Gc *gc = create_gc();
101 struct ParseResult result = read_all_exprs_from_string(gc, "");
103 ASSERT_FALSE(result.is_error, {
105 "Parsing was unsuccessful: %s\n",
106 result.error_message);
109 ASSERT_EQ(long int, 0, length_of_list(result.expr), {
110 fprintf(stderr, "Expected: %ld\n", _expected);
111 fprintf(stderr, "Actual: %ld\n", _actual);
112 fprintf(stderr, "Expression: ");
113 print_expr_as_sexpr(stderr, result.expr);
114 fprintf(stderr, "\n");
122 TEST(read_all_exprs_from_string_one_test)
124 Gc *gc = create_gc();
125 struct ParseResult result = read_all_exprs_from_string(gc, "(+ 1 2)");
127 ASSERT_FALSE(result.is_error, {
129 "Parsing was unsuccessful: %s\n",
130 result.error_message);
133 ASSERT_EQ(long int, 1, 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_two_test)
148 Gc *gc = create_gc();
149 struct ParseResult result = read_all_exprs_from_string(
153 ASSERT_FALSE(result.is_error, {
155 "Parsing was unsuccessful: %s\n",
156 result.error_message);
159 ASSERT_EQ(long int, 2, length_of_list(result.expr), {
160 fprintf(stderr, "Expected: %ld\n", _expected);
161 fprintf(stderr, "Actual: %ld\n", _actual);
162 fprintf(stderr, "Expression: ");
163 print_expr_as_sexpr(stderr, result.expr);
164 fprintf(stderr, "\n");
172 TEST(read_all_exprs_from_string_bad_test)
174 Gc *gc = create_gc();
175 struct ParseResult result = read_all_exprs_from_string(
179 ASSERT_TRUE(result.is_error, {
180 fprintf(stderr, "Parsing didn't fail as expected\n");
188 TEST(read_all_exprs_from_string_trailing_spaces_test)
190 Gc *gc = create_gc();
191 const char *source_code = "5 ";
192 struct ParseResult result = read_all_exprs_from_string(gc, source_code);
194 ASSERT_FALSE(result.is_error, {
195 fprintf(stderr, "Parsing failed: %s\n", result.error_message);
196 fprintf(stderr, "Position: %zd\n", result.end - source_code);
202 TEST_SUITE(parser_suite)
204 TEST_RUN(read_expr_from_file_test);
205 TEST_RUN(parse_negative_integers_test);
206 TEST_RUN(read_all_exprs_from_string_empty_test);
207 TEST_RUN(read_all_exprs_from_string_one_test);
208 TEST_RUN(read_all_exprs_from_string_two_test);
209 // TODO(#467): read_all_exprs_from_string_bad_test is failing
210 TEST_IGNORE(read_all_exprs_from_string_bad_test);
211 TEST_RUN(read_all_exprs_from_string_trailing_spaces_test);
212 TEST_RUN(parse_reals_test);
219 #endif // PARSER_SUITE_H_