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