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}