1 /**
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "cfg_test.h"
17
18 namespace ark::es2panda::compiler {
19
TEST_F(CFGTest,if_statement_01)20 TEST_F(CFGTest, if_statement_01)
21 {
22 // Test if the empty BB will be omitted from the final CFG
23 char const *text = R"(
24 function main() {
25 let cond = true;
26 if (cond == true) { }
27 }
28 )";
29
30 CONTEXT(ES2PANDA_STATE_CHECKED, text)
31 {
32 CFG *cfg = GetCfg();
33
34 ASSERT_TRUE(cfg != nullptr);
35 const ArenaSet<compiler::CFG::BasicBlock *> basicBlocks = cfg->GetBasicBlocks();
36 ASSERT_EQ(basicBlocks.size(), EXPECTED_TWO);
37 }
38 }
39
TEST_F(CFGTest,if_statement_02)40 TEST_F(CFGTest, if_statement_02)
41 {
42 char const *text = R"(
43 function main() {
44 let cond = true;
45 if (cond == true) { let i = 1; }
46 }
47 )";
48
49 CONTEXT(ES2PANDA_STATE_CHECKED, text)
50 {
51 CFG *cfg = GetCfg();
52
53 ASSERT_TRUE(cfg != nullptr);
54 const ArenaSet<compiler::CFG::BasicBlock *> basicBlocks = cfg->GetBasicBlocks();
55 ASSERT_EQ(basicBlocks.size(), EXPECTED_THREE);
56
57 auto bb1 = GetBBByID(basicBlocks, ID_01);
58 ASSERT_NE(bb1, nullptr);
59 ASSERT_EQ(bb1->GetSuccessors().size(), EXPECTED_TWO);
60
61 auto bb2 = GetBBByID(basicBlocks, ID_02);
62 ASSERT_NE(bb2, nullptr);
63 ASSERT_EQ(bb2->GetSuccessors().size(), EXPECTED_ONE);
64 ASSERT_EQ(bb2->GetPredecessors().size(), EXPECTED_ONE);
65 ASSERT_EQ(bb1, bb2->GetPredecessors().at(0));
66
67 auto bb3 = GetBBByID(basicBlocks, ID_03);
68 ASSERT_NE(bb3, nullptr);
69 auto bb3Predecessors = bb3->GetPredecessors();
70 ASSERT_EQ(bb3Predecessors.size(), EXPECTED_TWO);
71 ASSERT_EQ(bb3Predecessors[0], bb2);
72 ASSERT_EQ(bb3Predecessors[1], bb1);
73 }
74 }
75
TEST_F(CFGTest,if_statement_03)76 TEST_F(CFGTest, if_statement_03)
77 {
78 char const *text = R"(
79 function main() {
80 let i: number = 1;
81 if (i < 1) {
82 i++;
83 } else {
84 i--;
85 }
86 }
87 )";
88
89 CONTEXT(ES2PANDA_STATE_CHECKED, text)
90 {
91 CFG *cfg = GetCfg();
92
93 ASSERT_TRUE(cfg != nullptr);
94
95 const ArenaSet<compiler::CFG::BasicBlock *> basicBlocks = cfg->GetBasicBlocks();
96 ASSERT_EQ(basicBlocks.size(), EXPECTED_FOUR);
97
98 auto bb1 = GetBBByID(basicBlocks, ID_01);
99 ASSERT_NE(bb1, nullptr);
100
101 auto bb2 = GetBBByID(basicBlocks, ID_02);
102 ASSERT_NE(bb2, nullptr);
103
104 auto bb3 = GetBBByID(basicBlocks, ID_03);
105 ASSERT_NE(bb3, nullptr);
106
107 auto bb4 = GetBBByID(basicBlocks, ID_04);
108 ASSERT_NE(bb4, nullptr);
109
110 ASSERT_EQ(bb1->GetSuccessors().size(), EXPECTED_TWO);
111 ASSERT_EQ(bb1->GetPredecessors().size(), 0);
112 ASSERT_EQ(bb2->GetSuccessors().size(), EXPECTED_ONE);
113 ASSERT_EQ(bb2->GetPredecessors().size(), EXPECTED_ONE);
114 ASSERT_EQ(bb3->GetSuccessors().size(), EXPECTED_ONE);
115 ASSERT_EQ(bb3->GetPredecessors().size(), EXPECTED_ONE);
116 ASSERT_EQ(bb4->GetSuccessors().size(), 0);
117 auto bb4Predecessors = bb4->GetPredecessors();
118 ASSERT_EQ(bb4Predecessors.size(), EXPECTED_TWO);
119 ASSERT_EQ(bb4Predecessors[0], bb2);
120 ASSERT_EQ(bb4Predecessors[1], bb3);
121 }
122 }
123
TEST_F(CFGTest,if_statement_04)124 TEST_F(CFGTest, if_statement_04)
125 {
126 char const *text = R"(
127 function main() {
128 let cond = true;
129 if (cond == true) {
130 let i = 1;
131 } else {
132 }
133 }
134 )";
135
136 CONTEXT(ES2PANDA_STATE_CHECKED, text)
137 {
138 CFG *cfg = GetCfg();
139 ASSERT_TRUE(cfg != nullptr);
140
141 const ArenaSet<compiler::CFG::BasicBlock *> basicBlocks = cfg->GetBasicBlocks();
142 ASSERT_EQ(basicBlocks.size(), EXPECTED_THREE);
143
144 auto bb1 = GetBBByID(basicBlocks, ID_01);
145 ASSERT_NE(bb1, nullptr);
146 ASSERT_EQ(bb1->GetSuccessors().size(), EXPECTED_TWO);
147
148 auto bb2 = GetBBByID(basicBlocks, ID_02);
149 ASSERT_NE(bb2, nullptr);
150 ASSERT_EQ(bb2->GetSuccessors().size(), EXPECTED_ONE);
151 ASSERT_EQ(bb2->GetPredecessors().size(), EXPECTED_ONE);
152 ASSERT_EQ(bb1, bb2->GetPredecessors().at(0));
153
154 auto bb3 = GetBBByID(basicBlocks, ID_03);
155 ASSERT_EQ(bb3, nullptr);
156
157 auto bb4 = GetBBByID(basicBlocks, ID_04);
158 ASSERT_NE(bb4, nullptr);
159
160 auto bb4Predecessors = bb4->GetPredecessors();
161 ASSERT_EQ(bb4Predecessors.size(), EXPECTED_TWO);
162 ASSERT_EQ(bb4Predecessors[0], bb2);
163 ASSERT_EQ(bb4Predecessors[1], bb1);
164 }
165 }
166
TEST_F(CFGTest,if_statement_with_emptystatement)167 TEST_F(CFGTest, if_statement_with_emptystatement)
168 {
169 // Test if the empty BB will be omitted from the final CFG
170 char const *text = R"(
171 function main() {
172 ;
173 let cond = true;
174 if (cond == true) {
175 ;
176 }
177 ;
178 }
179 )";
180
181 CONTEXT(ES2PANDA_STATE_CHECKED, text)
182 {
183 CFG *cfg = GetCfg();
184 ASSERT_TRUE(cfg != nullptr);
185
186 const ArenaSet<compiler::CFG::BasicBlock *> basicBlocks = cfg->GetBasicBlocks();
187 ASSERT_EQ(basicBlocks.size(), EXPECTED_TWO);
188 }
189 }
190
191 } // namespace ark::es2panda::compiler
192