14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#include <cstdio> 174514f5e3Sopenharmony_ci 184514f5e3Sopenharmony_ci#include "ecmascript/extractortool/src/source_map.h" 194514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h" 204514f5e3Sopenharmony_ci 214514f5e3Sopenharmony_ciusing namespace panda::ecmascript; 224514f5e3Sopenharmony_ciconst std::string sourceMapData = 234514f5e3Sopenharmony_ci "{\n" 244514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ts\": {\n" 254514f5e3Sopenharmony_ci " \"version\": 3,\n" 264514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 274514f5e3Sopenharmony_ci " \"sources\": [\n" 284514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ets\"\n" 294514f5e3Sopenharmony_ci " ],\n" 304514f5e3Sopenharmony_ci " \"names\": [],\n" 314514f5e3Sopenharmony_ci " \"mappings\": \";MAEO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 324514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 334514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAFZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 344514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 354514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 364514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA;;sDAG2B,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 374514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAHxC,CAAA,CAAA,CAAA," 384514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;QAGS,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;QAAP,CAAO," 394514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAEd,CAAA," 404514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;" 414514f5e3Sopenharmony_ci "YACE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAAH,CAAG,CAAA,CAAA,CAQF,CAAM," 424514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;gBARd,CAAG,CAAA,CAAA,CAAA,CAAA," 434514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;YACD,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 444514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA;YAAN,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAKL,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA," 454514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;gBALb,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;" 464514f5e3Sopenharmony_ci ";;;;;YACJ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA," 474514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAAjB,CAAI,CAAA,CAAA,CAAA,CACD,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 484514f5e3Sopenharmony_ci "CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA;AADd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 494514f5e3Sopenharmony_ci "CAAA,CAAA,CAAI,CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 504514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAU,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;gBAF7B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 514514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA;;;;QAAJ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QADN,CAAM,CAAA,CAAA," 524514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QADR,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 534514f5e3Sopenharmony_ci "CAAA;AASJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;\"\n" 544514f5e3Sopenharmony_ci " }\n" 554514f5e3Sopenharmony_ci "}"; 564514f5e3Sopenharmony_ciconst std::string sourceMapDataWithoutSources = 574514f5e3Sopenharmony_ci "{\n" 584514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ts\": {\n" 594514f5e3Sopenharmony_ci " \"version\": 3,\n" 604514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 614514f5e3Sopenharmony_ci " \"sources\": [],\n" 624514f5e3Sopenharmony_ci " \"names\": [],\n" 634514f5e3Sopenharmony_ci " \"mappings\": \";MAEO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA," 644514f5e3Sopenharmony_ci "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;\"\n" 654514f5e3Sopenharmony_ci " }\n" 664514f5e3Sopenharmony_ci "}"; 674514f5e3Sopenharmony_ciconst std::string sourceMapDataWithShortMappings = 684514f5e3Sopenharmony_ci "{\n" 694514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ts\": {\n" 704514f5e3Sopenharmony_ci " \"version\": 3,\n" 714514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 724514f5e3Sopenharmony_ci " \"sources\": [\n" 734514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ets\"\n" 744514f5e3Sopenharmony_ci " ],\n" 754514f5e3Sopenharmony_ci " \"names\": [],\n" 764514f5e3Sopenharmony_ci " \"mappings\": \"\n" 774514f5e3Sopenharmony_ci " }\n" 784514f5e3Sopenharmony_ci "}"; 794514f5e3Sopenharmony_ciconst std::string sourceMapDataWithInvalidMappings1 = 804514f5e3Sopenharmony_ci "{\n" 814514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ts\": {\n" 824514f5e3Sopenharmony_ci " \"version\": 3,\n" 834514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 844514f5e3Sopenharmony_ci " \"sources\": [\n" 854514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ets\"\n" 864514f5e3Sopenharmony_ci " ],\n" 874514f5e3Sopenharmony_ci " \"names\": [],\n" 884514f5e3Sopenharmony_ci " \"mappings\": pA;\n" 894514f5e3Sopenharmony_ci " }\n" 904514f5e3Sopenharmony_ci "}"; 914514f5e3Sopenharmony_ciconst std::string sourceMapDataWithInvalidMappings2 = 924514f5e3Sopenharmony_ci "{\n" 934514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ts\": {\n" 944514f5e3Sopenharmony_ci " \"version\": 3,\n" 954514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 964514f5e3Sopenharmony_ci " \"sources\": [\n" 974514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ets\"\n" 984514f5e3Sopenharmony_ci " ],\n" 994514f5e3Sopenharmony_ci " \"names\": [],\n" 1004514f5e3Sopenharmony_ci " \"mappings\": pAq;ABCD;abcd;0123;0+/-;\n" 1014514f5e3Sopenharmony_ci " }\n" 1024514f5e3Sopenharmony_ci "}"; 1034514f5e3Sopenharmony_ciconst std::string sourceMapDataWithInvalidMappings3 = 1044514f5e3Sopenharmony_ci "{\n" 1054514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ts\": {\n" 1064514f5e3Sopenharmony_ci " \"version\": 3,\n" 1074514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 1084514f5e3Sopenharmony_ci " \"sources\": [\n" 1094514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ets\"\n" 1104514f5e3Sopenharmony_ci " ],\n" 1114514f5e3Sopenharmony_ci " \"names\": [],\n" 1124514f5e3Sopenharmony_ci " \"mappings\": X;\n" 1134514f5e3Sopenharmony_ci " }\n" 1144514f5e3Sopenharmony_ci "}"; 1154514f5e3Sopenharmony_ciconst std::string sourceMapDataWithInvalidMappings4 = 1164514f5e3Sopenharmony_ci "{\n" 1174514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ts\": {\n" 1184514f5e3Sopenharmony_ci " \"version\": 3,\n" 1194514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 1204514f5e3Sopenharmony_ci " \"sources\": [\n" 1214514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ets\"\n" 1224514f5e3Sopenharmony_ci " ],\n" 1234514f5e3Sopenharmony_ci " \"names\": [],\n" 1244514f5e3Sopenharmony_ci " \"mappings\": A;\n" 1254514f5e3Sopenharmony_ci " }\n" 1264514f5e3Sopenharmony_ci "}"; 1274514f5e3Sopenharmony_ciconst std::string sourceMapDataWithInvalidMappings5 = 1284514f5e3Sopenharmony_ci "{\n" 1294514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ts\": {\n" 1304514f5e3Sopenharmony_ci " \"version\": 3,\n" 1314514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 1324514f5e3Sopenharmony_ci " \"sources\": [\n" 1334514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.ets\"\n" 1344514f5e3Sopenharmony_ci " ],\n" 1354514f5e3Sopenharmony_ci " \"names\": [],\n" 1364514f5e3Sopenharmony_ci " \"mappings\": ;\n" 1374514f5e3Sopenharmony_ci " }\n" 1384514f5e3Sopenharmony_ci "}"; 1394514f5e3Sopenharmony_ciconst std::string sourceMapDataWithJsSources = 1404514f5e3Sopenharmony_ci "{\n" 1414514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.js\": {\n" 1424514f5e3Sopenharmony_ci " \"version\": 3,\n" 1434514f5e3Sopenharmony_ci " \"file\": \"Index.ets\",\n" 1444514f5e3Sopenharmony_ci " \"sources\": [\n" 1454514f5e3Sopenharmony_ci " \"entry/src/main/ets/pages/Index.js\"\n" 1464514f5e3Sopenharmony_ci " ],\n" 1474514f5e3Sopenharmony_ci " \"names\": [],\n" 1484514f5e3Sopenharmony_ci " \"mappings\": ;\n" 1494514f5e3Sopenharmony_ci " }\n" 1504514f5e3Sopenharmony_ci "}"; 1514514f5e3Sopenharmony_ci 1524514f5e3Sopenharmony_cinamespace panda::ecmascript { 1534514f5e3Sopenharmony_ciclass SourceMapFriend { 1544514f5e3Sopenharmony_cipublic: 1554514f5e3Sopenharmony_ci uint32_t Base64CharToInt(char charCode) 1564514f5e3Sopenharmony_ci { 1574514f5e3Sopenharmony_ci return sourceMap.Base64CharToInt(charCode); 1584514f5e3Sopenharmony_ci } 1594514f5e3Sopenharmony_ci 1604514f5e3Sopenharmony_ci void SplitSourceMap(const std::string &sourceMapData) 1614514f5e3Sopenharmony_ci { 1624514f5e3Sopenharmony_ci sourceMap.SplitSourceMap(sourceMapData); 1634514f5e3Sopenharmony_ci } 1644514f5e3Sopenharmony_ci 1654514f5e3Sopenharmony_ci void ExtractSourceMapData(const std::string &allmappings, std::shared_ptr<SourceMapData> &curMapData) 1664514f5e3Sopenharmony_ci { 1674514f5e3Sopenharmony_ci sourceMap.ExtractSourceMapData(allmappings, curMapData); 1684514f5e3Sopenharmony_ci } 1694514f5e3Sopenharmony_ci 1704514f5e3Sopenharmony_ci MappingInfo Find(int32_t row, int32_t col, const SourceMapData &targetMap, bool& isReplaces) 1714514f5e3Sopenharmony_ci { 1724514f5e3Sopenharmony_ci return sourceMap.Find(row, col, targetMap, isReplaces); 1734514f5e3Sopenharmony_ci } 1744514f5e3Sopenharmony_ci 1754514f5e3Sopenharmony_ci void ExtractKeyInfo(const std::string &aSourceMap, std::vector<std::string> &sourceKeyInfo) 1764514f5e3Sopenharmony_ci { 1774514f5e3Sopenharmony_ci sourceMap.ExtractKeyInfo(aSourceMap, sourceKeyInfo); 1784514f5e3Sopenharmony_ci } 1794514f5e3Sopenharmony_ci 1804514f5e3Sopenharmony_ci void GetPosInfo(const std::string &temp, int32_t start, std::string &line, std::string &column) 1814514f5e3Sopenharmony_ci { 1824514f5e3Sopenharmony_ci sourceMap.GetPosInfo(temp, start, line, column); 1834514f5e3Sopenharmony_ci } 1844514f5e3Sopenharmony_ci 1854514f5e3Sopenharmony_ci std::vector<std::string> HandleMappings(const std::string &mapping) 1864514f5e3Sopenharmony_ci { 1874514f5e3Sopenharmony_ci return sourceMap.HandleMappings(mapping); 1884514f5e3Sopenharmony_ci } 1894514f5e3Sopenharmony_ci 1904514f5e3Sopenharmony_ci bool VlqRevCode(const std::string &vStr, std::vector<int32_t> &ans) 1914514f5e3Sopenharmony_ci { 1924514f5e3Sopenharmony_ci return sourceMap.VlqRevCode(vStr, ans); 1934514f5e3Sopenharmony_ci } 1944514f5e3Sopenharmony_ci 1954514f5e3Sopenharmony_ci bool TranslateUrlPositionBySourceMap(std::string &url, int &line, int &column) 1964514f5e3Sopenharmony_ci { 1974514f5e3Sopenharmony_ci return sourceMap.TranslateUrlPositionBySourceMap(url, line, column); 1984514f5e3Sopenharmony_ci } 1994514f5e3Sopenharmony_ci 2004514f5e3Sopenharmony_ci bool GetLineAndColumnNumbers(int &line, int &column, SourceMapData &targetMap, bool& isReplaces) 2014514f5e3Sopenharmony_ci { 2024514f5e3Sopenharmony_ci return sourceMap.GetLineAndColumnNumbers(line, column, targetMap, isReplaces); 2034514f5e3Sopenharmony_ci } 2044514f5e3Sopenharmony_ci 2054514f5e3Sopenharmony_ciprivate: 2064514f5e3Sopenharmony_ci SourceMap sourceMap; 2074514f5e3Sopenharmony_ci}; 2084514f5e3Sopenharmony_ci} 2094514f5e3Sopenharmony_ci 2104514f5e3Sopenharmony_cinamespace panda::test { 2114514f5e3Sopenharmony_ciclass SourceMapTest : public testing::Test { 2124514f5e3Sopenharmony_cipublic: 2134514f5e3Sopenharmony_ci static void SetUpTestCase() 2144514f5e3Sopenharmony_ci { 2154514f5e3Sopenharmony_ci GTEST_LOG_(INFO) << "SetUpTestCase"; 2164514f5e3Sopenharmony_ci } 2174514f5e3Sopenharmony_ci 2184514f5e3Sopenharmony_ci static void TearDownTestCase() 2194514f5e3Sopenharmony_ci { 2204514f5e3Sopenharmony_ci GTEST_LOG_(INFO) << "TearDownCase"; 2214514f5e3Sopenharmony_ci } 2224514f5e3Sopenharmony_ci 2234514f5e3Sopenharmony_ci void SetUp() override 2244514f5e3Sopenharmony_ci { 2254514f5e3Sopenharmony_ci TestHelper::CreateEcmaVMWithScope(instance, thread, scope); 2264514f5e3Sopenharmony_ci instance->SetEnableForceGC(false); 2274514f5e3Sopenharmony_ci } 2284514f5e3Sopenharmony_ci 2294514f5e3Sopenharmony_ci void TearDown() override 2304514f5e3Sopenharmony_ci { 2314514f5e3Sopenharmony_ci TestHelper::DestroyEcmaVMWithScope(instance, scope); 2324514f5e3Sopenharmony_ci } 2334514f5e3Sopenharmony_ci 2344514f5e3Sopenharmony_ci EcmaVM *instance{nullptr}; 2354514f5e3Sopenharmony_ci EcmaHandleScope *scope{nullptr}; 2364514f5e3Sopenharmony_ci JSThread *thread{nullptr}; 2374514f5e3Sopenharmony_ci}; 2384514f5e3Sopenharmony_ci 2394514f5e3Sopenharmony_ciuint8_t *StringToUint8(const std::string &str) 2404514f5e3Sopenharmony_ci{ 2414514f5e3Sopenharmony_ci const auto *data = reinterpret_cast<const uint8_t *>(str.c_str()); 2424514f5e3Sopenharmony_ci return const_cast<uint8_t *>(data); 2434514f5e3Sopenharmony_ci} 2444514f5e3Sopenharmony_ci 2454514f5e3Sopenharmony_ciSourceMap TestInit(const std::string &sourceMapData) 2464514f5e3Sopenharmony_ci{ 2474514f5e3Sopenharmony_ci uint8_t *data = StringToUint8(sourceMapData); 2484514f5e3Sopenharmony_ci size_t dataSize = sourceMapData.size(); 2494514f5e3Sopenharmony_ci SourceMap sourceMap; 2504514f5e3Sopenharmony_ci sourceMap.Init(const_cast<uint8_t *>(data), dataSize); 2514514f5e3Sopenharmony_ci return sourceMap; 2524514f5e3Sopenharmony_ci} 2534514f5e3Sopenharmony_ci 2544514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, TranslateUrlPositionBySourceMapTest) 2554514f5e3Sopenharmony_ci{ 2564514f5e3Sopenharmony_ci SourceMap sourceMap; 2574514f5e3Sopenharmony_ci int line = 10, column = 5; 2584514f5e3Sopenharmony_ci std::string url = "test.js"; 2594514f5e3Sopenharmony_ci // if url contains ".js" returns true 2604514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2614514f5e3Sopenharmony_ci 2624514f5e3Sopenharmony_ci // if it can't find sources which match url after init, returns false and throw Translate failed 2634514f5e3Sopenharmony_ci // e.g. 1. sourceMapData is valid, but url is not valid; 2644514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapData); 2654514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index1.ts"; 2664514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2674514f5e3Sopenharmony_ci 2684514f5e3Sopenharmony_ci // e.g. 2. sourceMapData is not valid 2694514f5e3Sopenharmony_ci sourceMap = TestInit("testInvalidSourceMapData"); 2704514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 2714514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2724514f5e3Sopenharmony_ci 2734514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapDataWithoutSources); 2744514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 2754514f5e3Sopenharmony_ci EXPECT_TRUE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2764514f5e3Sopenharmony_ci 2774514f5e3Sopenharmony_ci // if mappings is too short(<18), it will throw translate failed 2784514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapDataWithShortMappings); 2794514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 2804514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2814514f5e3Sopenharmony_ci 2824514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapData); 2834514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 2844514f5e3Sopenharmony_ci EXPECT_TRUE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2854514f5e3Sopenharmony_ci 2864514f5e3Sopenharmony_ci // if sourceMapData was used twice, sourceMap should cache url/modularMap 2874514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2884514f5e3Sopenharmony_ci 2894514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapDataWithInvalidMappings1); 2904514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 2914514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2924514f5e3Sopenharmony_ci 2934514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapDataWithInvalidMappings2); 2944514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 2954514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 2964514f5e3Sopenharmony_ci 2974514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapDataWithInvalidMappings3); 2984514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 2994514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 3004514f5e3Sopenharmony_ci 3014514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapDataWithInvalidMappings4); 3024514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 3034514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 3044514f5e3Sopenharmony_ci 3054514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapDataWithInvalidMappings5); 3064514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 3074514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 3084514f5e3Sopenharmony_ci 3094514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapData); 3104514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 3114514f5e3Sopenharmony_ci line = 0, column = 5; 3124514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 3134514f5e3Sopenharmony_ci 3144514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapData); 3154514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.ts"; 3164514f5e3Sopenharmony_ci line = 5, column = 0; 3174514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 3184514f5e3Sopenharmony_ci 3194514f5e3Sopenharmony_ci // if sourceMapData is valid and url is end by ".js", it should return true 3204514f5e3Sopenharmony_ci url = "entry/src/main/ets/pages/Index.js"; 3214514f5e3Sopenharmony_ci sourceMap = TestInit(sourceMapDataWithJsSources); 3224514f5e3Sopenharmony_ci EXPECT_TRUE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column)); 3234514f5e3Sopenharmony_ci} 3244514f5e3Sopenharmony_ci 3254514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, Base64CharToIntTest) 3264514f5e3Sopenharmony_ci{ 3274514f5e3Sopenharmony_ci SourceMapFriend sourceMapFriend; 3284514f5e3Sopenharmony_ci EXPECT_EQ(sourceMapFriend.Base64CharToInt('A'), 0); 3294514f5e3Sopenharmony_ci EXPECT_EQ(sourceMapFriend.Base64CharToInt('a'), 26); 3304514f5e3Sopenharmony_ci EXPECT_EQ(sourceMapFriend.Base64CharToInt('0'), 52); 3314514f5e3Sopenharmony_ci EXPECT_EQ(sourceMapFriend.Base64CharToInt('+'), 62); 3324514f5e3Sopenharmony_ci EXPECT_EQ(sourceMapFriend.Base64CharToInt('/'), 63); 3334514f5e3Sopenharmony_ci EXPECT_EQ(sourceMapFriend.Base64CharToInt('-'), 64); 3344514f5e3Sopenharmony_ci} 3354514f5e3Sopenharmony_ci 3364514f5e3Sopenharmony_civoid PrintSourceMapData(const SourceMapData &data) 3374514f5e3Sopenharmony_ci{ 3384514f5e3Sopenharmony_ci std::cout << "URL: " << data.url_ << std::endl; 3394514f5e3Sopenharmony_ci std::cout << "Now Position: (" << data.nowPos_.afterRow << ", " << data.nowPos_.afterColumn << ")" << std::endl; 3404514f5e3Sopenharmony_ci 3414514f5e3Sopenharmony_ci std::cout << "Files:" << std::endl; 3424514f5e3Sopenharmony_ci for (const auto &file: data.files_) { 3434514f5e3Sopenharmony_ci std::cout << "- " << file << std::endl; 3444514f5e3Sopenharmony_ci } 3454514f5e3Sopenharmony_ci 3464514f5e3Sopenharmony_ci std::cout << "Sources:" << std::endl; 3474514f5e3Sopenharmony_ci for (const auto &source: data.sources_) { 3484514f5e3Sopenharmony_ci std::cout << "- " << source << std::endl; 3494514f5e3Sopenharmony_ci } 3504514f5e3Sopenharmony_ci 3514514f5e3Sopenharmony_ci std::cout << "Names:" << std::endl; 3524514f5e3Sopenharmony_ci for (const auto &name: data.names_) { 3534514f5e3Sopenharmony_ci std::cout << "- " << name << std::endl; 3544514f5e3Sopenharmony_ci } 3554514f5e3Sopenharmony_ci 3564514f5e3Sopenharmony_ci std::cout << "Mappings:" << std::endl; 3574514f5e3Sopenharmony_ci for (const auto &mapping: data.mappings_) { 3584514f5e3Sopenharmony_ci std::cout << "- " << mapping << std::endl; 3594514f5e3Sopenharmony_ci } 3604514f5e3Sopenharmony_ci 3614514f5e3Sopenharmony_ci std::cout << "After Positions:" << std::endl; 3624514f5e3Sopenharmony_ci for (const auto &pos: data.afterPos_) { 3634514f5e3Sopenharmony_ci std::cout << "- (" << pos.beforeRow << ", " << pos.beforeColumn << ", " << pos.afterRow << ", " 3644514f5e3Sopenharmony_ci << pos.afterColumn << ")" << std::endl; 3654514f5e3Sopenharmony_ci } 3664514f5e3Sopenharmony_ci} 3674514f5e3Sopenharmony_ci 3684514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, ExtractSourceMapDataTest) 3694514f5e3Sopenharmony_ci{ 3704514f5e3Sopenharmony_ci SourceMapFriend sourceMapFriend; 3714514f5e3Sopenharmony_ci std::string mappings = ";MAEO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA"; 3724514f5e3Sopenharmony_ci auto sourceMapDataInstance = std::make_shared<SourceMapData>(); 3734514f5e3Sopenharmony_ci std::shared_ptr<SourceMapData> &curMapData = sourceMapDataInstance; 3744514f5e3Sopenharmony_ci 3754514f5e3Sopenharmony_ci sourceMapFriend.ExtractSourceMapData(mappings, curMapData); 3764514f5e3Sopenharmony_ci SourceMapData &data = *curMapData; 3774514f5e3Sopenharmony_ci EXPECT_EQ(data.afterPos_.size(), 13); 3784514f5e3Sopenharmony_ci} 3794514f5e3Sopenharmony_ci 3804514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, FindTest) 3814514f5e3Sopenharmony_ci{ 3824514f5e3Sopenharmony_ci // Find Full Covered 3834514f5e3Sopenharmony_ci SourceMapFriend sourceMapFriend; 3844514f5e3Sopenharmony_ci SourceMapData targetMap; 3854514f5e3Sopenharmony_ci MappingInfo mappingInfo; 3864514f5e3Sopenharmony_ci bool isReplaces = true; 3874514f5e3Sopenharmony_ci 3884514f5e3Sopenharmony_ci mappingInfo = sourceMapFriend.Find(0, 1, targetMap, isReplaces); 3894514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.row, 0); 3904514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.col, 0); 3914514f5e3Sopenharmony_ci EXPECT_TRUE(isReplaces); 3924514f5e3Sopenharmony_ci mappingInfo = sourceMapFriend.Find(1, 1, targetMap, isReplaces); 3934514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.row, 0); 3944514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.col, 0); 3954514f5e3Sopenharmony_ci EXPECT_TRUE(isReplaces); 3964514f5e3Sopenharmony_ci 3974514f5e3Sopenharmony_ci std::vector<SourceMapInfo> afterPos; 3984514f5e3Sopenharmony_ci SourceMapInfo info; 3994514f5e3Sopenharmony_ci info.beforeRow = 1; 4004514f5e3Sopenharmony_ci info.beforeColumn = 1; 4014514f5e3Sopenharmony_ci info.afterRow = 2; 4024514f5e3Sopenharmony_ci info.afterColumn = 2; 4034514f5e3Sopenharmony_ci info.sourcesVal = 1; 4044514f5e3Sopenharmony_ci info.namesVal = 1; 4054514f5e3Sopenharmony_ci afterPos.push_back(info); 4064514f5e3Sopenharmony_ci targetMap.afterPos_ = afterPos; 4074514f5e3Sopenharmony_ci mappingInfo = sourceMapFriend.Find(3, 3, targetMap, isReplaces); 4084514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.row, 2); 4094514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.col, 2); 4104514f5e3Sopenharmony_ci EXPECT_TRUE(isReplaces); 4114514f5e3Sopenharmony_ci 4124514f5e3Sopenharmony_ci mappingInfo = sourceMapFriend.Find(3, 2, targetMap, isReplaces); 4134514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.row, 2); 4144514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.col, 2); 4154514f5e3Sopenharmony_ci EXPECT_TRUE(isReplaces); 4164514f5e3Sopenharmony_ci 4174514f5e3Sopenharmony_ci mappingInfo = sourceMapFriend.Find(2, 2, targetMap, isReplaces); 4184514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.row, 2); 4194514f5e3Sopenharmony_ci EXPECT_EQ(mappingInfo.col, 2); 4204514f5e3Sopenharmony_ci EXPECT_TRUE(isReplaces); 4214514f5e3Sopenharmony_ci} 4224514f5e3Sopenharmony_ci 4234514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, ExtractKeyInfoTest) 4244514f5e3Sopenharmony_ci{ 4254514f5e3Sopenharmony_ci // ExtractKeyInfo Full Covered 4264514f5e3Sopenharmony_ci SourceMapFriend sourceMapFriend; 4274514f5e3Sopenharmony_ci std::string sourceMap = R"({"key1": "value1", "key2": "value\"2"})"; 4284514f5e3Sopenharmony_ci std::vector<std::string> sourceKey; 4294514f5e3Sopenharmony_ci std::vector<std::string> &sourceKeyInfo = sourceKey; 4304514f5e3Sopenharmony_ci sourceMapFriend.ExtractKeyInfo(sourceMap, sourceKeyInfo); 4314514f5e3Sopenharmony_ci EXPECT_EQ(sourceKeyInfo[0], "key1"); 4324514f5e3Sopenharmony_ci EXPECT_EQ(sourceKeyInfo[1], "value1"); 4334514f5e3Sopenharmony_ci EXPECT_EQ(sourceKeyInfo[2], "key2"); 4344514f5e3Sopenharmony_ci EXPECT_EQ(sourceKeyInfo[3], "value\"2"); 4354514f5e3Sopenharmony_ci} 4364514f5e3Sopenharmony_ci 4374514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, GetPosInfoTest) 4384514f5e3Sopenharmony_ci{ 4394514f5e3Sopenharmony_ci SourceMapFriend sourceMapFriend; 4404514f5e3Sopenharmony_ci std::string temp = "005:012:0"; 4414514f5e3Sopenharmony_ci int32_t start = 6; 4424514f5e3Sopenharmony_ci std::string line, column; 4434514f5e3Sopenharmony_ci 4444514f5e3Sopenharmony_ci sourceMapFriend.GetPosInfo(temp, start, line, column); 4454514f5e3Sopenharmony_ci EXPECT_EQ(line, "05"); 4464514f5e3Sopenharmony_ci EXPECT_EQ(column, "01"); 4474514f5e3Sopenharmony_ci} 4484514f5e3Sopenharmony_ci 4494514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, HandleMappingsTest) 4504514f5e3Sopenharmony_ci{ 4514514f5e3Sopenharmony_ci SourceMapFriend sourceMapFriend; 4524514f5e3Sopenharmony_ci std::string mapping = "X;Y"; 4534514f5e3Sopenharmony_ci std::vector<std::string> result = sourceMapFriend.HandleMappings(mapping); 4544514f5e3Sopenharmony_ci ASSERT_EQ(result.size(), 3u); 4554514f5e3Sopenharmony_ci EXPECT_EQ(result[0], "X"); 4564514f5e3Sopenharmony_ci EXPECT_EQ(result[1], ";"); 4574514f5e3Sopenharmony_ci EXPECT_EQ(result[2], "Y"); 4584514f5e3Sopenharmony_ci} 4594514f5e3Sopenharmony_ci 4604514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, VlqRevCodeTest) 4614514f5e3Sopenharmony_ci{ 4624514f5e3Sopenharmony_ci SourceMapFriend sourceMapFriend; 4634514f5e3Sopenharmony_ci std::string vStr; 4644514f5e3Sopenharmony_ci std::vector<int32_t> ans; 4654514f5e3Sopenharmony_ci EXPECT_TRUE(sourceMapFriend.VlqRevCode(vStr, ans)); 4664514f5e3Sopenharmony_ci 4674514f5e3Sopenharmony_ci vStr = "A"; 4684514f5e3Sopenharmony_ci EXPECT_TRUE(sourceMapFriend.VlqRevCode(vStr, ans)); 4694514f5e3Sopenharmony_ci ASSERT_EQ(ans.size(), 1u); 4704514f5e3Sopenharmony_ci 4714514f5e3Sopenharmony_ci vStr = "A=A"; 4724514f5e3Sopenharmony_ci EXPECT_FALSE(sourceMapFriend.VlqRevCode(vStr, ans)); 4734514f5e3Sopenharmony_ci 4744514f5e3Sopenharmony_ci vStr = "X"; 4754514f5e3Sopenharmony_ci EXPECT_TRUE(sourceMapFriend.VlqRevCode(vStr, ans)); 4764514f5e3Sopenharmony_ci 4774514f5e3Sopenharmony_ci vStr = "A"; 4784514f5e3Sopenharmony_ci EXPECT_TRUE(sourceMapFriend.VlqRevCode(vStr, ans)); 4794514f5e3Sopenharmony_ci} 4804514f5e3Sopenharmony_ci 4814514f5e3Sopenharmony_ciHWTEST_F_L0(SourceMapTest, GetLineAndColumnNumbersTest) 4824514f5e3Sopenharmony_ci{ 4834514f5e3Sopenharmony_ci // GetLineAndColumnNumbers is full covered 4844514f5e3Sopenharmony_ci SourceMapFriend sourceMapFriend; 4854514f5e3Sopenharmony_ci SourceMapData targetMap; 4864514f5e3Sopenharmony_ci std::vector<SourceMapInfo> afterPos; 4874514f5e3Sopenharmony_ci SourceMapInfo info; 4884514f5e3Sopenharmony_ci info.beforeRow = 1; 4894514f5e3Sopenharmony_ci info.beforeColumn = 1; 4904514f5e3Sopenharmony_ci info.afterRow = 2; 4914514f5e3Sopenharmony_ci info.afterColumn = 2; 4924514f5e3Sopenharmony_ci info.sourcesVal = 1; 4934514f5e3Sopenharmony_ci info.namesVal = 1; 4944514f5e3Sopenharmony_ci afterPos.push_back(info); 4954514f5e3Sopenharmony_ci targetMap.afterPos_ = afterPos; 4964514f5e3Sopenharmony_ci bool isReplaces = true; 4974514f5e3Sopenharmony_ci 4984514f5e3Sopenharmony_ci int line = 1; 4994514f5e3Sopenharmony_ci int column = 1; 5004514f5e3Sopenharmony_ci bool result = sourceMapFriend.GetLineAndColumnNumbers(line, column, targetMap, isReplaces); 5014514f5e3Sopenharmony_ci EXPECT_TRUE(result); 5024514f5e3Sopenharmony_ci EXPECT_EQ(line, 2); 5034514f5e3Sopenharmony_ci EXPECT_EQ(column, 2); 5044514f5e3Sopenharmony_ci EXPECT_TRUE(isReplaces); 5054514f5e3Sopenharmony_ci 5064514f5e3Sopenharmony_ci line = 5; 5074514f5e3Sopenharmony_ci column = 5; 5084514f5e3Sopenharmony_ci result = sourceMapFriend.GetLineAndColumnNumbers(line, column, targetMap, isReplaces); 5094514f5e3Sopenharmony_ci EXPECT_TRUE(result); 5104514f5e3Sopenharmony_ci EXPECT_EQ(line, 5); 5114514f5e3Sopenharmony_ci EXPECT_EQ(column, 5); 5124514f5e3Sopenharmony_ci EXPECT_FALSE(isReplaces); 5134514f5e3Sopenharmony_ci 5144514f5e3Sopenharmony_ci line = 99; 5154514f5e3Sopenharmony_ci column = 99; 5164514f5e3Sopenharmony_ci result = sourceMapFriend.GetLineAndColumnNumbers(line, column, targetMap, isReplaces); 5174514f5e3Sopenharmony_ci EXPECT_TRUE(result); 5184514f5e3Sopenharmony_ci EXPECT_EQ(line, 99); 5194514f5e3Sopenharmony_ci EXPECT_EQ(column, 99); 5204514f5e3Sopenharmony_ci EXPECT_FALSE(isReplaces); 5214514f5e3Sopenharmony_ci} 5224514f5e3Sopenharmony_ci}