• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 #ifndef ECMASCRIPT_TS_TYPES_TESTS_TS_TYPE_TEST_HELPER_H
17 #define ECMASCRIPT_TS_TYPES_TESTS_TS_TYPE_TEST_HELPER_H
18 
19 #include "assembler/assembly-parser.h"
20 #include "ecmascript/tests/test_helper.h"
21 
22 namespace panda::test {
23 using namespace panda::ecmascript;
24 using namespace panda::panda_file;
25 using namespace panda::pandasm;
26 using LiteralValueType = std::variant<uint8_t, uint32_t, std::string>;
27 
28 class TSTypeTestHelper {
29 public:
AddLiteral(pandasm::Program & program,const std::string & literalId,const std::vector<panda_file::LiteralTag> & tags,const std::vector<LiteralValueType> & values)30     static void AddLiteral(pandasm::Program &program, const std::string &literalId,
31                            const std::vector<panda_file::LiteralTag> &tags,
32                            const std::vector<LiteralValueType> &values)
33     {
34         EXPECT_EQ(tags.size(), values.size());
35         std::vector<pandasm::LiteralArray::Literal> literal {};
36         for (uint32_t i = 0; i < tags.size(); i++) {
37             AddTagValue(literal, tags[i], values[i]);
38         }
39         pandasm::LiteralArray literalArray(literal);
40         program.literalarray_table.emplace(literalId, literalArray);
41     }
42 
AddTypeSummary(pandasm::Program & program,const std::vector<std::string> & typeIds)43     static void AddTypeSummary(pandasm::Program &program, const std::vector<std::string> &typeIds)
44     {
45         const std::string typeSummaryId("test_0");
46         AddSummaryLiteral(program, typeSummaryId, typeIds);
47 
48         const std::string testStr("test");
49         auto iter = program.record_table.find(testStr);
50         EXPECT_NE(iter, program.record_table.end());
51         if (iter != program.record_table.end()) {
52             auto &rec = iter->second;
53             auto typeSummaryIndexField = pandasm::Field(pandasm::extensions::Language::ECMASCRIPT);
54             typeSummaryIndexField.name = "typeSummaryOffset";
55             typeSummaryIndexField.type = pandasm::Type("u32", 0);
56             typeSummaryIndexField.metadata->SetValue(
57                 pandasm::ScalarValue::Create<pandasm::Value::Type::LITERALARRAY>(typeSummaryId));
58             rec.field_list.emplace_back(std::move(typeSummaryIndexField));
59         }
60     }
61 
AddCommonJsField(pandasm::Program & program)62     static void AddCommonJsField(pandasm::Program &program)
63     {
64         const std::string testStr("test");
65         auto iter = program.record_table.find(testStr);
66         EXPECT_NE(iter, program.record_table.end());
67         if (iter != program.record_table.end()) {
68             auto &rec = iter->second;
69             auto isCommonJsField = pandasm::Field(pandasm::extensions::Language::ECMASCRIPT);
70             isCommonJsField.name = "isCommonjs";
71             isCommonJsField.type = pandasm::Type("u8", 0);
72             isCommonJsField.metadata->SetValue(
73                 pandasm::ScalarValue::Create<pandasm::Value::Type::U8>(static_cast<uint8_t>(false)));
74             rec.field_list.emplace_back(std::move(isCommonJsField));
75         }
76     }
77 
78 private:
AddTagValue(std::vector<LiteralArray::Literal> & literalArray,const panda_file::LiteralTag tag,const LiteralValueType & value)79     static void AddTagValue(std::vector<LiteralArray::Literal> &literalArray,
80                             const panda_file::LiteralTag tag,
81                             const LiteralValueType &value)
82     {
83         pandasm::LiteralArray::Literal literalTag;
84         literalTag.tag_ = panda_file::LiteralTag::TAGVALUE;
85         literalTag.value_ = static_cast<uint8_t>(tag);
86         literalArray.emplace_back(std::move(literalTag));
87 
88         pandasm::LiteralArray::Literal literalValue;
89         literalValue.tag_ = tag;
90 
91         switch (tag) {
92             case panda_file::LiteralTag::INTEGER: {
93                 literalValue.value_ = std::get<uint32_t>(value);
94                 break;
95             }
96             case panda_file::LiteralTag::BUILTINTYPEINDEX: {
97                 literalValue.value_ = std::get<uint8_t>(value);
98                 break;
99             }
100             case panda_file::LiteralTag::STRING: {
101                 literalValue.value_ = std::get<std::string>(value);
102                 break;
103             }
104             case panda_file::LiteralTag::LITERALARRAY: {
105                 literalValue.value_ = std::get<std::string>(value);
106                 break;
107             }
108             default: {
109                 EXPECT_FALSE(true);
110             }
111         }
112 
113         literalArray.emplace_back(std::move(literalValue));
114     }
115 
AddSummaryLiteral(pandasm::Program & program,const std::string & typeSummaryId,const std::vector<std::string> & typeIds)116     static void AddSummaryLiteral(pandasm::Program &program, const std::string &typeSummaryId,
117                                   const std::vector<std::string> &typeIds)
118     {
119         uint32_t numOfTypes = typeIds.size();
120         std::vector<panda_file::LiteralTag> typeSummaryTags { panda_file::LiteralTag::INTEGER };
121         std::vector<LiteralValueType> typeSummaryValues { numOfTypes };
122         for (uint32_t i = 0; i < numOfTypes; i++) {
123             typeSummaryTags.emplace_back(panda_file::LiteralTag::LITERALARRAY);
124             typeSummaryValues.emplace_back(typeIds[i]);
125         }
126         typeSummaryTags.emplace_back(panda_file::LiteralTag::INTEGER);
127         typeSummaryValues.emplace_back(static_cast<uint32_t>(0U));
128         AddLiteral(program, typeSummaryId, typeSummaryTags, typeSummaryValues);
129     }
130 };
131 }  // namespace panda::test
132 #endif  // ECMASCRIPT_TS_TYPES_TESTS_TS_TYPE_TEST_HELPER_H
133