1 /*
2  * Copyright (c) 2024 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 #include <cstdio>
17 
18 #include "ecmascript/extractortool/src/source_map.h"
19 #include "ecmascript/tests/test_helper.h"
20 
21 using namespace panda::ecmascript;
22 const std::string sourceMapData =
23         "{\n"
24         "  \"entry/src/main/ets/pages/Index.ts\": {\n"
25         "    \"version\": 3,\n"
26         "    \"file\": \"Index.ets\",\n"
27         "    \"sources\": [\n"
28         "      \"entry/src/main/ets/pages/Index.ets\"\n"
29         "    ],\n"
30         "    \"names\": [],\n"
31         "    \"mappings\": \";MAEO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
32         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
33         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAFZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
34         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
35         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
36         "CAAA,CAAA,CAAA,CAAA;;sDAG2B,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
37         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAHxC,CAAA,CAAA,CAAA,"
38         "CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;QAGS,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;QAAP,CAAO,"
39         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAEd,CAAA,"
40         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;"
41         "YACE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAAH,CAAG,CAAA,CAAA,CAQF,CAAM,"
42         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;gBARd,CAAG,CAAA,CAAA,CAAA,CAAA,"
43         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;YACD,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
44         "CAAA,CAAA,CAAA,CAAA;YAAN,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAKL,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,"
45         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;gBALb,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;"
46         ";;;;;YACJ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,"
47         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAAjB,CAAI,CAAA,CAAA,CAAA,CACD,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
48         "CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA;AADd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
49         "CAAA,CAAA,CAAI,CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
50         "CAAA,CAAA,CAAA,CAAU,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;gBAF7B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
51         "CAAA,CAAA,CAAA,CAAA;;;;QAAJ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QADN,CAAM,CAAA,CAAA,"
52         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QADR,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
53         "CAAA;AASJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;\"\n"
54         "  }\n"
55         "}";
56 const std::string sourceMapDataWithoutSources =
57         "{\n"
58         "  \"entry/src/main/ets/pages/Index.ts\": {\n"
59         "    \"version\": 3,\n"
60         "    \"file\": \"Index.ets\",\n"
61         "    \"sources\": [],\n"
62         "    \"names\": [],\n"
63         "    \"mappings\": \";MAEO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,"
64         "CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;\"\n"
65         "  }\n"
66         "}";
67 const std::string sourceMapDataWithShortMappings =
68         "{\n"
69         "  \"entry/src/main/ets/pages/Index.ts\": {\n"
70         "    \"version\": 3,\n"
71         "    \"file\": \"Index.ets\",\n"
72         "    \"sources\": [\n"
73         "      \"entry/src/main/ets/pages/Index.ets\"\n"
74         "    ],\n"
75         "    \"names\": [],\n"
76         "    \"mappings\": \"\n"
77         "  }\n"
78         "}";
79 const std::string sourceMapDataWithInvalidMappings1 =
80         "{\n"
81         "  \"entry/src/main/ets/pages/Index.ts\": {\n"
82         "    \"version\": 3,\n"
83         "    \"file\": \"Index.ets\",\n"
84         "    \"sources\": [\n"
85         "      \"entry/src/main/ets/pages/Index.ets\"\n"
86         "    ],\n"
87         "    \"names\": [],\n"
88         "    \"mappings\": pA;\n"
89         "  }\n"
90         "}";
91 const std::string sourceMapDataWithInvalidMappings2 =
92         "{\n"
93         "  \"entry/src/main/ets/pages/Index.ts\": {\n"
94         "    \"version\": 3,\n"
95         "    \"file\": \"Index.ets\",\n"
96         "    \"sources\": [\n"
97         "      \"entry/src/main/ets/pages/Index.ets\"\n"
98         "    ],\n"
99         "    \"names\": [],\n"
100         "    \"mappings\": pAq;ABCD;abcd;0123;0+/-;\n"
101         "  }\n"
102         "}";
103 const std::string sourceMapDataWithInvalidMappings3 =
104         "{\n"
105         "  \"entry/src/main/ets/pages/Index.ts\": {\n"
106         "    \"version\": 3,\n"
107         "    \"file\": \"Index.ets\",\n"
108         "    \"sources\": [\n"
109         "      \"entry/src/main/ets/pages/Index.ets\"\n"
110         "    ],\n"
111         "    \"names\": [],\n"
112         "    \"mappings\": X;\n"
113         "  }\n"
114         "}";
115 const std::string sourceMapDataWithInvalidMappings4 =
116         "{\n"
117         "  \"entry/src/main/ets/pages/Index.ts\": {\n"
118         "    \"version\": 3,\n"
119         "    \"file\": \"Index.ets\",\n"
120         "    \"sources\": [\n"
121         "      \"entry/src/main/ets/pages/Index.ets\"\n"
122         "    ],\n"
123         "    \"names\": [],\n"
124         "    \"mappings\": A;\n"
125         "  }\n"
126         "}";
127 const std::string sourceMapDataWithInvalidMappings5 =
128         "{\n"
129         "  \"entry/src/main/ets/pages/Index.ts\": {\n"
130         "    \"version\": 3,\n"
131         "    \"file\": \"Index.ets\",\n"
132         "    \"sources\": [\n"
133         "      \"entry/src/main/ets/pages/Index.ets\"\n"
134         "    ],\n"
135         "    \"names\": [],\n"
136         "    \"mappings\": ;\n"
137         "  }\n"
138         "}";
139 const std::string sourceMapDataWithJsSources =
140         "{\n"
141         "  \"entry/src/main/ets/pages/Index.js\": {\n"
142         "    \"version\": 3,\n"
143         "    \"file\": \"Index.ets\",\n"
144         "    \"sources\": [\n"
145         "      \"entry/src/main/ets/pages/Index.js\"\n"
146         "    ],\n"
147         "    \"names\": [],\n"
148         "    \"mappings\": ;\n"
149         "  }\n"
150         "}";
151 
152 namespace panda::ecmascript {
153 class SourceMapFriend {
154 public:
Base64CharToInt(char charCode)155     uint32_t Base64CharToInt(char charCode)
156     {
157         return sourceMap.Base64CharToInt(charCode);
158     }
159 
SplitSourceMap(const std::string &sourceMapData)160     void SplitSourceMap(const std::string &sourceMapData)
161     {
162         sourceMap.SplitSourceMap(sourceMapData);
163     }
164 
ExtractSourceMapData(const std::string &allmappings, std::shared_ptr<SourceMapData> &curMapData)165     void ExtractSourceMapData(const std::string &allmappings, std::shared_ptr<SourceMapData> &curMapData)
166     {
167         sourceMap.ExtractSourceMapData(allmappings, curMapData);
168     }
169 
Find(int32_t row, int32_t col, const SourceMapData &targetMap, bool& isReplaces)170     MappingInfo Find(int32_t row, int32_t col, const SourceMapData &targetMap, bool& isReplaces)
171     {
172         return sourceMap.Find(row, col, targetMap, isReplaces);
173     }
174 
ExtractKeyInfo(const std::string &aSourceMap, std::vector<std::string> &sourceKeyInfo)175     void ExtractKeyInfo(const std::string &aSourceMap, std::vector<std::string> &sourceKeyInfo)
176     {
177         sourceMap.ExtractKeyInfo(aSourceMap, sourceKeyInfo);
178     }
179 
GetPosInfo(const std::string &temp, int32_t start, std::string &line, std::string &column)180     void GetPosInfo(const std::string &temp, int32_t start, std::string &line, std::string &column)
181     {
182         sourceMap.GetPosInfo(temp, start, line, column);
183     }
184 
HandleMappings(const std::string &mapping)185     std::vector<std::string> HandleMappings(const std::string &mapping)
186     {
187         return sourceMap.HandleMappings(mapping);
188     }
189 
VlqRevCode(const std::string &vStr, std::vector<int32_t> &ans)190     bool VlqRevCode(const std::string &vStr, std::vector<int32_t> &ans)
191     {
192         return sourceMap.VlqRevCode(vStr, ans);
193     }
194 
TranslateUrlPositionBySourceMap(std::string &url, int &line, int &column)195     bool TranslateUrlPositionBySourceMap(std::string &url, int &line, int &column)
196     {
197         return sourceMap.TranslateUrlPositionBySourceMap(url, line, column);
198     }
199 
GetLineAndColumnNumbers(int &line, int &column, SourceMapData &targetMap, bool& isReplaces)200     bool GetLineAndColumnNumbers(int &line, int &column, SourceMapData &targetMap, bool& isReplaces)
201     {
202         return sourceMap.GetLineAndColumnNumbers(line, column, targetMap, isReplaces);
203     }
204 
205 private:
206     SourceMap sourceMap;
207 };
208 }
209 
210 namespace panda::test {
211 class SourceMapTest : public testing::Test {
212 public:
SetUpTestCase()213     static void SetUpTestCase()
214     {
215         GTEST_LOG_(INFO) << "SetUpTestCase";
216     }
217 
TearDownTestCase()218     static void TearDownTestCase()
219     {
220         GTEST_LOG_(INFO) << "TearDownCase";
221     }
222 
223     void SetUp() override
224     {
225         TestHelper::CreateEcmaVMWithScope(instance, thread, scope);
226         instance->SetEnableForceGC(false);
227     }
228 
229     void TearDown() override
230     {
231         TestHelper::DestroyEcmaVMWithScope(instance, scope);
232     }
233 
234     EcmaVM *instance{nullptr};
235     EcmaHandleScope *scope{nullptr};
236     JSThread *thread{nullptr};
237 };
238 
StringToUint8(const std::string &str)239 uint8_t *StringToUint8(const std::string &str)
240 {
241     const auto *data = reinterpret_cast<const uint8_t *>(str.c_str());
242     return const_cast<uint8_t *>(data);
243 }
244 
TestInit(const std::string &sourceMapData)245 SourceMap TestInit(const std::string &sourceMapData)
246 {
247     uint8_t *data = StringToUint8(sourceMapData);
248     size_t dataSize = sourceMapData.size();
249     SourceMap sourceMap;
250     sourceMap.Init(const_cast<uint8_t *>(data), dataSize);
251     return sourceMap;
252 }
253 
HWTEST_F_L0(SourceMapTest, TranslateUrlPositionBySourceMapTest)254 HWTEST_F_L0(SourceMapTest, TranslateUrlPositionBySourceMapTest)
255 {
256     SourceMap sourceMap;
257     int line = 10, column = 5;
258     std::string url = "test.js";
259     // if url contains ".js" returns true
260     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
261 
262     // if it can't find sources which match url after init, returns false and throw Translate failed
263     // e.g. 1. sourceMapData is valid, but url is not valid;
264     sourceMap = TestInit(sourceMapData);
265     url = "entry/src/main/ets/pages/Index1.ts";
266     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
267 
268     // e.g. 2. sourceMapData is not valid
269     sourceMap = TestInit("testInvalidSourceMapData");
270     url = "entry/src/main/ets/pages/Index.ts";
271     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
272 
273     sourceMap = TestInit(sourceMapDataWithoutSources);
274     url = "entry/src/main/ets/pages/Index.ts";
275     EXPECT_TRUE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
276 
277     // if mappings is too short(<18), it will throw translate failed
278     sourceMap = TestInit(sourceMapDataWithShortMappings);
279     url = "entry/src/main/ets/pages/Index.ts";
280     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
281 
282     sourceMap = TestInit(sourceMapData);
283     url = "entry/src/main/ets/pages/Index.ts";
284     EXPECT_TRUE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
285 
286     // if sourceMapData was used twice, sourceMap should cache url/modularMap
287     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
288 
289     sourceMap = TestInit(sourceMapDataWithInvalidMappings1);
290     url = "entry/src/main/ets/pages/Index.ts";
291     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
292 
293     sourceMap = TestInit(sourceMapDataWithInvalidMappings2);
294     url = "entry/src/main/ets/pages/Index.ts";
295     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
296 
297     sourceMap = TestInit(sourceMapDataWithInvalidMappings3);
298     url = "entry/src/main/ets/pages/Index.ts";
299     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
300 
301     sourceMap = TestInit(sourceMapDataWithInvalidMappings4);
302     url = "entry/src/main/ets/pages/Index.ts";
303     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
304 
305     sourceMap = TestInit(sourceMapDataWithInvalidMappings5);
306     url = "entry/src/main/ets/pages/Index.ts";
307     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
308 
309     sourceMap = TestInit(sourceMapData);
310     url = "entry/src/main/ets/pages/Index.ts";
311     line = 0, column = 5;
312     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
313 
314     sourceMap = TestInit(sourceMapData);
315     url = "entry/src/main/ets/pages/Index.ts";
316     line = 5, column = 0;
317     EXPECT_FALSE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
318 
319     // if sourceMapData is valid and url is end by ".js", it should return true
320     url = "entry/src/main/ets/pages/Index.js";
321     sourceMap = TestInit(sourceMapDataWithJsSources);
322     EXPECT_TRUE(sourceMap.TranslateUrlPositionBySourceMap(url, line, column));
323 }
324 
HWTEST_F_L0(SourceMapTest, Base64CharToIntTest)325 HWTEST_F_L0(SourceMapTest, Base64CharToIntTest)
326 {
327     SourceMapFriend sourceMapFriend;
328     EXPECT_EQ(sourceMapFriend.Base64CharToInt('A'), 0);
329     EXPECT_EQ(sourceMapFriend.Base64CharToInt('a'), 26);
330     EXPECT_EQ(sourceMapFriend.Base64CharToInt('0'), 52);
331     EXPECT_EQ(sourceMapFriend.Base64CharToInt('+'), 62);
332     EXPECT_EQ(sourceMapFriend.Base64CharToInt('/'), 63);
333     EXPECT_EQ(sourceMapFriend.Base64CharToInt('-'), 64);
334 }
335 
PrintSourceMapData(const SourceMapData &data)336 void PrintSourceMapData(const SourceMapData &data)
337 {
338     std::cout << "URL: " << data.url_ << std::endl;
339     std::cout << "Now Position: (" << data.nowPos_.afterRow << ", " << data.nowPos_.afterColumn << ")" << std::endl;
340 
341     std::cout << "Files:" << std::endl;
342     for (const auto &file: data.files_) {
343         std::cout << "- " << file << std::endl;
344     }
345 
346     std::cout << "Sources:" << std::endl;
347     for (const auto &source: data.sources_) {
348         std::cout << "- " << source << std::endl;
349     }
350 
351     std::cout << "Names:" << std::endl;
352     for (const auto &name: data.names_) {
353         std::cout << "- " << name << std::endl;
354     }
355 
356     std::cout << "Mappings:" << std::endl;
357     for (const auto &mapping: data.mappings_) {
358         std::cout << "- " << mapping << std::endl;
359     }
360 
361     std::cout << "After Positions:" << std::endl;
362     for (const auto &pos: data.afterPos_) {
363         std::cout << "- (" << pos.beforeRow << ", " << pos.beforeColumn << ", " << pos.afterRow << ", "
364                   << pos.afterColumn << ")" << std::endl;
365     }
366 }
367 
HWTEST_F_L0(SourceMapTest, ExtractSourceMapDataTest)368 HWTEST_F_L0(SourceMapTest, ExtractSourceMapDataTest)
369 {
370     SourceMapFriend sourceMapFriend;
371     std::string mappings = ";MAEO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA";
372     auto sourceMapDataInstance = std::make_shared<SourceMapData>();
373     std::shared_ptr<SourceMapData> &curMapData = sourceMapDataInstance;
374 
375     sourceMapFriend.ExtractSourceMapData(mappings, curMapData);
376     SourceMapData &data = *curMapData;
377     EXPECT_EQ(data.afterPos_.size(), 13);
378 }
379 
HWTEST_F_L0(SourceMapTest, FindTest)380 HWTEST_F_L0(SourceMapTest, FindTest)
381 {
382     // Find Full Covered
383     SourceMapFriend sourceMapFriend;
384     SourceMapData targetMap;
385     MappingInfo mappingInfo;
386     bool isReplaces = true;
387 
388     mappingInfo = sourceMapFriend.Find(0, 1, targetMap, isReplaces);
389     EXPECT_EQ(mappingInfo.row, 0);
390     EXPECT_EQ(mappingInfo.col, 0);
391     EXPECT_TRUE(isReplaces);
392     mappingInfo = sourceMapFriend.Find(1, 1, targetMap, isReplaces);
393     EXPECT_EQ(mappingInfo.row, 0);
394     EXPECT_EQ(mappingInfo.col, 0);
395     EXPECT_TRUE(isReplaces);
396 
397     std::vector<SourceMapInfo> afterPos;
398     SourceMapInfo info;
399     info.beforeRow = 1;
400     info.beforeColumn = 1;
401     info.afterRow = 2;
402     info.afterColumn = 2;
403     info.sourcesVal = 1;
404     info.namesVal = 1;
405     afterPos.push_back(info);
406     targetMap.afterPos_ = afterPos;
407     mappingInfo = sourceMapFriend.Find(3, 3, targetMap, isReplaces);
408     EXPECT_EQ(mappingInfo.row, 2);
409     EXPECT_EQ(mappingInfo.col, 2);
410     EXPECT_TRUE(isReplaces);
411 
412     mappingInfo = sourceMapFriend.Find(3, 2, targetMap, isReplaces);
413     EXPECT_EQ(mappingInfo.row, 2);
414     EXPECT_EQ(mappingInfo.col, 2);
415     EXPECT_TRUE(isReplaces);
416 
417     mappingInfo = sourceMapFriend.Find(2, 2, targetMap, isReplaces);
418     EXPECT_EQ(mappingInfo.row, 2);
419     EXPECT_EQ(mappingInfo.col, 2);
420     EXPECT_TRUE(isReplaces);
421 }
422 
HWTEST_F_L0(SourceMapTest, ExtractKeyInfoTest)423 HWTEST_F_L0(SourceMapTest, ExtractKeyInfoTest)
424 {
425     // ExtractKeyInfo Full Covered
426     SourceMapFriend sourceMapFriend;
427     std::string sourceMap = R"({"key1": "value1", "key2": "value\"2"})";
428     std::vector<std::string> sourceKey;
429     std::vector<std::string> &sourceKeyInfo = sourceKey;
430     sourceMapFriend.ExtractKeyInfo(sourceMap, sourceKeyInfo);
431     EXPECT_EQ(sourceKeyInfo[0], "key1");
432     EXPECT_EQ(sourceKeyInfo[1], "value1");
433     EXPECT_EQ(sourceKeyInfo[2], "key2");
434     EXPECT_EQ(sourceKeyInfo[3], "value\"2");
435 }
436 
HWTEST_F_L0(SourceMapTest, GetPosInfoTest)437 HWTEST_F_L0(SourceMapTest, GetPosInfoTest)
438 {
439     SourceMapFriend sourceMapFriend;
440     std::string temp = "005:012:0";
441     int32_t start = 6;
442     std::string line, column;
443 
444     sourceMapFriend.GetPosInfo(temp, start, line, column);
445     EXPECT_EQ(line, "05");
446     EXPECT_EQ(column, "01");
447 }
448 
HWTEST_F_L0(SourceMapTest, HandleMappingsTest)449 HWTEST_F_L0(SourceMapTest, HandleMappingsTest)
450 {
451     SourceMapFriend sourceMapFriend;
452     std::string mapping = "X;Y";
453     std::vector<std::string> result = sourceMapFriend.HandleMappings(mapping);
454     ASSERT_EQ(result.size(), 3u);
455     EXPECT_EQ(result[0], "X");
456     EXPECT_EQ(result[1], ";");
457     EXPECT_EQ(result[2], "Y");
458 }
459 
HWTEST_F_L0(SourceMapTest, VlqRevCodeTest)460 HWTEST_F_L0(SourceMapTest, VlqRevCodeTest)
461 {
462     SourceMapFriend sourceMapFriend;
463     std::string vStr;
464     std::vector<int32_t> ans;
465     EXPECT_TRUE(sourceMapFriend.VlqRevCode(vStr, ans));
466 
467     vStr = "A";
468     EXPECT_TRUE(sourceMapFriend.VlqRevCode(vStr, ans));
469     ASSERT_EQ(ans.size(), 1u);
470 
471     vStr = "A=A";
472     EXPECT_FALSE(sourceMapFriend.VlqRevCode(vStr, ans));
473 
474     vStr = "X";
475     EXPECT_TRUE(sourceMapFriend.VlqRevCode(vStr, ans));
476 
477     vStr = "A";
478     EXPECT_TRUE(sourceMapFriend.VlqRevCode(vStr, ans));
479 }
480 
HWTEST_F_L0(SourceMapTest, GetLineAndColumnNumbersTest)481 HWTEST_F_L0(SourceMapTest, GetLineAndColumnNumbersTest)
482 {
483     // GetLineAndColumnNumbers is full covered
484     SourceMapFriend sourceMapFriend;
485     SourceMapData targetMap;
486     std::vector<SourceMapInfo> afterPos;
487     SourceMapInfo info;
488     info.beforeRow = 1;
489     info.beforeColumn = 1;
490     info.afterRow = 2;
491     info.afterColumn = 2;
492     info.sourcesVal = 1;
493     info.namesVal = 1;
494     afterPos.push_back(info);
495     targetMap.afterPos_ = afterPos;
496     bool isReplaces = true;
497 
498     int line = 1;
499     int column = 1;
500     bool result = sourceMapFriend.GetLineAndColumnNumbers(line, column, targetMap, isReplaces);
501     EXPECT_TRUE(result);
502     EXPECT_EQ(line, 2);
503     EXPECT_EQ(column, 2);
504     EXPECT_TRUE(isReplaces);
505 
506     line = 5;
507     column = 5;
508     result = sourceMapFriend.GetLineAndColumnNumbers(line, column, targetMap, isReplaces);
509     EXPECT_TRUE(result);
510     EXPECT_EQ(line, 5);
511     EXPECT_EQ(column, 5);
512     EXPECT_FALSE(isReplaces);
513 
514     line = 99;
515     column = 99;
516     result = sourceMapFriend.GetLineAndColumnNumbers(line, column, targetMap, isReplaces);
517     EXPECT_TRUE(result);
518     EXPECT_EQ(line, 99);
519     EXPECT_EQ(column, 99);
520     EXPECT_FALSE(isReplaces);
521 }
522 }