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 }