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