• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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