• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2025 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 #include <gtest/gtest.h>
16 #include <cstddef>
17 #include <cstdio>
18 #include <optional>
19 #include <ostream>
20 #include <string>
21 #include <vector>
22 
23 #include "es2panda.h"
24 #include "lsp/include/api.h"
25 #include "lsp/include/get_class_property_info.h"
26 #include "lsp/include/cancellation_token.h"
27 #include "lsp_api_test.h"
28 #include <iostream>
29 
30 namespace {
31 // NOLINTBEGIN
32 using ark::es2panda::lsp::Initializer;
33 
34 class LspGetClassPropertyInfoTests : public LSPAPITests {};
35 std::vector<std::string> fileContents = {
36     R"(
37 enum BloodType {
38   A = 'A',
39   AB = 'AB'
40 }
41 
42 class Address {
43   province: string = '';
44   city: string = '';
45 }
46 
47 interface Control {
48   state: number
49 }
50 
51 interface SelectableControl extends Control {
52   select(): void
53 }
54 
55 class SelectableControlClass extends Address implements SelectableControl {
56   select(): void {
57     throw new Error("Method not implemented.");
58   }
59 
60   private state1: number = 0;
61   protected readonly hobbies: string[] = [];
62 }
63 
64 enum Sex {
65   Male = 'Male'
66 }
67 
68 export class Person extends SelectableControlClass implements SelectableControl {
69   static MAX_HEIGHT: number = 250;
70   static BLOOD_TYPES: BloodType = BloodType.AB;
71   static defaultAddress: Address = {
72     province: '北京',
73     city: '北京市',
74   };
75   name: string = '';
76   age: number = Person.MAX_HEIGHT;
77   weight: number = 0;
78   sex: Sex = Sex.Male;
79   bloodType: BloodType = BloodType.A;
80   address: Address = new Address();
81   hobbies: string[] = [];
82   maritalStatus: 'single' | 'married' | 'divorced' = 'single';
83   birthday: Date = new Date();
84   location: [number, number] = [0, 0];
85   avatar: Resource = $r('app.media.startIcon');
86   attributes: Map<string, object> = new Map();
87   isEmployed: boolean = false;
88   private privateIsEmployed: boolean = false;
89   protected protectedIsEmployed: boolean = false;
90   protected readonly readonlyIsEmployed: boolean = false;
91   onUpdate: (() => void) | null = null;
92 }
93 )"};
94 std::vector<std::string> fileContents2 = {
95     R"(
96 export enum BloodType {
97   A = 'A',
98   AB = 'AB'
99 }
100 
101 export class Address {
102   state: number = 1;
103   province: string = '';
104   city: string = '';
105 }
106 
107 interface Control {
108   state: number
109 }
110 
111 export interface SelectableControl extends Control {
112   select(): void
113 }
114 )",
115     R"(
116 import { Address, SelectableControl } from "./GetClassPropertyInfo_SelectableControl";
117 
118 export class SelectableControlClass extends Address implements SelectableControl {
119   select(): void {
120     throw new Error("Method not implemented.");
121   }
122 
123   private state1: number = 0;
124   protected readonly hobbies: string[] = [];
125 }
126 )",
127     R"(
128 import { Address, BloodType, SelectableControl } from "./GetClassPropertyInfo_SelectableControl";
129 import { SelectableControlClass } from "./GetClassPropertyInfo_SelectableControlClass";
130 
131 enum Sex {
132   Male = 'Male'
133 }
134 
135 export class Person extends SelectableControlClass implements SelectableControl {
136   static MAX_HEIGHT: number = 250;
137   static BLOOD_TYPES: BloodType = BloodType.AB;
138   static defaultAddress: Address = {
139     province: '北京',
140     city: '北京市',
141     state: 0
142   };
143   name: string = '';
144   age: number = Person.MAX_HEIGHT;
145   weight: number = 0;
146   sex: Sex = Sex.Male;
147   bloodType: BloodType = BloodType.A;
148   address: Address = new Address();
149   hobbies: string[] = [];
150   maritalStatus: 'single' | 'married' | 'divorced' = 'single';
151   birthday: Date = new Date();
152   location: [number, number] = [0, 0];
153   avatar: Resource = $r('app.media.startIcon');
154   attributes: Map<string, object> = new Map();
155   isEmployed: boolean = false;
156   private privateIsEmployed: boolean = false;
157   protected protectedIsEmployed: boolean = false;
158   protected readonly readonlyIsEmployed: boolean = false;
159   onUpdate: (() => void) | null = null;
160 }
161 )"};
162 
163 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResultWangz1 = {
164     {"MAX_HEIGHT", 561, 585, "classField", {"public", "static"}},
165     {"BLOOD_TYPES", 596, 633, "classField", {"public", "static"}},
166     {"defaultAddress", 644, 722, "classField", {"public", "static"}},
167     {"name", 726, 743, "classField", {"public"}},
168     {"age", 747, 778, "classField", {"public"}},
169     {"weight", 782, 800, "classField", {"public"}},
170     {"sex", 804, 823, "classField", {"public"}},
171     {"bloodType", 827, 861, "classField", {"public"}},
172     {"address", 865, 898, "classField", {"public"}},
173     {"hobbies", 901, 923, "classField", {"public"}},
174     {"maritalStatus", 927, 986, "classField", {"public"}},
175     {"birthday", 990, 1018, "classField", {"public"}},
176     {"location", 1021, 1056, "classField", {"public"}},
177     {"avatar", 1060, 1104, "classField", {"public"}},
178     {"attributes", 1108, 1152, "classField", {"public"}},
179     {"isEmployed", 1155, 1182, "classField", {"public"}},
180     {"privateIsEmployed", 1194, 1228, "classField", {"private"}},
181     {"protectedIsEmployed", 1242, 1278, "classField", {"protected"}},
182     {"readonlyIsEmployed", 1301, 1336, "classField", {"protected", "readonly"}},
183     {"onUpdate", 1340, 1376, "classField", {"public"}}};
184 
CheckClassPropertiesMatch(const std::vector<FieldListProperty> & actualProperties,const std::vector<std::tuple<std::string,size_t,size_t,std::string,std::vector<std::string>>> & expectedResult)185 void CheckClassPropertiesMatch(
186     const std::vector<FieldListProperty> &actualProperties,
187     const std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> &expectedResult)
188 {
189     for (size_t i = 0; i < actualProperties.size(); ++i) {
190         const auto &perp = actualProperties[i];
191         const auto &expected = expectedResult[i];
192 
193         const auto &expectedName = std::get<0>(expected);
194         const auto expectedStart = std::get<1>(expected);
195         const auto expectedEnd = std::get<2>(expected);
196         const auto &expectedKind = std::get<3>(expected);
197         const auto &expectedModifiers = std::get<4>(expected);
198 
199         bool nameMatch = (perp.displayName == expectedName);
200         bool startMatch = (perp.start == expectedStart);
201         bool endMatch = (perp.end == expectedEnd);
202         bool kindMatch = (perp.kind == expectedKind);
203 
204         bool modifiersMatch = true;
205         if (perp.modifierKinds.has_value()) {
206             const auto &actualModifiers = perp.modifierKinds.value();
207             modifiersMatch = (actualModifiers == expectedModifiers);  // 严格比较顺序
208         } else {
209             modifiersMatch = expectedModifiers.empty();
210         }
211 
212         bool currentMatch = nameMatch && startMatch && endMatch && kindMatch && modifiersMatch;
213         ASSERT_EQ(true, currentMatch);
214     }
215 }
216 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethodTest1)217 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethodTest1)
218 {
219     constexpr size_t EXPECTED_CLASS_COUNT = 3;
220     constexpr size_t EXPECTED_CLASS_COUNT_ONE = 1;
221     constexpr size_t EXPECTED_PROP_COUNT = 20;
222 
223     std::vector<std::string> fileNames = {"GetClassPropertyInfoMethodFile1.ets"};
224 
225     auto filePaths = CreateTempFile(fileNames, fileContents);
226     std::vector<ark::es2panda::SourceFile> sourceFiles;
227 
228     for (size_t i = 0; i < filePaths.size(); ++i) {
229         sourceFiles.emplace_back(filePaths[i], fileContents[i]);
230     }
231     ASSERT_EQ(fileNames.size(), sourceFiles.size());
232 
233     Initializer initializer;
234     size_t sourceIndex = 0;
235     size_t tokenOffset = 800;
236     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
237     auto fileContent = std::string {sourceFiles[sourceIndex].source};
238     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
239 
240     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
241     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
242 
243     auto infos2 = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset);
244     initializer.DestroyContext(context);
245     ASSERT_EQ(EXPECTED_CLASS_COUNT_ONE, infos2.size());
246 
247     FieldsInfo info = infos2[0];
248     ASSERT_EQ(EXPECTED_PROP_COUNT, info.properties.size());
249     ASSERT_EQ("Person", info.name);
250     CheckClassPropertiesMatch(info.properties, expectedResultWangz1);
251 }
252 
253 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResultWangz2 = {
254     {"MAX_HEIGHT", 309, 333, "classField", {"public", "static"}},
255     {"BLOOD_TYPES", 344, 381, "classField", {"public", "static"}},
256     {"defaultAddress", 392, 483, "classField", {"public", "static"}},
257     {"name", 487, 504, "classField", {"public"}},
258     {"age", 508, 539, "classField", {"public"}},
259     {"weight", 543, 561, "classField", {"public"}},
260     {"sex", 565, 584, "classField", {"public"}},
261     {"bloodType", 588, 622, "classField", {"public"}},
262     {"address", 626, 659, "classField", {"public"}},
263     {"hobbies", 662, 684, "classField", {"public"}},
264     {"maritalStatus", 688, 747, "classField", {"public"}},
265     {"birthday", 751, 779, "classField", {"public"}},
266     {"location", 782, 817, "classField", {"public"}},
267     {"avatar", 821, 865, "classField", {"public"}},
268     {"attributes", 869, 913, "classField", {"public"}},
269     {"isEmployed", 916, 943, "classField", {"public"}},
270     {"privateIsEmployed", 955, 989, "classField", {"private"}},
271     {"protectedIsEmployed", 1003, 1039, "classField", {"protected"}},
272     {"readonlyIsEmployed", 1062, 1097, "classField", {"protected", "readonly"}},
273     {"onUpdate", 1101, 1137, "classField", {"public"}}};
274 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethodTest2)275 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethodTest2)
276 {
277     constexpr size_t EXPECTED_CLASS_COUNT = 3;
278     constexpr size_t EXPECTED_CLASS_COUNT_ONE = 1;
279     constexpr size_t EXPECTED_PROP_COUNT = 20;
280 
281     std::vector<std::string> fileNames2 = {"GetClassPropertyInfo_SelectableControl.ets",
282                                            "GetClassPropertyInfo_SelectableControlClass.ets",
283                                            "GetClassPropertyInfo_Person.ets"};
284 
285     auto filePaths = CreateTempFile(fileNames2, fileContents2);
286     std::vector<ark::es2panda::SourceFile> sourceFiles;
287 
288     for (size_t i = 0; i < filePaths.size(); ++i) {
289         sourceFiles.emplace_back(filePaths[i], fileContents2[i]);
290     }
291     ASSERT_EQ(fileNames2.size(), sourceFiles.size());
292 
293     Initializer initializer;
294     size_t sourceIndex = 2;
295     size_t tokenOffset = 300;
296     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
297     auto fileContent = std::string {sourceFiles[sourceIndex].source};
298     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
299 
300     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
301     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
302 
303     auto infos2 = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset);
304     initializer.DestroyContext(context);
305     ASSERT_EQ(EXPECTED_CLASS_COUNT_ONE, infos2.size());
306 
307     FieldsInfo info = infos2[0];
308     ASSERT_EQ(EXPECTED_PROP_COUNT, info.properties.size());
309     ASSERT_EQ("Person", info.name);
310     CheckClassPropertiesMatch(info.properties, expectedResultWangz2);
311 }
312 
313 std::vector<std::string> fileContents3 = {
314     R"(
315 class A {
316 }
317 )",
318     R"(
319 class B {
320   p1
321   p2
322   static p3
323   readonly p4
324   private p5
325 }
326 )",
327     R"(
328 class KKK {
329   tr:string;
330   constructor(tr: string) {
331       this.tr = tr;
332   }
333 }
334 
335 class NNN extends KKK {
336 }
337 )",
338     R"(
339 class GGG {
340   tr:string;
341   constructor(tr: string) {
342       this.tr = tr;
343   }
344 }
345 
346 class HHH extends GGG {
347   pop:string
348 }
349 )",
350     R"(
351 abstract class AA {
352   test: number;
353 }
354 
355 class NN extends AA {
356   jkk: string;
357 }
358 )",
359     R"(
360 abstract class AA2 {
361   test: number;
362   private kn: string;
363   das: string;
364 
365   constructor(test: number, kn: string) {
366       this.test = test;
367       this.kn = kn;
368   }
369 }
370 
371 class NN2 extends AA2 {
372   jkk: string;
373   wwa: number;
374 }
375 )",
376     R"(
377 class ok {
378   test?:string;
379 }
380 )",
381     R"(
382 class TY {
383   private _a: string = "foo"
384 }
385 )",
386     R"(
387 class TwY {
388   static a: string = "foo"
389 }
390 )",
391     R"(
392 class TwasY {
393   a: string|number;
394 }
395 )",
396     R"(
397 abstract class TY {
398   abstract a: string|number;
399 }
400 )",
401     R"(
402 class Demo {
403   private name = 'jack';
404   private age = 25;
405   private doTask = () => 34;
406 }
407 )",
408     R"(
409 interface AA {
410   aa: number;
411   getAA(): number;
412 }
413 
414 class BaseNN {
415   aa: number;
416 
417   constructor(aa: number) {
418     this.aa = aa;
419   }
420 
421   getAA(): number {
422     return 1;
423   }
424 }
425 
426 class MM extends BaseNN implements AA {
427   aa: number;
428   getAA(): number {
429     return super.getAA();
430   }
431 }
432 )",
433     R"(
434 import CommonEventManager from '@ohos.commonEventManager';
435 
436 interface SubscribeInfoType {
437   events: string[];
438 }
439 
440 class CommonEventRegister {
441   subscriber: CommonEventManager.CommonEventSubscriber | null = null;
442   public subscribeInfo: SubscribeInfoType;
443 }
444 )"};
445 
446 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult1 = {};
447 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod1)448 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod1)
449 {
450     constexpr size_t EXPECTED_CLASS_COUNT = 1;
451     constexpr size_t EXPECTED_PROP_COUNT = 0;
452 
453     std::vector<std::string> fileNames3 = {
454         "get_class_property_info_test_m1_01.ets", "get_class_property_info_test_m1_02.ets",
455         "get_class_property_info_test_m1_03.ets", "get_class_property_info_test_m1_04.ets",
456         "get_class_property_info_test_m1_05.ets", "get_class_property_info_test_m1_06.ets",
457         "get_class_property_info_test_m1_07.ets", "get_class_property_info_test_m1_08.ets",
458         "get_class_property_info_test_m1_09.ets", "get_class_property_info_test_m1_10.ets",
459         "get_class_property_info_test_m1_11.ets", "get_class_property_info_test_m1_12.ets",
460         "get_class_property_info_test_m1_13.ets", "get_class_property_info_test_m1_14.ets"};
461 
462     auto filePaths = CreateTempFile(fileNames3, fileContents3);
463     std::vector<ark::es2panda::SourceFile> sourceFiles;
464 
465     for (size_t i = 0; i < filePaths.size(); ++i) {
466         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
467     }
468     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
469 
470     Initializer initializer;
471     size_t sourceIndex = 0;
472     size_t tokenOffset = 12;
473     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
474     auto fileContent = std::string {sourceFiles[sourceIndex].source};
475     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
476 
477     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
478     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
479     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
480     CheckClassPropertiesMatch(infos[0].properties, expectedResult1);
481 }
482 
483 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult2 = {
484     {"p1", 13, 15, "classField", {"public"}},
485     {"p2", 18, 20, "classField", {"public"}},
486     {"p3", 30, 32, "classField", {"public", "static"}},
487     {"p4", 44, 46, "classField", {"public", "readonly"}},
488     {"p5", 57, 59, "classField", {"private"}}};
489 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod2)490 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod2)
491 {
492     constexpr size_t EXPECTED_CLASS_COUNT = 1;
493     constexpr size_t EXPECTED_PROP_COUNT = 5;
494 
495     std::vector<std::string> fileNames3 = {
496         "get_class_property_info_test_m2_01.ets", "get_class_property_info_test_m2_02.ets",
497         "get_class_property_info_test_m2_03.ets", "get_class_property_info_test_m2_04.ets",
498         "get_class_property_info_test_m2_05.ets", "get_class_property_info_test_m2_06.ets",
499         "get_class_property_info_test_m2_07.ets", "get_class_property_info_test_m2_08.ets",
500         "get_class_property_info_test_m2_09.ets", "get_class_property_info_test_m2_10.ets",
501         "get_class_property_info_test_m2_11.ets", "get_class_property_info_test_m2_12.ets",
502         "get_class_property_info_test_m2_13.ets", "get_class_property_info_test_m2_14.ets"};
503 
504     auto filePaths = CreateTempFile(fileNames3, fileContents3);
505     std::vector<ark::es2panda::SourceFile> sourceFiles;
506 
507     for (size_t i = 0; i < filePaths.size(); ++i) {
508         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
509     }
510     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
511 
512     Initializer initializer;
513     size_t sourceIndex = 1;
514     size_t tokenOffset = 61;
515     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
516     auto fileContent = std::string {sourceFiles[sourceIndex].source};
517     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
518     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
519     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
520     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
521     CheckClassPropertiesMatch(infos[0].properties, expectedResult2);
522 }
523 
524 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult3 = {};
525 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod3)526 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod3)
527 {
528     constexpr size_t EXPECTED_CLASS_COUNT = 2;
529     constexpr size_t EXPECTED_PROP_COUNT = 0;
530 
531     std::vector<std::string> fileNames3 = {
532         "get_class_property_info_test_m3_01.ets", "get_class_property_info_test_m3_02.ets",
533         "get_class_property_info_test_m3_03.ets", "get_class_property_info_test_m3_04.ets",
534         "get_class_property_info_test_m3_05.ets", "get_class_property_info_test_m3_06.ets",
535         "get_class_property_info_test_m3_07.ets", "get_class_property_info_test_m3_08.ets",
536         "get_class_property_info_test_m3_09.ets", "get_class_property_info_test_m3_10.ets",
537         "get_class_property_info_test_m3_11.ets", "get_class_property_info_test_m3_12.ets",
538         "get_class_property_info_test_m3_13.ets", "get_class_property_info_test_m3_14.ets"};
539 
540     auto filePaths = CreateTempFile(fileNames3, fileContents3);
541     std::vector<ark::es2panda::SourceFile> sourceFiles;
542 
543     for (size_t i = 0; i < filePaths.size(); ++i) {
544         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
545     }
546     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
547 
548     Initializer initializer;
549     size_t sourceIndex = 2;
550     size_t tokenOffset = 104;
551     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
552     auto fileContent = std::string {sourceFiles[sourceIndex].source};
553     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
554     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
555     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
556     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
557     CheckClassPropertiesMatch(infos[0].properties, expectedResult3);
558 }
559 
560 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult4 = {
561     {"pop", 107, 119, "classField", {"public"}}};
562 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod4)563 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod4)
564 {
565     constexpr size_t EXPECTED_CLASS_COUNT = 2;
566     constexpr size_t EXPECTED_PROP_COUNT = 1;
567 
568     std::vector<std::string> fileNames3 = {
569         "get_class_property_info_test_m4_01.ets", "get_class_property_info_test_m4_02.ets",
570         "get_class_property_info_test_m4_03.ets", "get_class_property_info_test_m4_04.ets",
571         "get_class_property_info_test_m4_05.ets", "get_class_property_info_test_m4_06.ets",
572         "get_class_property_info_test_m4_07.ets", "get_class_property_info_test_m4_08.ets",
573         "get_class_property_info_test_m4_09.ets", "get_class_property_info_test_m4_10.ets",
574         "get_class_property_info_test_m4_11.ets", "get_class_property_info_test_m4_12.ets",
575         "get_class_property_info_test_m4_13.ets", "get_class_property_info_test_m4_14.ets"};
576 
577     auto filePaths = CreateTempFile(fileNames3, fileContents3);
578     std::vector<ark::es2panda::SourceFile> sourceFiles;
579 
580     for (size_t i = 0; i < filePaths.size(); ++i) {
581         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
582     }
583     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
584 
585     Initializer initializer;
586     size_t sourceIndex = 3;
587     size_t tokenOffset = 117;
588     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
589     auto fileContent = std::string {sourceFiles[sourceIndex].source};
590     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
591     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
592     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
593     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
594     CheckClassPropertiesMatch(infos[0].properties, expectedResult4);
595 }
596 
597 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult5 = {
598     {"jkk", 64, 76, "classField", {"public"}}};
599 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod5)600 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod5)
601 {
602     constexpr size_t EXPECTED_CLASS_COUNT = 2;
603     constexpr size_t EXPECTED_PROP_COUNT = 1;
604 
605     std::vector<std::string> fileNames3 = {
606         "get_class_property_info_test_m5_01.ets", "get_class_property_info_test_m5_02.ets",
607         "get_class_property_info_test_m5_03.ets", "get_class_property_info_test_m5_04.ets",
608         "get_class_property_info_test_m5_05.ets", "get_class_property_info_test_m5_06.ets",
609         "get_class_property_info_test_m5_07.ets", "get_class_property_info_test_m5_08.ets",
610         "get_class_property_info_test_m5_09.ets", "get_class_property_info_test_m5_10.ets",
611         "get_class_property_info_test_m5_11.ets", "get_class_property_info_test_m5_12.ets",
612         "get_class_property_info_test_m5_13.ets", "get_class_property_info_test_m5_14.ets"};
613 
614     auto filePaths = CreateTempFile(fileNames3, fileContents3);
615     std::vector<ark::es2panda::SourceFile> sourceFiles;
616 
617     for (size_t i = 0; i < filePaths.size(); ++i) {
618         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
619     }
620     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
621 
622     Initializer initializer;
623     size_t sourceIndex = 4;
624     size_t tokenOffset = 76;
625     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
626     auto fileContent = std::string {sourceFiles[sourceIndex].source};
627     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
628     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
629     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
630     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
631     CheckClassPropertiesMatch(infos[0].properties, expectedResult5);
632 }
633 
634 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult6 = {
635     {"jkk", 195, 207, "classField", {"public"}}, {"wwa", 210, 222, "classField", {"public"}}};
636 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod6)637 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod6)
638 {
639     constexpr size_t EXPECTED_CLASS_COUNT = 2;
640     constexpr size_t EXPECTED_PROP_COUNT = 2;
641 
642     std::vector<std::string> fileNames3 = {
643         "get_class_property_info_test_m6_01.ets", "get_class_property_info_test_m6_02.ets",
644         "get_class_property_info_test_m6_03.ets", "get_class_property_info_test_m6_04.ets",
645         "get_class_property_info_test_m6_05.ets", "get_class_property_info_test_m6_06.ets",
646         "get_class_property_info_test_m6_07.ets", "get_class_property_info_test_m6_08.ets",
647         "get_class_property_info_test_m6_09.ets", "get_class_property_info_test_m6_10.ets",
648         "get_class_property_info_test_m6_11.ets", "get_class_property_info_test_m6_12.ets",
649         "get_class_property_info_test_m6_13.ets", "get_class_property_info_test_m6_14.ets"};
650 
651     auto filePaths = CreateTempFile(fileNames3, fileContents3);
652     std::vector<ark::es2panda::SourceFile> sourceFiles;
653 
654     for (size_t i = 0; i < filePaths.size(); ++i) {
655         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
656     }
657     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
658 
659     Initializer initializer;
660     size_t sourceIndex = 5;
661     size_t tokenOffset = 222;
662     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
663     auto fileContent = std::string {sourceFiles[sourceIndex].source};
664     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
665     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
666     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
667     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
668     CheckClassPropertiesMatch(infos[0].properties, expectedResult6);
669 }
670 
671 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult7 = {
672     {"test", 14, 27, "classField", {"public"}}};
673 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod7)674 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod7)
675 {
676     constexpr size_t EXPECTED_CLASS_COUNT = 1;
677     constexpr size_t EXPECTED_PROP_COUNT = 1;
678 
679     std::vector<std::string> fileNames3 = {
680         "get_class_property_info_test_m7_01.ets", "get_class_property_info_test_m7_02.ets",
681         "get_class_property_info_test_m7_03.ets", "get_class_property_info_test_m7_04.ets",
682         "get_class_property_info_test_m7_05.ets", "get_class_property_info_test_m7_06.ets",
683         "get_class_property_info_test_m7_07.ets", "get_class_property_info_test_m7_08.ets",
684         "get_class_property_info_test_m7_09.ets", "get_class_property_info_test_m7_10.ets",
685         "get_class_property_info_test_m7_11.ets", "get_class_property_info_test_m7_12.ets",
686         "get_class_property_info_test_m7_13.ets", "get_class_property_info_test_m7_14.ets"};
687 
688     auto filePaths = CreateTempFile(fileNames3, fileContents3);
689     std::vector<ark::es2panda::SourceFile> sourceFiles;
690 
691     for (size_t i = 0; i < filePaths.size(); ++i) {
692         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
693     }
694     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
695 
696     Initializer initializer;
697     size_t sourceIndex = 6;
698     size_t tokenOffset = 27;
699     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
700     auto fileContent = std::string {sourceFiles[sourceIndex].source};
701     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
702     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
703     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
704     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
705     CheckClassPropertiesMatch(infos[0].properties, expectedResult7);
706 }
707 
708 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult8 = {
709     {"_a", 22, 40, "classField", {"private"}}};
710 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod8)711 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod8)
712 {
713     constexpr size_t EXPECTED_CLASS_COUNT = 1;
714     constexpr size_t EXPECTED_PROP_COUNT = 1;
715 
716     std::vector<std::string> fileNames3 = {
717         "get_class_property_info_test_m8_01.ets", "get_class_property_info_test_m8_02.ets",
718         "get_class_property_info_test_m8_03.ets", "get_class_property_info_test_m8_04.ets",
719         "get_class_property_info_test_m8_05.ets", "get_class_property_info_test_m8_06.ets",
720         "get_class_property_info_test_m8_07.ets", "get_class_property_info_test_m8_08.ets",
721         "get_class_property_info_test_m8_09.ets", "get_class_property_info_test_m8_10.ets",
722         "get_class_property_info_test_m8_11.ets", "get_class_property_info_test_m8_12.ets",
723         "get_class_property_info_test_m8_13.ets", "get_class_property_info_test_m8_14.ets"};
724 
725     auto filePaths = CreateTempFile(fileNames3, fileContents3);
726     std::vector<ark::es2panda::SourceFile> sourceFiles;
727 
728     for (size_t i = 0; i < filePaths.size(); ++i) {
729         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
730     }
731     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
732 
733     Initializer initializer;
734     size_t sourceIndex = 7;
735     size_t tokenOffset = 40;
736     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
737     auto fileContent = std::string {sourceFiles[sourceIndex].source};
738     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
739     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
740     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
741     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
742     CheckClassPropertiesMatch(infos[0].properties, expectedResult8);
743 }
744 
745 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult9 = {
746     {"a", 22, 39, "classField", {"public", "static"}}};
747 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod9)748 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod9)
749 {
750     constexpr size_t EXPECTED_CLASS_COUNT = 1;
751     constexpr size_t EXPECTED_PROP_COUNT = 1;
752 
753     std::vector<std::string> fileNames3 = {
754         "get_class_property_info_test_m9_01.ets", "get_class_property_info_test_m9_02.ets",
755         "get_class_property_info_test_m9_03.ets", "get_class_property_info_test_m9_04.ets",
756         "get_class_property_info_test_m9_05.ets", "get_class_property_info_test_m9_06.ets",
757         "get_class_property_info_test_m9_07.ets", "get_class_property_info_test_m9_08.ets",
758         "get_class_property_info_test_m9_09.ets", "get_class_property_info_test_m9_10.ets",
759         "get_class_property_info_test_m9_11.ets", "get_class_property_info_test_m9_12.ets",
760         "get_class_property_info_test_m9_13.ets", "get_class_property_info_test_m9_14.ets"};
761 
762     auto filePaths = CreateTempFile(fileNames3, fileContents3);
763     std::vector<ark::es2panda::SourceFile> sourceFiles;
764 
765     for (size_t i = 0; i < filePaths.size(); ++i) {
766         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
767     }
768     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
769 
770     Initializer initializer;
771     size_t sourceIndex = 8;
772     size_t tokenOffset = 39;
773     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
774     auto fileContent = std::string {sourceFiles[sourceIndex].source};
775     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
776     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
777     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
778     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
779     CheckClassPropertiesMatch(infos[0].properties, expectedResult9);
780 }
781 
782 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult10 = {
783     {"a", 17, 34, "classField", {"public"}}};
784 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod10)785 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod10)
786 {
787     constexpr size_t EXPECTED_CLASS_COUNT = 1;
788     constexpr size_t EXPECTED_PROP_COUNT = 1;
789 
790     std::vector<std::string> fileNames3 = {
791         "get_class_property_info_test_m10_01.ets", "get_class_property_info_test_m10_02.ets",
792         "get_class_property_info_test_m10_03.ets", "get_class_property_info_test_m10_04.ets",
793         "get_class_property_info_test_m10_05.ets", "get_class_property_info_test_m10_06.ets",
794         "get_class_property_info_test_m10_07.ets", "get_class_property_info_test_m10_08.ets",
795         "get_class_property_info_test_m10_09.ets", "get_class_property_info_test_m10_10.ets",
796         "get_class_property_info_test_m10_11.ets", "get_class_property_info_test_m10_12.ets",
797         "get_class_property_info_test_m10_13.ets", "get_class_property_info_test_m10_14.ets"};
798 
799     auto filePaths = CreateTempFile(fileNames3, fileContents3);
800     std::vector<ark::es2panda::SourceFile> sourceFiles;
801 
802     for (size_t i = 0; i < filePaths.size(); ++i) {
803         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
804     }
805     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
806 
807     Initializer initializer;
808     size_t sourceIndex = 9;
809     size_t tokenOffset = 35;
810     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
811     auto fileContent = std::string {sourceFiles[sourceIndex].source};
812     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
813     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
814     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
815     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
816     CheckClassPropertiesMatch(infos[0].properties, expectedResult10);
817 }
818 
819 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult11 = {
820     {"a", 32, 49, "classField", {"public"}}};
821 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod11)822 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod11)
823 {
824     constexpr size_t EXPECTED_CLASS_COUNT = 1;
825     constexpr size_t EXPECTED_PROP_COUNT = 1;
826 
827     std::vector<std::string> fileNames3 = {
828         "get_class_property_info_test_m11_01.ets", "get_class_property_info_test_m11_02.ets",
829         "get_class_property_info_test_m11_03.ets", "get_class_property_info_test_m11_04.ets",
830         "get_class_property_info_test_m11_05.ets", "get_class_property_info_test_m11_06.ets",
831         "get_class_property_info_test_m11_07.ets", "get_class_property_info_test_m11_08.ets",
832         "get_class_property_info_test_m11_09.ets", "get_class_property_info_test_m11_10.ets",
833         "get_class_property_info_test_m11_11.ets", "get_class_property_info_test_m11_12.ets",
834         "get_class_property_info_test_m11_13.ets", "get_class_property_info_test_m11_14.ets"};
835 
836     auto filePaths = CreateTempFile(fileNames3, fileContents3);
837     std::vector<ark::es2panda::SourceFile> sourceFiles;
838 
839     for (size_t i = 0; i < filePaths.size(); ++i) {
840         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
841     }
842     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
843 
844     Initializer initializer;
845     size_t sourceIndex = 10;
846     size_t tokenOffset = 50;
847     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
848     auto fileContent = std::string {sourceFiles[sourceIndex].source};
849     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
850     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
851     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
852     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
853     CheckClassPropertiesMatch(infos[0].properties, expectedResult11);
854 }
855 
856 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult12 = {
857     {"name", 24, 37, "classField", {"private"}},
858     {"age", 49, 57, "classField", {"private"}},
859     {"doTask", 69, 86, "classField", {"private"}}};
860 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod12)861 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod12)
862 {
863     constexpr size_t EXPECTED_CLASS_COUNT = 1;
864     constexpr size_t EXPECTED_PROP_COUNT = 3;
865 
866     std::vector<std::string> fileNames3 = {
867         "get_class_property_info_test_m12_01.ets", "get_class_property_info_test_m12_02.ets",
868         "get_class_property_info_test_m12_03.ets", "get_class_property_info_test_m12_04.ets",
869         "get_class_property_info_test_m12_05.ets", "get_class_property_info_test_m12_06.ets",
870         "get_class_property_info_test_m12_07.ets", "get_class_property_info_test_m12_08.ets",
871         "get_class_property_info_test_m12_09.ets", "get_class_property_info_test_m12_10.ets",
872         "get_class_property_info_test_m12_11.ets", "get_class_property_info_test_m12_12.ets",
873         "get_class_property_info_test_m12_13.ets", "get_class_property_info_test_m12_14.ets"};
874 
875     auto filePaths = CreateTempFile(fileNames3, fileContents3);
876     std::vector<ark::es2panda::SourceFile> sourceFiles;
877 
878     for (size_t i = 0; i < filePaths.size(); ++i) {
879         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
880     }
881     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
882 
883     Initializer initializer;
884     size_t sourceIndex = 11;
885     size_t tokenOffset = 87;
886     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
887     auto fileContent = std::string {sourceFiles[sourceIndex].source};
888     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
889     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
890     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
891     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
892     CheckClassPropertiesMatch(infos[0].properties, expectedResult12);
893 }
894 
895 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult13 = {
896     {"aa", 216, 227, "classField", {"public"}}};
897 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod13)898 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod13)
899 {
900     constexpr size_t EXPECTED_CLASS_COUNT = 2;
901     constexpr size_t EXPECTED_PROP_COUNT = 1;
902 
903     std::vector<std::string> fileNames3 = {
904         "get_class_property_info_test_m13_01.ets", "get_class_property_info_test_m13_02.ets",
905         "get_class_property_info_test_m13_03.ets", "get_class_property_info_test_m13_04.ets",
906         "get_class_property_info_test_m13_05.ets", "get_class_property_info_test_m13_06.ets",
907         "get_class_property_info_test_m13_07.ets", "get_class_property_info_test_m13_08.ets",
908         "get_class_property_info_test_m13_09.ets", "get_class_property_info_test_m13_10.ets",
909         "get_class_property_info_test_m13_11.ets", "get_class_property_info_test_m13_12.ets",
910         "get_class_property_info_test_m13_13.ets", "get_class_property_info_test_m13_14.ets"};
911 
912     auto filePaths = CreateTempFile(fileNames3, fileContents3);
913     std::vector<ark::es2panda::SourceFile> sourceFiles;
914 
915     for (size_t i = 0; i < filePaths.size(); ++i) {
916         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
917     }
918     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
919 
920     Initializer initializer;
921     size_t sourceIndex = 12;
922     size_t tokenOffset = 232;
923     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
924     auto fileContent = std::string {sourceFiles[sourceIndex].source};
925     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
926     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
927     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
928     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
929     CheckClassPropertiesMatch(infos[0].properties, expectedResult13);
930 }
931 
932 std::vector<std::tuple<std::string, size_t, size_t, std::string, std::vector<std::string>>> expectedResult14 = {
933     {"subscriber", 144, 210, "classField", {"public"}}, {"subscribeInfo", 221, 254, "classField", {"public"}}};
934 
TEST_F(LspGetClassPropertyInfoTests,GetClassPropertyInfoMethod14)935 TEST_F(LspGetClassPropertyInfoTests, GetClassPropertyInfoMethod14)
936 {
937     constexpr size_t EXPECTED_CLASS_COUNT = 1;
938     constexpr size_t EXPECTED_PROP_COUNT = 2;
939 
940     std::vector<std::string> fileNames3 = {
941         "get_class_property_info_test_m14_01.ets", "get_class_property_info_test_m14_02.ets",
942         "get_class_property_info_test_m14_03.ets", "get_class_property_info_test_m14_04.ets",
943         "get_class_property_info_test_m14_05.ets", "get_class_property_info_test_m14_06.ets",
944         "get_class_property_info_test_m14_07.ets", "get_class_property_info_test_m14_08.ets",
945         "get_class_property_info_test_m14_09.ets", "get_class_property_info_test_m14_10.ets",
946         "get_class_property_info_test_m14_11.ets", "get_class_property_info_test_m14_12.ets",
947         "get_class_property_info_test_m14_13.ets", "get_class_property_info_test_m14_14.ets"};
948 
949     auto filePaths = CreateTempFile(fileNames3, fileContents3);
950     std::vector<ark::es2panda::SourceFile> sourceFiles;
951 
952     for (size_t i = 0; i < filePaths.size(); ++i) {
953         sourceFiles.emplace_back(filePaths[i], fileContents3[i]);
954     }
955     ASSERT_EQ(fileNames3.size(), sourceFiles.size());
956 
957     Initializer initializer;
958     size_t sourceIndex = 13;
959     size_t tokenOffset = 256;
960     auto filePath = std::string {sourceFiles[sourceIndex].filePath};
961     auto fileContent = std::string {sourceFiles[sourceIndex].source};
962     auto context = initializer.CreateContext(filePath.c_str(), ES2PANDA_STATE_CHECKED, fileContent.c_str());
963     auto infos = ark::es2panda::lsp::GetClassPropertyInfo(context, tokenOffset, true);
964     ASSERT_EQ(EXPECTED_CLASS_COUNT, infos.size());
965     ASSERT_EQ(EXPECTED_PROP_COUNT, infos[0].properties.size());
966     CheckClassPropertiesMatch(infos[0].properties, expectedResult14);
967 }
968 
969 // NOLINTEND
970 }  // namespace