/* * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include "assembly-program.h" #include "test/unit/annotations/annotations_emit_test.h" namespace ark::es2panda::compiler::test { class AnnotationsforInterface : public AnnotationEmitTest { public: AnnotationsforInterface() = default; ~AnnotationsforInterface() override = default; void RunAnnotationEmitTest(const std::string_view text) { auto program = GetCurrentProgram(text); ASSERT_NE(program, nullptr); CheckAnnotations(program.get()); CheckInterfaceAnnotations(program.get()); CheckFunctionAnnotations(program.get()); } void CheckAnnotations(pandasm::Program *program) { const std::string annoName = "Anno"; const std::vector> expectedAnnotations = { { {"authorName", ""}, {"authorAge", "0"}, {"testBool", "0"}, }, }; AnnotationEmitTest::CheckAnnoDecl(program, annoName, expectedAnnotations); } void CheckInterfaceAnnotations(pandasm::Program *program) { const std::string recordName = "A"; const AnnotationMap expectedClassAnnotations = { {"Anno", { {"authorName", "Mike"}, {"authorAge", "18"}, {"testBool", "1"}, }}, }; AnnotationEmitTest::CheckRecordAnnotations(program, recordName, expectedClassAnnotations); } void CheckFunctionAnnotations(pandasm::Program *program) { const std::string getter = "A.x:i32;"; const std::string setter = "A.x:i32;void;"; const std::string funcName = "A.foo:void;"; const AnnotationMap expectedFuncAnnotations1 = { {"Anno", { {"authorName", ""}, {"authorAge", "0"}, {"testBool", "0"}, }}, }; const AnnotationMap expectedFuncAnnotations2 = { {"Anno", { {"authorName", "John"}, {"authorAge", "23"}, {"testBool", "0"}, }}, }; AnnotationEmitTest::CheckFunctionAnnotations(program, getter, false, expectedFuncAnnotations1); AnnotationEmitTest::CheckFunctionAnnotations(program, setter, false, expectedFuncAnnotations1); AnnotationEmitTest::CheckFunctionAnnotations(program, funcName, false, expectedFuncAnnotations2); } private: NO_COPY_SEMANTIC(AnnotationsforInterface); NO_MOVE_SEMANTIC(AnnotationsforInterface); }; TEST_F(AnnotationsforInterface, annotations_for_interface) { std::string_view text = R"( @interface Anno { authorName: string = "" authorAge: int = 0 testBool: boolean = false } @Anno({ authorName: "Mike", authorAge: 18, testBool: true }) interface A { @Anno x:int @Anno({ authorName: "John", authorAge: 23, testBool: false }) foo() })"; RunAnnotationEmitTest(text); } } // namespace ark::es2panda::compiler::test