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 "checker/ETSchecker.h"
18 #include "ir/astNode.h"
19
20 #include <gtest/gtest.h>
21
22 using ark::es2panda::checker::ETSChecker;
23 using ark::es2panda::compiler::ast_verifier::ASTVerifier;
24 using ark::es2panda::compiler::ast_verifier::InvariantNameSet;
25 using ark::es2panda::ir::AstNode;
26
27 namespace {
TEST_F(ASTVerifierTest, ValidateCorrectGetterSetter)28 TEST_F(ASTVerifierTest, ValidateCorrectGetterSetter)
29 {
30 ETSChecker checker {};
31 ASTVerifier verifier {Allocator()};
32
33 char const *text =
34 R"(
35 class A {
36 private _value: number = 0;
37 set value(v: number): void {
38 this._value = v
39 }
40
41 get value(): number {
42 return this._value
43 }
44 }
45 )";
46
47 es2panda_Context *ctx = impl_->CreateContextFromString(cfg_, text, "dummy.ets");
48 impl_->ProceedToState(ctx, ES2PANDA_STATE_LOWERED);
49 ASSERT_EQ(impl_->ContextState(ctx), ES2PANDA_STATE_LOWERED);
50
51 auto *ast = reinterpret_cast<AstNode *>(impl_->ProgramAst(impl_->ContextProgram(ctx)));
52
53 InvariantNameSet checks;
54 checks.insert("GetterSetterValidationForAll");
55 const auto &messages = verifier.Verify(ast, checks);
56
57 // Expecting no warnings
58 ASSERT_EQ(messages.size(), 0);
59
60 impl_->DestroyContext(ctx);
61 }
62
TEST_F(ASTVerifierTest, ValidateAbstractGettersSetters)63 TEST_F(ASTVerifierTest, ValidateAbstractGettersSetters)
64 {
65 ETSChecker checker {};
66 ASTVerifier verifier {Allocator()};
67
68 char const *text =
69 R"(
70 abstract class AbstractClass {
71 private _value: int;
72 abstract set value(v: int);
73 abstract get value(): int;
74 }
75 )";
76
77 es2panda_Context *ctx = impl_->CreateContextFromString(cfg_, text, "dummy.ets");
78 impl_->ProceedToState(ctx, ES2PANDA_STATE_LOWERED);
79 ASSERT_EQ(impl_->ContextState(ctx), ES2PANDA_STATE_LOWERED);
80
81 auto *ast = reinterpret_cast<AstNode *>(impl_->ProgramAst(impl_->ContextProgram(ctx)));
82
83 InvariantNameSet checks;
84 checks.insert("GetterSetterValidationForAll");
85 const auto &messages = verifier.Verify(ast, checks);
86
87 // Expecting no warnings
88 ASSERT_EQ(messages.size(), 0);
89
90 impl_->DestroyContext(ctx);
91 }
92
TEST_F(ASTVerifierTest, ValidateAmbientGettersSetters)93 TEST_F(ASTVerifierTest, ValidateAmbientGettersSetters)
94 {
95 ETSChecker checker {};
96 ASTVerifier verifier {Allocator()};
97
98 char const *text =
99 R"(
100 declare class A {
101 get foo(): int
102 set foo(x: int): void
103 }
104 )";
105
106 es2panda_Context *ctx = impl_->CreateContextFromString(cfg_, text, "dummy.ets");
107 impl_->ProceedToState(ctx, ES2PANDA_STATE_LOWERED);
108 ASSERT_EQ(impl_->ContextState(ctx), ES2PANDA_STATE_LOWERED);
109
110 auto *ast = reinterpret_cast<AstNode *>(impl_->ProgramAst(impl_->ContextProgram(ctx)));
111
112 InvariantNameSet checks;
113 checks.insert("GetterSetterValidationForAll");
114 const auto &messages = verifier.Verify(ast, checks);
115
116 // Expecting no warnings
117 ASSERT_EQ(messages.size(), 0);
118
119 impl_->DestroyContext(ctx);
120 }
121 } // anonymous namespace
122