• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2024 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 "ast_verifier_test.h"
17 #include "macros.h"
18 #include "util/ast-builders/classDefinitionBuilder.h"
19 #include "util/ast-builders/binaryExpressionBuilder.h"
20 #include "util/ast-builders/classPropertyBuilder.h"
21 #include "util/ast-builders/identifierBuilder.h"
22 #include "util/ast-builders/numberLiteralBuilder.h"
23 #include "util/ast-builders/awaitExpressionBuilder.h"
24 #include "util/ast-builders/bigintLiteralBuilder.h"
25 #include "util/ast-builders/blockExpressionBuilder.h"
26 #include "util/ast-builders/blockStatementBuilder.h"
27 #include "util/ast-builders/booleanLiteralBuilder.h"
28 #include "util/ast-builders/breakStatementBuilder.h"
29 #include "util/ast-builders/callExpressionBuilder.h"
30 #include "util/ast-builders/superExpressionBuilder.h"
31 #include "util/ast-builders/charLiteralBuilder.h"
32 #include "util/ast-builders/classDeclarationBuilder.h"
33 #include "util/ast-builders/etsTypeReferenceBuilder.h"
34 #include "util/ast-builders/etsTypeReferencePartBuilder.h"
35 #include "util/ast-builders/exportDefaultDeclarationBuilder.h"
36 #include "util/ast-builders/expressionStatementBuilder.h"
37 #include "util/ast-builders/ifStatementBuilder.h"
38 #include "util/ast-builders/memberExpressionBuilder.h"
39 #include "util/ast-builders/thisExpressionBuilder.h"
40 #include "util/ast-builders/methodDefinitionBuilder.h"
41 #include "util/ast-builders/functionExpressionBuilder.h"
42 #include "util/ast-builders/scriptFunctionBuilder.h"
43 #include "util/ast-builders/stringLiteralBuilder.h"
44 #include "util/ast-builders/switchStatementBuilder.h"
45 #include "util/ast-builders/tsClassImplementsBuilder.h"
46 #include "util/ast-builders/tsEnumDeclarationBuilder.h"
47 #include "util/ast-builders/tsEnumMemberBuilder.h"
48 #include "util/ast-builders/tsTypeParameterInstantiationBuilder.h"
49 #include "util/ast-builders/unaryExpressionBuilder.h"
50 #include "util/ast-builders/undefinedLiteralBuilder.h"
51 #include "util/ast-builders/updateExpressionBuilder.h"
52 #include "util/ast-builders/variableDeclarationBuilder.h"
53 #include "util/ast-builders/variableDeclaratorBuilder.h"
54 #include "util/ast-builders/whileStatementBuilder.h"
55 #include "util/ast-builders/switchCaseStatementBuilder.h"
56 
57 #include <gtest/gtest.h>
58 
59 using ark::es2panda::compiler::ast_verifier::InvariantNameSet;
60 using ark::es2panda::ir::AwaitExpressionBuilder;
61 using ark::es2panda::ir::BigIntLiteralBuilder;
62 using ark::es2panda::ir::BinaryExpressionBuilder;
63 using ark::es2panda::ir::BlockExpressionBuilder;
64 using ark::es2panda::ir::BlockStatementBuilder;
65 using ark::es2panda::ir::BooleanLiteralBuilder;
66 using ark::es2panda::ir::BreakStatementBuilder;
67 using ark::es2panda::ir::CallExpressionBuilder;
68 using ark::es2panda::ir::CharLiteralBuilder;
69 using ark::es2panda::ir::ClassDeclarationBuilder;
70 using ark::es2panda::ir::ClassDefinitionBuilder;
71 using ark::es2panda::ir::ClassPropertyBuilder;
72 using ark::es2panda::ir::ETSTypeReferenceBuilder;
73 using ark::es2panda::ir::ETSTypeReferencePartBuilder;
74 using ark::es2panda::ir::ExportDefaultDeclarationBuilder;
75 using ark::es2panda::ir::ExpressionStatementBuilder;
76 using ark::es2panda::ir::FunctionExpressionBuilder;
77 using ark::es2panda::ir::IdentifierBuilder;
78 using ark::es2panda::ir::IfStatementBuilder;
79 using ark::es2panda::ir::MemberExpressionBuilder;
80 using ark::es2panda::ir::MethodDefinitionBuilder;
81 using ark::es2panda::ir::NumberLiteralBuilder;
82 using ark::es2panda::ir::ScriptFunctionBuilder;
83 using ark::es2panda::ir::StringLiteralBuilder;
84 using ark::es2panda::ir::SuperExpressionBuilder;
85 using ark::es2panda::ir::SwitchCaseStatementBuilder;
86 using ark::es2panda::ir::SwitchStatementBuilder;
87 using ark::es2panda::ir::ThisExpressionBuilder;
88 using ark::es2panda::ir::TSClassImplementsBuilder;
89 using ark::es2panda::ir::TSEnumDeclarationBuilder;
90 using ark::es2panda::ir::TSEnumMemberBuilder;
91 using ark::es2panda::ir::TSTypeParameterInstantiationBuilder;
92 using ark::es2panda::ir::UnaryExpressionBuilder;
93 using ark::es2panda::ir::UndefinedLiteralBuilder;
94 using ark::es2panda::ir::UpdateExpressionBuilder;
95 using ark::es2panda::ir::VariableDeclarationBuilder;
96 using ark::es2panda::ir::VariableDeclaratorBuilder;
97 using ark::es2panda::ir::WhileStatementBuilder;
98 
99 namespace {
TEST_F(ASTVerifierTest,awaitExpressionBuild)100 TEST_F(ASTVerifierTest, awaitExpressionBuild)
101 {
102     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
103     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
104     auto binaryExpr = BinaryExpressionBuilder(Allocator())
105                           .SetLeft(left)
106                           .SetRight(right)
107                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
108                           .Build();
109     auto awaitExpr = AwaitExpressionBuilder(Allocator()).SetArgument(binaryExpr).Build();
110     ASSERT_TRUE(awaitExpr->IsAwaitExpression());
111 }
112 
TEST_F(ASTVerifierTest,bigintLiteralBuild)113 TEST_F(ASTVerifierTest, bigintLiteralBuild)
114 {
115     auto bigint = BigIntLiteralBuilder(Allocator()).SetValue("123").Build();
116     ASSERT_TRUE(bigint->IsBigIntLiteral());
117 }
118 
TEST_F(ASTVerifierTest,binaryExpressionBuild)119 TEST_F(ASTVerifierTest, binaryExpressionBuild)
120 {
121     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
122     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
123     auto binaryExpr = BinaryExpressionBuilder(Allocator())
124                           .SetLeft(left)
125                           .SetRight(right)
126                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
127                           .Build();
128     ASSERT_TRUE(binaryExpr->IsBinaryExpression());
129 }
130 
TEST_F(ASTVerifierTest,blockExpressionBuild)131 TEST_F(ASTVerifierTest, blockExpressionBuild)
132 {
133     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
134     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
135     auto binaryExpr = BinaryExpressionBuilder(Allocator())
136                           .SetLeft(left)
137                           .SetRight(right)
138                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
139                           .Build();
140     auto exprStmnt = ExpressionStatementBuilder(Allocator()).SetExpression(binaryExpr).Build();
141     auto blockExpr = BlockExpressionBuilder(Allocator()).AddStatement(exprStmnt).Build();
142     ASSERT_TRUE(blockExpr->IsBlockExpression());
143 }
144 
TEST_F(ASTVerifierTest,blockStatementBuild)145 TEST_F(ASTVerifierTest, blockStatementBuild)
146 {
147     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
148     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
149     auto binaryExpr = BinaryExpressionBuilder(Allocator())
150                           .SetLeft(left)
151                           .SetRight(right)
152                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
153                           .Build();
154     auto exprStmnt = ExpressionStatementBuilder(Allocator()).SetExpression(binaryExpr).Build();
155     auto blockStmnt = BlockStatementBuilder(Allocator()).AddStatement(exprStmnt).Build();
156     ASSERT_TRUE(blockStmnt->IsBlockStatement());
157 }
158 
TEST_F(ASTVerifierTest,booleanLiteralBuild)159 TEST_F(ASTVerifierTest, booleanLiteralBuild)
160 {
161     auto boolLiteral = BooleanLiteralBuilder(Allocator()).SetValue(true).Build();
162     ASSERT_TRUE(boolLiteral->IsBooleanLiteral());
163 }
164 
TEST_F(ASTVerifierTest,breakStatementBuild)165 TEST_F(ASTVerifierTest, breakStatementBuild)
166 {
167     auto breakStmnt = BreakStatementBuilder(Allocator()).Build();
168     ASSERT_TRUE(breakStmnt->IsBreakStatement());
169 }
170 
TEST_F(ASTVerifierTest,callExpressionBuild)171 TEST_F(ASTVerifierTest, callExpressionBuild)
172 {
173     auto superExpr = SuperExpressionBuilder(Allocator()).Build();
174     auto callExpr = CallExpressionBuilder(Allocator()).SetCallee(superExpr).Build();
175     ASSERT_TRUE(callExpr->IsCallExpression());
176 }
177 
TEST_F(ASTVerifierTest,charLiteralBuild)178 TEST_F(ASTVerifierTest, charLiteralBuild)
179 {
180     // Create char literal with default value u0000
181     auto charLiteral = CharLiteralBuilder(Allocator()).Build();
182     ASSERT_TRUE(charLiteral->IsCharLiteral());
183 }
184 
TEST_F(ASTVerifierTest,classDeclarationBuild)185 TEST_F(ASTVerifierTest, classDeclarationBuild)
186 {
187     auto id = IdentifierBuilder(Allocator()).SetName("a").Build();
188     auto number = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
189     auto classProperty = ClassPropertyBuilder(Allocator())
190                              .SetKey(id)
191                              .SetValue(number)
192                              .AddModifier(ark::es2panda::ir::ModifierFlags::PRIVATE)
193                              .Build();
194 
195     auto classDef = ClassDefinitionBuilder(Allocator()).SetIdentifier("A").AddProperty(classProperty).Build();
196     auto classDecl = ClassDeclarationBuilder(Allocator()).SetDefinition(classDef).Build();
197     ASSERT_TRUE(classDecl->IsClassDeclaration());
198 }
199 
TEST_F(ASTVerifierTest,etsTypeReferenceBuild)200 TEST_F(ASTVerifierTest, etsTypeReferenceBuild)
201 {
202     auto id = IdentifierBuilder(Allocator()).SetName("a").Build();
203     auto etsTypeReferencePart =
204         ETSTypeReferencePartBuilder(Allocator()).SetName(id).SetTypeParams(nullptr).SetPrev(nullptr).Build();
205     auto etsTypeReference = ETSTypeReferenceBuilder(Allocator()).SetETSTypeReferencePart(etsTypeReferencePart).Build();
206     ASSERT_TRUE(etsTypeReference->IsETSTypeReference());
207 }
208 
TEST_F(ASTVerifierTest,exportDefaultDeclarationBuild)209 TEST_F(ASTVerifierTest, exportDefaultDeclarationBuild)
210 {
211     auto id = IdentifierBuilder(Allocator()).SetName("a").Build();
212     auto number = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
213     auto classProperty = ClassPropertyBuilder(Allocator())
214                              .SetKey(id)
215                              .SetValue(number)
216                              .AddModifier(ark::es2panda::ir::ModifierFlags::PRIVATE)
217                              .Build();
218 
219     auto classDef = ClassDefinitionBuilder(Allocator()).SetIdentifier("A").AddProperty(classProperty).Build();
220     auto classDecl = ClassDeclarationBuilder(Allocator()).SetDefinition(classDef).Build();
221     auto exportDefaultDecl =
222         ExportDefaultDeclarationBuilder(Allocator()).SetDeclaration(classDecl).SetExportEquals(true).Build();
223     ASSERT_TRUE(exportDefaultDecl->IsExportDefaultDeclaration());
224 }
225 
TEST_F(ASTVerifierTest,expressionStatementBuild)226 TEST_F(ASTVerifierTest, expressionStatementBuild)
227 {
228     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
229     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
230     auto binaryExpr = BinaryExpressionBuilder(Allocator())
231                           .SetLeft(left)
232                           .SetRight(right)
233                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
234                           .Build();
235     auto exprStmnt = ExpressionStatementBuilder(Allocator()).SetExpression(binaryExpr).Build();
236     ASSERT_TRUE(exprStmnt->IsExpressionStatement());
237 }
238 
TEST_F(ASTVerifierTest,ifStatementBuild)239 TEST_F(ASTVerifierTest, ifStatementBuild)
240 {
241     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
242     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
243     auto binaryExpr = BinaryExpressionBuilder(Allocator())
244                           .SetLeft(left)
245                           .SetRight(right)
246                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
247                           .Build();
248     auto consStmnt = ExpressionStatementBuilder(Allocator()).SetExpression(binaryExpr).Build();
249     auto alterStmnt = ExpressionStatementBuilder(Allocator()).SetExpression(binaryExpr).Build();
250     auto ifStmnt =
251         IfStatementBuilder(Allocator()).SetTest(binaryExpr).SetConsequent(consStmnt).SetAlternate(alterStmnt).Build();
252     ASSERT_TRUE(ifStmnt->IsIfStatement());
253 }
254 
TEST_F(ASTVerifierTest,memberExpressionBuild)255 TEST_F(ASTVerifierTest, memberExpressionBuild)
256 {
257     auto member = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
258     auto thisExpr = ThisExpressionBuilder(Allocator()).Build();
259     auto memberExpression = MemberExpressionBuilder(Allocator())
260                                 .SetObject(thisExpr)
261                                 .SetProperty(member)
262                                 .SetKind(ark::es2panda::ir::MemberExpressionKind::PROPERTY_ACCESS)
263                                 .Build();
264     ASSERT_TRUE(memberExpression->IsMemberExpression());
265 }
266 
TEST_F(ASTVerifierTest,methodDefinitionBuild)267 TEST_F(ASTVerifierTest, methodDefinitionBuild)
268 {
269     auto id = IdentifierBuilder(Allocator()).SetName("a").Build();
270     ark::ArenaVector<ark::es2panda::ir::Expression *> params(Allocator()->Adapter());
271     auto signature = ark::es2panda::ir::FunctionSignature(nullptr, std::move(params), nullptr);
272     auto func = ScriptFunctionBuilder(Allocator()).SetSignature(&signature).Build();
273     auto funcExpr = FunctionExpressionBuilder(Allocator()).SetFunction(func).Build();
274     auto methodDef = MethodDefinitionBuilder(Allocator())
275                          .SetKey(id)
276                          .SetMethodDefinitionKind(ark::es2panda::ir::MethodDefinitionKind::METHOD)
277                          .SetModifierFlags(ark::es2panda::ir::ModifierFlags::PUBLIC)
278                          .SetValue(funcExpr)
279                          .Build();
280     ASSERT_TRUE(methodDef->IsMethodDefinition());
281 }
282 
TEST_F(ASTVerifierTest,stringLiteralBuild)283 TEST_F(ASTVerifierTest, stringLiteralBuild)
284 {
285     auto stringLiteral = StringLiteralBuilder(Allocator()).SetValue("qwe").Build();
286     ASSERT_TRUE(stringLiteral->IsStringLiteral());
287 }
288 
TEST_F(ASTVerifierTest,tsClassImplementsBuild)289 TEST_F(ASTVerifierTest, tsClassImplementsBuild)
290 {
291     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
292     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
293     auto binaryExpr = BinaryExpressionBuilder(Allocator())
294                           .SetLeft(left)
295                           .SetRight(right)
296                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
297                           .Build();
298     ark::ArenaVector<ark::es2panda::ir::TypeNode *> types(Allocator()->Adapter());
299     auto typeParams = TSTypeParameterInstantiationBuilder(Allocator()).SetParams(std::move(types)).Build();
300     auto tsClassImpl =
301         TSClassImplementsBuilder(Allocator()).SetExpression(binaryExpr).SetTypeParameters(typeParams).Build();
302     ASSERT_TRUE(tsClassImpl->IsTSClassImplements());
303 }
304 
TEST_F(ASTVerifierTest,switchStatementBuild)305 TEST_F(ASTVerifierTest, switchStatementBuild)
306 {
307     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
308     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
309     auto binaryExpr = BinaryExpressionBuilder(Allocator())
310                           .SetLeft(left)
311                           .SetRight(right)
312                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
313                           .Build();
314     auto consStmnt = ExpressionStatementBuilder(Allocator()).SetExpression(binaryExpr).Build();
315 
316     auto thisExpr = ThisExpressionBuilder(Allocator()).Build();
317     ark::ArenaVector<ark::es2panda::ir::SwitchCaseStatement *> cases(Allocator()->Adapter());
318     ark::ArenaVector<ark::es2panda::ir::Statement *> conseq(Allocator()->Adapter());
319     conseq.push_back(consStmnt);
320     auto switchCase = SwitchCaseStatementBuilder(Allocator()).SetTest(binaryExpr).SetConsequent(conseq).Build();
321     cases.push_back(switchCase);
322     auto switchStmnt = SwitchStatementBuilder(Allocator()).SetCases(cases).SetDiscriminant(thisExpr).Build();
323     ASSERT_TRUE(switchStmnt->IsSwitchStatement());
324 }
325 
TEST_F(ASTVerifierTest,enumBuild)326 TEST_F(ASTVerifierTest, enumBuild)
327 {
328     auto id = IdentifierBuilder(Allocator()).SetName("a").Build();
329     auto idMember = IdentifierBuilder(Allocator()).SetName("s").Build();
330     auto init = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
331     auto enumMember = TSEnumMemberBuilder(Allocator()).SetKey(idMember).SetInit(init).Build();
332     auto enumDecl = TSEnumDeclarationBuilder(Allocator())
333                         .SetKey(id)
334                         .SetIsConst(false)
335                         .SetIsDeclare(true)
336                         .SetIsConst(false)
337                         .AddMember(enumMember)
338                         .Build();
339     ASSERT_TRUE(enumDecl->IsTSEnumDeclaration());
340 }
341 
TEST_F(ASTVerifierTest,unaryExpressionBuild)342 TEST_F(ASTVerifierTest, unaryExpressionBuild)
343 {
344     auto id = IdentifierBuilder(Allocator()).SetName("a").Build();
345     auto unaryExpr = UnaryExpressionBuilder(Allocator())
346                          .SetArgument(id)
347                          .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_MINUS)
348                          .Build();
349     ASSERT_TRUE(unaryExpr->IsUnaryExpression());
350 }
351 
TEST_F(ASTVerifierTest,undefinedLiteralBuild)352 TEST_F(ASTVerifierTest, undefinedLiteralBuild)
353 {
354     auto undefLiteral = UndefinedLiteralBuilder(Allocator()).Build();
355     ASSERT_TRUE(undefLiteral->IsUndefinedLiteral());
356 }
357 
TEST_F(ASTVerifierTest,updateExpressionBuild)358 TEST_F(ASTVerifierTest, updateExpressionBuild)
359 {
360     auto id = IdentifierBuilder(Allocator()).SetName("a").Build();
361     auto updateExpr = UpdateExpressionBuilder(Allocator())
362                           .SetArgument(id)
363                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_MINUS_MINUS)
364                           .SetIsPrefix(true)
365                           .Build();
366     ASSERT_TRUE(updateExpr->IsUpdateExpression());
367 }
368 
TEST_F(ASTVerifierTest,VariableDeclarationBuild)369 TEST_F(ASTVerifierTest, VariableDeclarationBuild)
370 {
371     auto idDeclarator = IdentifierBuilder(Allocator()).SetName("a").Build();
372     auto init = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
373     auto varDeclarator = VariableDeclaratorBuilder(Allocator()).SetId(idDeclarator).SetInit(init).Build();
374     ark::ArenaVector<ark::es2panda::ir::VariableDeclarator *> declarators(Allocator()->Adapter());
375     declarators.push_back(varDeclarator);
376     auto varDecl = VariableDeclarationBuilder(Allocator())
377                        .SetDeclarators(std::move(declarators))
378                        .SetKind(ark::es2panda::ir::VariableDeclaration::VariableDeclarationKind::LET)
379                        .Build();
380     ASSERT_TRUE(varDecl->IsVariableDeclaration());
381 }
382 
TEST_F(ASTVerifierTest,whileStatementBuild)383 TEST_F(ASTVerifierTest, whileStatementBuild)
384 {
385     auto left = NumberLiteralBuilder(Allocator()).SetValue("10").Build();
386     auto right = NumberLiteralBuilder(Allocator()).SetValue("5").Build();
387     auto binaryExpr = BinaryExpressionBuilder(Allocator())
388                           .SetLeft(left)
389                           .SetRight(right)
390                           .SetOperator(ark::es2panda::lexer::TokenType::PUNCTUATOR_PLUS)
391                           .Build();
392     auto exprStmnt = ExpressionStatementBuilder(Allocator()).SetExpression(binaryExpr).Build();
393     auto whileStmnt = WhileStatementBuilder(Allocator()).SetTest(binaryExpr).SetBody(exprStmnt).Build();
394     ASSERT_TRUE(whileStmnt->IsWhileStatement());
395 }
396 }  // namespace
397