Line data Source code
1 : #include "../../inc/parsingAnalysis/builder.h"
2 : #include <catch2/catch_test_macros.hpp>
3 : #include <memory>
4 :
5 : using namespace nicole;
6 :
7 9 : TEST_CASE("AST_CASE class methods", "[AST_CASE]") {
8 9 : Location loc{"file", 0, 0};
9 9 : Token token{TokenType::OPERATOR_ADD, "+", loc};
10 9 : auto condition = *Builder::createCondition(
11 9 : SourceLocation{token, token},
12 9 : *Builder::createBool(SourceLocation{token, token}, true));
13 9 : auto statement = *Builder::createStatement(
14 9 : SourceLocation{token, token},
15 9 : *Builder::createBool(SourceLocation{token, token}, true));
16 9 : auto body = *Builder::createBody(
17 9 : SourceLocation{token, token},
18 9 : std::vector<std::shared_ptr<AST_STATEMENT>>{statement});
19 9 : AST_CASE astCase{0, SourceLocation{token, token}, condition, body};
20 :
21 9 : REQUIRE(astCase.match() == condition);
22 9 : REQUIRE(astCase.body() == body);
23 9 : }
24 :
25 9 : TEST_CASE("AST_DEFAULT class methods", "[AST_DEFAULT]") {
26 9 : Location loc{"file", 0, 0};
27 9 : Token token{TokenType::OPERATOR_ADD, "+", loc};
28 9 : auto statement = *Builder::createStatement(
29 9 : SourceLocation{token, token},
30 9 : *Builder::createBool(SourceLocation{token, token}, false));
31 9 : auto body = *Builder::createBody(
32 9 : SourceLocation{token, token},
33 9 : std::vector<std::shared_ptr<AST_STATEMENT>>{statement});
34 9 : AST_DEFAULT astDefault{0, SourceLocation{token, token}, body};
35 :
36 9 : REQUIRE(astDefault.body() == body);
37 9 : }
38 :
39 9 : TEST_CASE("AST_ELSE_IF class methods", "[AST_ELSE_IF]") {
40 9 : Location loc{"file", 0, 0};
41 9 : Token token{TokenType::OPERATOR_ADD, "+", loc};
42 9 : auto condition = *Builder::createCondition(
43 9 : SourceLocation{token, token},
44 9 : *Builder::createBool(SourceLocation{token, token}, true));
45 9 : auto statement = *Builder::createStatement(
46 9 : SourceLocation{token, token},
47 9 : *Builder::createBool(SourceLocation{token, token}, true));
48 9 : auto body = *Builder::createBody(
49 9 : SourceLocation{token, token},
50 9 : std::vector<std::shared_ptr<AST_STATEMENT>>{statement});
51 9 : AST_ELSE_IF astElseIf{0, SourceLocation{token, token}, condition, body};
52 :
53 9 : REQUIRE(astElseIf.condition() == condition);
54 9 : REQUIRE(astElseIf.body() == body);
55 9 : }
56 :
57 9 : TEST_CASE("AST_IF class methods", "[AST_IF]") {
58 9 : Location loc{"file", 0, 0};
59 9 : Token token{TokenType::OPERATOR_ADD, "+", loc};
60 9 : auto condition = *Builder::createCondition(
61 9 : SourceLocation{token, token},
62 9 : *Builder::createBool(SourceLocation{token, token}, true));
63 9 : auto statement = *Builder::createStatement(
64 9 : SourceLocation{token, token},
65 9 : *Builder::createBool(SourceLocation{token, token}, true));
66 9 : auto body = *Builder::createBody(
67 9 : SourceLocation{token, token},
68 9 : std::vector<std::shared_ptr<AST_STATEMENT>>{statement});
69 :
70 9 : auto elseCondition = *Builder::createCondition(
71 9 : SourceLocation{token, token},
72 9 : *Builder::createBool(SourceLocation{token, token}, false));
73 9 : auto elseStatement =
74 9 : *Builder::createStatement(SourceLocation{token, token}, elseCondition);
75 9 : auto elseIfBody = *Builder::createBody(
76 9 : SourceLocation{token, token},
77 9 : std::vector<std::shared_ptr<AST_STATEMENT>>{elseStatement});
78 9 : auto elseIf = *Builder::createElseIf(SourceLocation{token, token},
79 9 : elseCondition, elseIfBody);
80 :
81 9 : auto elseBody = *Builder::createBody(
82 9 : SourceLocation{token, token},
83 9 : std::vector<std::shared_ptr<AST_STATEMENT>>{statement});
84 :
85 9 : AST_IF astIf{0, SourceLocation{token, token}, condition, body, {elseIf},
86 9 : elseBody};
87 :
88 9 : REQUIRE(astIf.condition() == condition);
89 9 : REQUIRE(astIf.body() == body);
90 9 : REQUIRE(astIf.elseIf().size() == 1);
91 9 : REQUIRE(astIf.elseIf()[0] == elseIf);
92 9 : REQUIRE(astIf.elseBody() == elseBody);
93 9 : }
94 :
95 9 : TEST_CASE("AST_SWITCH class methods", "[AST_SWITCH]") {
96 9 : Location loc{"file", 0, 0};
97 9 : Token token{TokenType::OPERATOR_ADD, "+", loc};
98 9 : auto condition = *Builder::createCondition(
99 9 : SourceLocation{token, token},
100 9 : *Builder::createBool(SourceLocation{token, token}, true));
101 9 : auto statement = *Builder::createStatement(
102 9 : SourceLocation{token, token},
103 9 : *Builder::createBool(SourceLocation{token, token}, true));
104 9 : auto body = *Builder::createBody(
105 9 : SourceLocation{token, token},
106 9 : std::vector<std::shared_ptr<AST_STATEMENT>>{statement});
107 9 : auto case1 = std::make_shared<AST_CASE>(0, SourceLocation{token, token},
108 9 : condition, body);
109 :
110 9 : auto defaultBody = *Builder::createBody(
111 9 : SourceLocation{token, token},
112 9 : std::vector<std::shared_ptr<AST_STATEMENT>>{statement});
113 9 : auto defaultCase =
114 9 : *Builder::createDefault(SourceLocation{token, token}, defaultBody);
115 :
116 9 : AST_SWITCH astSwitch{
117 9 : 0, SourceLocation{token, token}, condition, {case1}, defaultCase};
118 :
119 9 : REQUIRE(astSwitch.condition() == condition);
120 9 : REQUIRE(astSwitch.cases().size() == 1);
121 9 : REQUIRE(astSwitch.cases()[0] == case1);
122 9 : REQUIRE(astSwitch.defaultCase() == defaultCase);
123 9 : }
124 :
125 9 : TEST_CASE("AST_TERNARY class methods", "[AST_TERNARY]") {
126 9 : Location loc{"file", 0, 0};
127 9 : Token token{TokenType::OPERATOR_ADD, "+", loc};
128 9 : auto condition = *Builder::createCondition(
129 9 : SourceLocation{token, token},
130 9 : *Builder::createBool(SourceLocation{token, token}, true));
131 9 : auto first = *Builder::createBool(SourceLocation{token, token}, false);
132 9 : auto second = *Builder::createBool(SourceLocation{token, token}, true);
133 :
134 9 : AST_TERNARY astTernary{0, SourceLocation{token, token}, condition, first,
135 9 : second};
136 :
137 9 : REQUIRE(astTernary.condition() == condition);
138 9 : REQUIRE(astTernary.first() == first);
139 9 : REQUIRE(astTernary.second() == second);
140 9 : }
|