-
Notifications
You must be signed in to change notification settings - Fork 4
/
TestPiParser.cpp
125 lines (95 loc) · 3.36 KB
/
TestPiParser.cpp
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <KAI/Language/Pi/Pi.h>
#include "TestCommon.h"
using namespace kai;
using namespace std;
static bool trace = false;
namespace {
TEST(PiParser, TestSimple) {
auto input = "1";
Registry reg;
shared_ptr<PiLexer> lex = make_shared<PiLexer>(input, reg);
lex->Process();
if (trace) KAI_TRACE_1(lex->Print());
shared_ptr<PiParser> parse = make_shared<PiParser>(reg);
parse->Process(lex, Structure::Sequence);
if (trace) KAI_TRACE_1(parse->PrintTree());
ASSERT_FALSE(lex->Failed);
ASSERT_FALSE(parse->Failed);
auto root = parse->GetRoot();
ASSERT_EQ(root->GetChildren().size(), 1);
ASSERT_EQ(root->GetChild(0)->GetToken().type, PiTokens::Int);
}
TEST(PiParser, TestCompoundWorks) {
auto input = "[[[]]]";
Registry reg;
shared_ptr<PiLexer> lex = make_shared<PiLexer>(input, reg);
lex->Process();
if (trace) KAI_TRACE_1(lex->Print());
if (lex->Failed) KAI_TRACE_1(lex->Error);
shared_ptr<PiParser> parser = make_shared<PiParser>(reg);
parser->Process(lex, Structure::Sequence);
ASSERT_FALSE(lex->Failed);
ASSERT_FALSE(parser->Failed);
if (trace) parser->PrintTree();
auto root = parser->GetRoot();
ASSERT_EQ(root->GetChildren().size(), 1);
auto ch0 = root->GetChildren()[0];
auto ch1 = ch0->GetChildren()[0];
auto ch2 = ch1->GetChildren()[0];
ASSERT_EQ(ch0->GetType(), PiAstNodes::Array);
ASSERT_EQ(ch1->GetType(), PiAstNodes::Array);
ASSERT_EQ(ch2->GetType(), PiAstNodes::Array);
}
TEST(PiParser, TestMixedCompound) {
auto input = "{ [ 1 2 3 ] 'a # }";
Registry reg;
shared_ptr<PiLexer> lex = make_shared<PiLexer>(input, reg);
lex->Process();
if (trace) KAI_TRACE_1(lex->Print());
if (lex->Failed) KAI_TRACE_1(lex->Error);
shared_ptr<PiParser> parse = make_shared<PiParser>(reg);
parse->Process(lex, Structure::Sequence);
if (trace) KAI_TRACE_1(parse->PrintTree());
ASSERT_FALSE(lex->Failed);
ASSERT_FALSE(parse->Failed);
}
TEST(PiParser, TestCompoundFail) {
auto input = "[";
Registry reg;
shared_ptr<PiLexer> lex = make_shared<PiLexer>(input, reg);
lex->Process();
if (trace) KAI_TRACE_1(lex->Print());
if (lex->Failed) KAI_TRACE_1(lex->Error);
shared_ptr<PiParser> parse = make_shared<PiParser>(reg);
parse->Process(lex, Structure::Sequence);
if (trace) KAI_TRACE_1(parse->PrintTree());
ASSERT_FALSE(lex->Failed);
ASSERT_TRUE(parse->Failed);
}
TEST(PiParser, TestCompoundFail2) {
auto input = "[[]";
Registry reg;
shared_ptr<PiLexer> lex = make_shared<PiLexer>(input, reg);
lex->Process();
if (trace) KAI_TRACE_1(lex->Print());
if (lex->Failed) KAI_TRACE_1(lex->Error);
shared_ptr<PiParser> parse = make_shared<PiParser>(reg);
parse->Process(lex, Structure::Sequence);
KAI_TRACE_1(parse->PrintTree());
ASSERT_FALSE(lex->Failed);
ASSERT_TRUE(parse->Failed);
}
TEST(PiParser, TestCompoundFail3) {
auto input = "]";
Registry reg;
shared_ptr<PiLexer> lex = make_shared<PiLexer>(input, reg);
lex->Process();
if (trace) KAI_TRACE_1(lex->Print());
if (lex->Failed) KAI_TRACE_1(lex->Error);
shared_ptr<PiParser> parse = make_shared<PiParser>(reg);
parse->Process(lex, Structure::Sequence);
if (trace) KAI_TRACE_1(parse->PrintTree());
ASSERT_FALSE(lex->Failed);
ASSERT_TRUE(parse->Failed);
}
} // namespace