| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 | #define LILY_IMPLEMENTATION
#include "lily-test.h"
#include "expression.h"
LILY_FILE_BEGIN(expression_suite)
enum simple_symbol_t {
  START,
  SIMPLE_NUM_NONTERMINALS,
  A, B, C,
};
LILY_TEST("expand basic expression") {
  li_grammar_t *grammar = li_grammar_alloc(SIMPLE_NUM_NONTERMINALS);
  REQUIRE_NEQ(grammar, NULL, "%p");
  int err;
  int rule0[] = { A, START, B };
  err = li_grammar_rule_add(grammar, START, 3, rule0);
  CHECK_EQ(err, 0, "%d");
  int rule1[] = { C };
  err = li_grammar_rule_add(grammar, START, 1, rule1);
  CHECK_EQ(err, 0, "%d");
  int buf[32]; size_t bufsz = 32; int stack[32];
  uint8_t rand[] = { 1, 1, 1, 0 };
  err = li_grammar_rule_expand(grammar, buf, &bufsz, stack, 32, START, rand, 4);
  REQUIRE_EQ(err, 0, "%d");
  CHECK_EQ(bufsz, 7, "%lu");
  CHECK_EQ(buf[0], A, "%d");
  CHECK_EQ(buf[1], A, "%d");
  CHECK_EQ(buf[2], A, "%d");
  CHECK_EQ(buf[3], C, "%d");
  CHECK_EQ(buf[4], B, "%d");
  CHECK_EQ(buf[5], B, "%d");
  CHECK_EQ(buf[6], B, "%d");
  li_grammar_free(grammar);
}
#include LILY_PUSH_TEST()
#define LILY_FILE_END
#include LILY_REGISTER_TESTS()
int main() {
  lily_begin();
  expression_suite();
  lily_finish();
  return 0;
}
 |