1 /*
2  * Copyright (c) 2023 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 #ifndef ECMASCRIPT_TOOLING_TEST_TESTCASES_JS_MODULE_VARIABLE_TEST_H
17 #define ECMASCRIPT_TOOLING_TEST_TESTCASES_JS_MODULE_VARIABLE_TEST_H
18 
19 #include "tooling/test/client_utils/test_util.h"
20 
21 namespace panda::ecmascript::tooling::test {
22 class JsModuleVariableTest : public TestActions {
23 public:
JsModuleVariableTest()24     JsModuleVariableTest()
25     {
26         testAction = {
27             {SocketAction::SEND, "enable"},
28             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess},
29             {SocketAction::SEND, "runtime-enable"},
30             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess},
31             {SocketAction::SEND, "run"},
32             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess},
33             // load export_variable_second.js
34             {SocketAction::RECV, "Debugger.scriptParsed", ActionRule::STRING_CONTAIN},
35             {SocketAction::RECV, "Debugger.paused", ActionRule::STRING_CONTAIN},
36             {SocketAction::SEND, "resume"},
37             {SocketAction::RECV, "Debugger.resumed", ActionRule::STRING_CONTAIN},
38             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess},
39             // load export_variable_first.js
40             {SocketAction::RECV, "Debugger.scriptParsed", ActionRule::STRING_CONTAIN},
41             {SocketAction::RECV, "Debugger.paused", ActionRule::STRING_CONTAIN},
42             {SocketAction::SEND, "resume"},
43             {SocketAction::RECV, "Debugger.resumed", ActionRule::STRING_CONTAIN},
44             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess},
45             // load module_variable.js
46             {SocketAction::RECV, "Debugger.scriptParsed", ActionRule::STRING_CONTAIN},
47             // break on start
48             {SocketAction::RECV, "Debugger.paused", ActionRule::STRING_CONTAIN},
49             // set breakpoint
50             {SocketAction::SEND, "b " DEBUGGER_JS_DIR"module_variable.js 247"},
51             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess},
52 
53             {SocketAction::SEND, "resume"},
54             {SocketAction::RECV, "Debugger.resumed", ActionRule::STRING_CONTAIN},
55             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess},
56             {SocketAction::RECV, "Debugger.paused", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
57                 std::unique_ptr<PtJson> json = PtJson::Parse(recv);
58                 Result ret;
59                 std::string method;
60                 ret = json->GetString("method", &method);
61                 if (ret != Result::SUCCESS || method != "Debugger.paused") {
62                     return false;
63                 }
64 
65                 std::unique_ptr<PtJson> params = nullptr;
66                 ret = json->GetObject("params", &params);
67                 if (ret != Result::SUCCESS) {
68                     return false;
69                 }
70 
71                 std::unique_ptr<PtJson> hitBreakpoints = nullptr;
72                 ret = params->GetArray("hitBreakpoints", &hitBreakpoints);
73                 if (ret != Result::SUCCESS) {
74                     return false;
75                 }
76 
77                 std::string breakpoint;
78                 breakpoint = hitBreakpoints->Get(0)->GetString();
79                 if (ret != Result::SUCCESS || breakpoint.find(sourceFile_) == std::string::npos ||
80                     breakpoint.find("246") == std::string::npos) {
81                     return false;
82                 }
83 
84                 DebuggerClient debuggerClient(0);
85                 debuggerClient.PausedReply(std::move(json));
86                 return true;
87             }},
88 
89             {SocketAction::SEND, "p"},
90             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool {
91                 std::unique_ptr<PtJson> json = PtJson::Parse(recv);
92                 std::unique_ptr<PtJson> result;
93 
94                 int id;
95                 Result ret = json->GetInt("id", &id);
96                 if (ret != Result::SUCCESS) {
97                     return false;
98                 }
99 
100                 ret = json->GetObject("result", &result);
101                 if (ret != Result::SUCCESS) {
102                     return false;
103                 }
104 
105                 std::unique_ptr<PtJson> innerResult;
106                 ret = result->GetArray("result", &innerResult);
107                 if (ret != Result::SUCCESS) {
108                     return false;
109                 }
110 
111                 RuntimeClient runtimeClient(0);
112                 runtimeClient.HandleGetProperties(std::move(json), id);
113                 return true;
114             }},
115 
116             {SocketAction::SEND, "p 3"},
117             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
118                 std::unique_ptr<PtJson> json = PtJson::Parse(recv);
119                 std::unique_ptr<PtJson> result;
120 
121                 int id;
122                 Result ret = json->GetInt("id", &id);
123                 if (ret != Result::SUCCESS) {
124                     return false;
125                 }
126 
127                 ret = json->GetObject("result", &result);
128                 if (ret != Result::SUCCESS) {
129                     return false;
130                 }
131 
132                 std::unique_ptr<PtJson> innerResult;
133                 ret = result->GetArray("result", &innerResult);
134                 if (ret != Result::SUCCESS) {
135                     return false;
136                 }
137 
138                 std::vector<std::unique_ptr<PropertyDescriptor>> outPropertyDesc;
139                 for (int32_t i = 0; i < innerResult->GetSize(); i++) {
140                     auto variableInfo = PropertyDescriptor::Create(*(innerResult->Get(i)));
141                     outPropertyDesc.emplace_back(std::move(variableInfo));
142                 }
143 
144                 std::map<std::string, std::vector<std::string>> actualProperties;
145                 for (const auto &property : outPropertyDesc) {
146                     std::vector<std::string> attributes;
147                     RemoteObject *value = property->GetValue();
148                     std::cout << " ============================== " << std::endl;
149                     std::cout << "variableName: " << property->GetName() << std::endl;
150                     PushValueInfo(value, attributes);
151                     actualProperties[property->GetName()] = attributes;
152                 }
153 
154                 // compare size
155                 if (actualProperties.size() != moduleVariableMap_.size()) {
156                     std::cout << "actualProperties.size() != moduleVariableMap_.size()" << std::endl;
157                     std::cout << "actualProperties.size() is: " << actualProperties.size() << std::endl;
158                     std::cout << "moduleVariableMap_.size() is: " << moduleVariableMap_.size() << std::endl;
159                     return false;
160                 }
161 
162                 // compare the properties of each variable
163                 for (const auto &actualProperty : actualProperties) {
164                     const std::string &variableName = actualProperty.first;
165                     const std::vector<std::string> &actualAttributes = actualProperty.second;
166 
167                     if (moduleVariableMap_.find(variableName) != moduleVariableMap_.end()) {
168                         const std::vector<std::string> &expectedAttributes = moduleVariableMap_.at(variableName);
169                         if (actualAttributes == expectedAttributes) {
170                             continue;
171                         } else {
172                             std::cout << "Property mismatch: " << variableName << std::endl;
173                             return false;
174                         }
175                     } else {
176                         std::cout << "variable name not found: " << variableName << std::endl;
177                         return false;
178                     }
179                 }
180 
181                 RuntimeClient runtimeClient(0);
182                 runtimeClient.HandleGetProperties(std::move(json), id);
183                 return true;
184             }},
185 
186             {SocketAction::SEND, "p 5"},
187             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
188                 return CompareExpected(recv, innerDes[expectDesIndex]);
189             }},
190 
191             {SocketAction::SEND, "p 6"},
192             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
193                 return CompareExpected(recv, innerDes[expectDesIndex]);
194             }},
195 
196             {SocketAction::SEND, "p 7"},
197             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
198                 return CompareExpected(recv, innerDes[expectDesIndex]);
199             }},
200 
201             {SocketAction::SEND, "p 10"},
202             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
203                 return CompareExpected(recv, innerDes[expectDesIndex]);
204             }},
205 
206             {SocketAction::SEND, "p 13"},
207             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
208                 return CompareExpected(recv, innerDes[expectDesIndex]);
209             }},
210 
211             {SocketAction::SEND, "p 16"},
212             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
213                 return CompareExpected(recv, innerDes[expectDesIndex]);
214             }},
215 
216             {SocketAction::SEND, "p 17"},
217             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
218                 return CompareExpected(recv, innerDes[expectDesIndex]);
219             }},
220 
221             {SocketAction::SEND, "p 20"},
222             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
223                 return CompareExpected(recv, innerDes[expectDesIndex]);
224             }},
225 
226             {SocketAction::SEND, "p 23"},
227             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
228                 return CompareExpected(recv, innerDes[expectDesIndex]);
229             }},
230 
231             {SocketAction::SEND, "p 26"},
232             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
233                 return CompareExpected(recv, innerDes[expectDesIndex]);
234             }},
235 
236             {SocketAction::SEND, "p 29"},
237             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
238                 return CompareExpected(recv, innerDes[expectDesIndex]);
239             }},
240 
241             {SocketAction::SEND, "p 32"},
242             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
243                 return CompareExpected(recv, innerDes[expectDesIndex]);
244             }},
245 
246             {SocketAction::SEND, "p 35"},
247             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
248                 return CompareExpected(recv, innerDes[expectDesIndex]);
249             }},
250 
251             {SocketAction::SEND, "p 38"},
252             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
253                 return CompareExpected(recv, innerDes[expectDesIndex]);
254             }},
255 
256             {SocketAction::SEND, "p 44"},
257             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
258                 return CompareExpected(recv, innerDes[expectDesIndex]);
259             }},
260 
261             {SocketAction::SEND, "p 50"},
262             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
263                 return CompareExpected(recv, innerDes[expectDesIndex]);
264             }},
265 
266             {SocketAction::SEND, "p 91"},
267             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [this] (auto recv, auto, auto) -> bool {
268                 return CompareExpected(recv, innerDes[expectDesIndex]);
269             }},
270 
271             // reply success and run
272             {SocketAction::SEND, "success"},
273             {SocketAction::SEND, "resume"},
274             {SocketAction::RECV, "Debugger.resumed", ActionRule::STRING_CONTAIN},
275             {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess},
276         };
277     }
278 
279     std::pair<std::string, std::string> GetEntryPoint() override
280     {
281         return {pandaFile_, entryPoint_};
282     }
283     ~JsModuleVariableTest() = default;
284 
285 private:
286     std::string pandaFile_ = DEBUGGER_ABC_DIR "module_variable.abc";
287     std::string sourceFile_ = DEBUGGER_JS_DIR "module_variable.js";
288     std::string entryPoint_ = "module_variable";
289     size_t expectDesIndex = 0;
290 
PushValueInfo(RemoteObject *value, std::vector<std::string> &infos)291     void PushValueInfo(RemoteObject *value, std::vector<std::string> &infos)
292     {
293         std::cout << "type: " << value->GetType() << std::endl;
294         infos.push_back(value->GetType());
295         if (value->HasSubType()) {
296             std::cout << "sub type: " << value->GetSubType() << std::endl;
297             infos.push_back(value->GetSubType());
298         }
299         if (value->HasClassName()) {
300             std::cout << "class name: " << value->GetClassName() << std::endl;
301             infos.push_back(value->GetClassName());
302         }
303         if (value->HasUnserializableValue()) {
304             std::cout << "unserializableValue: " << value->GetUnserializableValue() << std::endl;
305             infos.push_back(value->GetUnserializableValue());
306         }
307         if (value->HasDescription()) {
308             std::cout << "desc: " << value->GetDescription() << std::endl;
309             infos.push_back(value->GetDescription());
310         }
311     }
312 
CompareExpected(std::string recv, const std::string &expect)313     bool CompareExpected(std::string recv, const std::string &expect)
314     {
315         expectDesIndex++;
316         return recv == expect;
317     }
318 
319     const std::map<std::string, std::vector<std::string>> moduleVariableMap_ = {
320         { "string0", { "string", "helloworld", "helloworld" } },
321         { "boolean0", { "object", "Object", "Boolean{[[PrimitiveValue]]: false}",
322             "Boolean{[[PrimitiveValue]]: false}"} },
323         { "number0", { "number", "1", "1" } },
324         { "obj0", { "object", "Object", "Object", "Object"} },
325         { "arraybuffer0", { "object", "arraybuffer", "Arraybuffer", "Arraybuffer(24)", "Arraybuffer(24)"} },
326         { "function0", { "function", "Function", "function function0( { [js code] }",
327             "function function0( { [js code] }" } },
328         { "generator0", { "function", "Generator", "function* generator0( { [js code] }",
329             "function* generator0( { [js code] }" } },
330         { "map0", { "object", "map", "Map", "Map(0)", "Map(0)"} },
331         { "set0", { "object", "set", "Set", "Set(0)", "Set(0)"} },
332         { "undefined0", { "undefined" } },
333         { "array0", { "object", "array", "Array", "Array(2)", "Array(2)"} },
334         { "regexp0", { "object", "regexp", "RegExp", "/^\\d+\\.\\d+$/i", "/^\\d+\\.\\d+$/i"} },
335         { "uint8array0", { "object", "Object", "Uint8Array(24)", "Uint8Array(24)"} },
336         { "dataview0", { "object", "dataview", "Dataview", "DataView(24)", "DataView(24)"} },
337         { "bigint0", { "bigint", "999n", "999n" } },
338         { "typedarray0", { "object", "Object", "Uint8Array(0)", "Uint8Array(0)"} },
339         { "sharedarraybuffer0", { "object", "Object", "SharedArrayBuffer(32)", "SharedArrayBuffer(32)"} },
340         { "weakref0", { "object", "Object", "WeakRef {}", "WeakRef {}"} },
341         { "iterator0", { "function", "Function", "function [Symbol.iterator]( { [native code] }",
342             "function [Symbol.iterator]( { [native code] }" } },
343         { "string1", { "string", "helloworld1", "helloworld1" } },
344         { "boolean1", { "object", "Object", "Boolean{[[PrimitiveValue]]: false}",
345             "Boolean{[[PrimitiveValue]]: false}"} },
346         { "number1", { "number", "11", "11" } },
347         { "obj1", { "object", "Object", "Object", "Object"} },
348         { "arraybuffer1", { "object", "arraybuffer", "Arraybuffer", "Arraybuffer(24)", "Arraybuffer(24)"} },
349         { "function1", { "function", "Function", "function function1( { [js code] }",
350             "function function1( { [js code] }" } },
351         { "generator1", { "function", "Generator", "function* generator1( { [js code] }",
352             "function* generator1( { [js code] }" } },
353         { "map1", { "object", "map", "Map", "Map(0)", "Map(0)"} },
354         { "set1", { "object", "set", "Set", "Set(0)", "Set(0)"} },
355         { "undefined1", { "undefined" } },
356         { "regexp1", { "object", "regexp", "RegExp", "/^\\d+\\.\\d+$/i", "/^\\d+\\.\\d+$/i"} },
357         { "uint8array1", { "object", "Object", "Uint8Array(24)", "Uint8Array(24)"} },
358         { "dataview1", { "object", "dataview", "Dataview", "DataView(24)", "DataView(24)"} },
359         { "bigint1", { "bigint", "9999n", "9999n" } },
360         { "typedarray1", { "object", "Object", "Uint8Array(0)", "Uint8Array(0)"} },
361         { "sharedarraybuffer1", { "object", "Object", "SharedArrayBuffer(32)", "SharedArrayBuffer(32)"} },
362         { "weakref1", { "object", "Object", "WeakRef {}", "WeakRef {}"} },
363         { "iterator1", { "function", "Function", "function [Symbol.iterator]( { [native code] }",
364             "function [Symbol.iterator]( { [native code] }" } },
365         { "string2", { "string", "helloworld11", "helloworld11" } },
366         { "boolean2", { "object", "Object", "Boolean{[[PrimitiveValue]]: false}",
367             "Boolean{[[PrimitiveValue]]: false}"} },
368         { "number2", { "number", "111", "111" } },
369         { "obj2", { "object", "Object", "Object", "Object"} },
370         { "arraybuffer2", { "object", "arraybuffer", "Arraybuffer", "Arraybuffer(24)", "Arraybuffer(24)"} },
371         { "function2", { "function", "Function", "function function2( { [js code] }",
372             "function function2( { [js code] }" } },
373         { "generator2", { "function", "Generator", "function* generator2( { [js code] }",
374             "function* generator2( { [js code] }" } },
375         { "map2", { "object", "map", "Map", "Map(0)", "Map(0)"} },
376         { "set2", { "object", "set", "Set", "Set(0)", "Set(0)"} },
377         { "undefined2", { "undefined" } },
378         { "regexp2", { "object", "regexp", "RegExp", "/^\\d+\\.\\d+$/i", "/^\\d+\\.\\d+$/i"} },
379         { "uint8array2", { "object", "Object", "Uint8Array(24)", "Uint8Array(24)"} },
380         { "dataview2", { "object", "dataview", "Dataview", "DataView(24)", "DataView(24)"} },
381         { "bigint2", { "bigint", "9999n", "9999n" } },
382         { "typedarray2", { "object", "Object", "Uint8Array(0)", "Uint8Array(0)"} },
383         { "sharedarraybuffer2", { "object", "Object", "SharedArrayBuffer(32)", "SharedArrayBuffer(32)"} },
384         { "weakref2", { "object", "Object", "WeakRef {}", "WeakRef {}"} },
385         { "iterator2", { "function", "Function", "function [Symbol.iterator]( { [native code] }",
386             "function [Symbol.iterator]( { [native code] }" } },
387         { "string4", { "string", "helloworld123", "helloworld123" } },
388         { "boolean4", { "object", "Object", "Boolean{[[PrimitiveValue]]: true}", "Boolean{[[PrimitiveValue]]: true}"} },
389         { "number4", { "number", "4", "4" } },
390         { "foo", { "function", "Function", "function foo( { [js code] }", "function foo( { [js code] }"} },
391         { "string6", { "string", "helloworld12345", "helloworld12345" } },
392         { "boolean6", { "object", "Object", "Boolean{[[PrimitiveValue]]: true}", "Boolean{[[PrimitiveValue]]: true}"} },
393         { "number6", { "number", "6", "6" } },
394         { "obj6", { "object", "Object", "Object", "Object"} },
395         { "arraybuffer6", { "object", "arraybuffer", "Arraybuffer", "Arraybuffer(24)", "Arraybuffer(24)"} },
396         { "function6", { "function", "Function", "function function6( { [js code] }",
397             "function function6( { [js code] }" } },
398         { "generator6", { "function", "Generator", "function* generator6( { [js code] }",
399             "function* generator6( { [js code] }" } },
400         { "map6", { "object", "map", "Map", "Map(0)", "Map(0)"} },
401         { "set6", { "object", "set", "Set", "Set(0)", "Set(0)"} },
402         { "undefined6", { "undefined" } },
403         { "array6", { "object", "array", "Array", "Array(2)", "Array(2)"} },
404         { "regexp6", { "object", "regexp", "RegExp", "/^\\d+\\.\\d+$/i", "/^\\d+\\.\\d+$/i"} },
405         { "uint8array6", { "object", "Object", "Uint8Array(24)", "Uint8Array(24)"} },
406         { "dataview6", { "object", "dataview", "Dataview", "DataView(23)", "DataView(23)"} },
407         { "bigint6", { "bigint", "99999n", "99999n" } },
408         { "string7", { "string", "helloworld12345", "helloworld12345" } },
409         { "boolean7", { "object", "Object", "Boolean{[[PrimitiveValue]]: true}", "Boolean{[[PrimitiveValue]]: true}"} },
410         { "number7", { "number", "6", "6" } },
411         { "obj7", { "object", "Object", "Object", "Object"} },
412         { "arraybuffer7", { "object", "arraybuffer", "Arraybuffer", "Arraybuffer(24)", "Arraybuffer(24)"} },
413         { "function7", { "function", "Function", "function function6( { [js code] }",
414             "function function6( { [js code] }" } },
415         { "generator7", { "function", "Generator", "function* generator6( { [js code] }",
416             "function* generator6( { [js code] }" } },
417         { "map7", { "object", "map", "Map", "Map(0)", "Map(0)"} },
418         { "set7", { "object", "set", "Set", "Set(0)", "Set(0)"} },
419         { "undefined7", { "undefined" } },
420         { "array7", { "object", "array", "Array", "Array(2)", "Array(2)"} },
421         { "regexp7", { "object", "regexp", "RegExp", "/^\\d+\\.\\d+$/i", "/^\\d+\\.\\d+$/i"} },
422         { "uint8array7", { "object", "Object", "Uint8Array(24)", "Uint8Array(24)"} },
423         { "dataview7", { "object", "dataview", "Dataview", "DataView(23)", "DataView(23)"} },
424         { "bigint7", { "bigint", "99999n", "99999n" } },
425         { "string9", { "string", "helloworld11", "helloworld11" } },
426         { "boolean9", { "object", "Object", "Boolean{[[PrimitiveValue]]: false}",
427             "Boolean{[[PrimitiveValue]]: false}"} },
428         { "number9", { "number", "111", "111" } },
429         { "obj9", { "object", "Object", "Object", "Object"} },
430         { "arraybuffer9", { "object", "arraybuffer", "Arraybuffer", "Arraybuffer(24)", "Arraybuffer(24)"} },
431         { "function9", { "function", "Function", "function function8( { [js code] }",
432             "function function8( { [js code] }" } },
433         { "generator9", { "function", "Generator", "function* generator8( { [js code] }",
434             "function* generator8( { [js code] }" } },
435         { "map9", { "object", "map", "Map", "Map(0)", "Map(0)"} },
436         { "set9", { "object", "set", "Set", "Set(0)", "Set(0)"} },
437         { "undefined9", { "undefined" } },
438         { "array9", { "object", "array", "Array", "Array(2)", "Array(2)"} },
439         { "regexp9", { "object", "regexp", "RegExp", "/^\\d+\\.\\d+$/i", "/^\\d+\\.\\d+$/i"} },
440         { "uint8array9", { "object", "Object", "Uint8Array(24)", "Uint8Array(24)"} },
441         { "dataview9", { "object", "dataview", "Dataview", "DataView(24)", "DataView(24)"} },
442         { "bigint9", { "bigint", "9999n", "9999n" } },
443         { "string2", { "string", "helloworld11", "helloworld11" } },
444         { "boolean10", { "object", "Object", "Boolean{[[PrimitiveValue]]: false}",
445             "Boolean{[[PrimitiveValue]]: false}"} },
446         { "string10", { "string", "helloworld11", "helloworld11" } },
447         { "number10", { "number", "111", "111" } },
448         { "obj10", { "object", "Object", "Object", "Object"} },
449         { "arraybuffer10", { "object", "arraybuffer", "Arraybuffer", "Arraybuffer(24)", "Arraybuffer(24)"} },
450         { "function10", { "function", "Function", "function function8( { [js code] }",
451             "function function8( { [js code] }" } },
452         { "generator10", { "function", "Generator", "function* generator8( { [js code] }",
453             "function* generator8( { [js code] }" } },
454         { "map10", { "object", "map", "Map", "Map(0)", "Map(0)"} },
455         { "set10", { "object", "set", "Set", "Set(0)", "Set(0)"} },
456         { "undefined10", { "undefined" } },
457         { "array10", { "object", "array", "Array", "Array(2)", "Array(2)"} },
458         { "regexp10", { "object", "regexp", "RegExp", "/^\\d+\\.\\d+$/i", "/^\\d+\\.\\d+$/i"} },
459         { "uint8array10", { "object", "Object", "Uint8Array(24)", "Uint8Array(24)"} },
460         { "dataview10", { "object", "dataview", "Dataview", "DataView(24)", "DataView(24)"} },
461         { "bigint10", { "bigint", "9999n", "9999n" } },
462         { "transit1", { "number", "1", "1" } },
463         { "transit2", { "number", "2", "2" } },
464         { "transit4", { "number", "3", "3" } },
465         { "transit5", { "number", "1", "1" } },
466         { "transit6", { "number", "2", "2" } },
467         { "transit7", { "number", "3", "3" } },
468         { "multipleOut1", { "number", "1", "1" } },
469         { "multipleOut2", { "number", "2", "2" } },
470         { "multipleOut3", { "number", "3", "3" } },
471         { "multipleOut4", { "number", "4", "4" } },
472         { "multipleOut5", { "number", "5", "5" } },
473         { "multipleOut6", { "number", "6", "6" } },
474         { "multipleOut10", { "number", "10", "10" } },
475         { "multipleOut11", { "number", "11", "11" } },
476         { "multipleOut12", { "number", "12", "12" } },
477         { "*default*", { "function", "Function", "function default( { [js code] }",
478             "function default( { [js code] }" } },
479         {"obj", { "object", "Object", "Object",  "Object"}}
480     };
481 
482     const std::vector<std::string> innerDes = {
483         "{\"id\":10,\"result\":{\"result\":[{\"name\":\"length\",\"value\":{\"type\":\"number\",\"unserializableValue\""
484         ":\"0\",\"description\":\"0\"},\"writable\":false,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{"
485         "\"name\":\"name\",\"value\":{\"type\":\"string\",\"unserializableValue\":\"default\",\"description\":"
486         "\"default\"},\"writable\":false,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":"
487         "\"prototype\",\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":\"Object\","
488         "\"description\":\"Object\",\"objectId\":\"100\"},\"writable\":true,\"configurable\":false,\"enumerable\":"
489         "false,\"isOwn\":true}]}}",
490 
491         "{\"id\":11,\"result\":{\"result\":[{\"name\":\"0\",\"value\":{\"type\":\"string\",\"unserializableValue\":"
492         "\"Apple\",\"description\":\"Apple\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":"
493         "true},{\"name\":\"1\",\"value\":{\"type\":\"string\",\"unserializableValue\":\"Banana\",\"description\":"
494         "\"Banana\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"length\","
495         "\"value\":{\"type\":\"number\",\"unserializableValue\":\"2\",\"description\":\"2\"},\"writable\":true,"
496         "\"configurable\":false,\"enumerable\":false,\"isOwn\":true}]}}",
497 
498         "{\"id\":12,\"result\":{\"result\":[{\"name\":\"[[Int8Array]]\",\"value\":{\"type\":\"object\",\"className\":"
499         "\"Object\",\"unserializableValue\":\"Int8Array(24)\",\"description\":\"Int8Array(24)\",\"objectId\":\"101\"},"
500         "\"writable\":true,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[Uint8Array]]\","
501         "\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":\"Uint8Array(24)\","
502         "\"description\":\"Uint8Array(24)\",\"objectId\":\"102\"},\"writable\":true,\"configurable\":true,"
503         "\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[Uint8ClampedArray]]\",\"value\":{\"type\":\"object\","
504         "\"className\":\"Object\",\"unserializableValue\":"
505         "\"Uint8ClampedArray\",\"description\":\"Uint8ClampedArray\",\"objectId\":\"103\"},"
506         "\"writable\":true,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[Int16Array]]\","
507         "\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":\"Int16Array(12)\","
508         "\"description\":\"Int16Array(12)\",\"objectId\":\"104\"},\"writable\":true,\"configurable\":true,"
509         "\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[Uint16Array]]\",\"value\":{\"type\":\"object\","
510         "\"className\":\"Object\",\"unserializableValue\":\"Uint16Array\",\"description\":\"Uint16Array\",\"objectId\":"
511         "\"105\"},\"writable\":true,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":"
512         "\"[[Int32Array]]\",\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":"
513         "\"Int32Array(6)\",\"description\":\"Int32Array(6)\",\"objectId\":\"106\"},\"writable\":true,\"configurable\":"
514         "true,\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[Uint32Array]]\",\"value\":{\"type\":\"object\","
515         "\"className\":\"Object\",\"unserializableValue\":\"Uint32Array\","
516         "\"description\":\"Uint32Array\",\"objectId\":\"107\"},"
517         "\"writable\":true,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[Float32Array]]\","
518         "\"value\":{\"type\":\"object\",\"className\":\"Object\","
519         "\"unserializableValue\":\"Float32Array\",\"description\":"
520         "\"Float32Array\",\"objectId\":\"108\"},\"writable\":"
521         "true,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},"
522         "{\"name\":\"[[Float64Array]]\",\"value\":{\"type\":\"object\",\"className\":\"Object\","
523         "\"unserializableValue\":\"Float64Array\",\"description\":"
524         "\"Float64Array\",\"objectId\":\"109\"},\"writable\":true,"
525         "\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[BigInt64Array]]\",\"value\":"
526         "{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":"
527         "\"BigInt64Array\",\"description\":\"BigInt64Array\","
528         "\"objectId\":\"110\"},\"writable\":true,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":"
529         "\"[[BigUint64Array]]\",\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":"
530         "\"BigUint64Array\",\"description\":\"BigUint64Array\","
531         "\"objectId\":\"111\"},\"writable\":true,\"configurable\":true,"
532         "\"enumerable\":false,\"isOwn\":true}]}}",
533 
534         "{\"id\":13,\"result\":{\"result\":[{\"name\":\"[[PrimitiveValue]]\",\"value\":{\"type\":\"boolean\","
535         "\"unserializableValue\":\"false\",\"description\":\"false\",\"objectId\":\"112\"},\"writable\":false,"
536         "\"configurable\":false,\"enumerable\":false,\"isOwn\":false}]}}",
537 
538         "{\"id\":14,\"result\":{\"result\":[{\"name\":\"buffer\",\"value\":{\"type\":\"object\",\"subtype\":"
539         "\"arraybuffer\",\"className\":\"Arraybuffer\",\"unserializableValue\":\"Arraybuffer(24)\",\"description\":"
540         "\"Arraybuffer(24)\",\"objectId\":\"113\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,"
541         "\"isOwn\":false},{\"name\":\"byteLength\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"24\","
542         "\"description\":\"24\",\"objectId\":\"114\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,"
543         "\"isOwn\":false},{\"name\":\"byteOffset\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
544         "\"description\":\"0\",\"objectId\":\"115\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,"
545         "\"isOwn\":false}]}}",
546 
547         "{\"id\":15,\"result\":{\"result\":[{\"name\":\"length\",\"value\":{\"type\":\"number\","
548         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":false,\"configurable\":true,\"enumerable\":"
549         "false,\"isOwn\":true},{\"name\":\"name\",\"value\":{\"type\":\"string\",\"unserializableValue\":\"foo\","
550         "\"description\":\"foo\"},\"writable\":false,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},"
551         "{\"name\":\"prototype\",\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":"
552         "\"Object\",\"description\":\"Object\",\"objectId\":\"116\"},\"writable\":true,\"configurable\":false,"
553         "\"enumerable\":false,\"isOwn\":true}]}}",
554 
555         "{\"id\":16,\"result\":{\"result\":[{\"name\":\"length\",\"value\":{\"type\":\"number\","
556         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":false,\"configurable\":true,\"enumerable\":"
557         "false,\"isOwn\":true},{\"name\":\"name\",\"value\":{\"type\":\"string\",\"unserializableValue\":\"function0\","
558         "\"description\":\"function0\"},\"writable\":false,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},"
559         "{\"name\":\"prototype\",\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":"
560         "\"Object\",\"description\":\"Object\",\"objectId\":\"117\"},\"writable\":true,\"configurable\":false,"
561         "\"enumerable\":false,\"isOwn\":true}]}}",
562 
563         "{\"id\":17,\"result\":{\"result\":[{\"name\":\"[[IsGenerator]]\",\"value\":{\"type\":\"boolean\","
564         "\"unserializableValue\":\"true\",\"description\":\"true\",\"objectId\":\"118\"},\"writable\":false,"
565         "\"configurable\":false,\"enumerable\":false,\"isOwn\":false},{\"name\":\"length\",\"value\":{\"type\":"
566         "\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":false,\"configurable\":true,"
567         "\"enumerable\":false,\"isOwn\":true},{\"name\":\"name\",\"value\":{\"type\":\"string\","
568         "\"unserializableValue\":\"generator0\",\"description\":\"generator0\"},\"writable\":false,\"configurable\":"
569         "true,\"enumerable\":false,\"isOwn\":true},{\"name\":\"prototype\",\"value\":{\"type\":\"object\","
570         "\"className\":\"Object\",\"unserializableValue\":\"Object\",\"description\":\"Object\",\"objectId\":\"119\"},"
571         "\"writable\":true,\"configurable\":false,\"enumerable\":false,\"isOwn\":true}]}}",
572 
573         "{\"id\":18,\"result\":{\"result\":[{\"name\":\"length\",\"value\":{\"type\":\"number\","
574         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":false,\"configurable\":true,\"enumerable\":"
575         "false,\"isOwn\":true},{\"name\":\"name\",\"value\":{\"type\":\"string\",\"unserializableValue\":"
576         "\"[Symbol.iterator]\",\"description\":\"[Symbol.iterator]\"},\"writable\":false,\"configurable\":true,"
577         "\"enumerable\":false,\"isOwn\":true}]}}",
578 
579         "{\"id\":19,\"result\":{\"result\":[{\"name\":\"size\",\"value\":{\"type\":\"number\",\"unserializableValue\":"
580         "\"0\",\"description\":\"0\",\"objectId\":\"120\"},\"writable\":false,\"configurable\":false,\"enumerable\":"
581         "false,\"isOwn\":false},{\"name\":\"[[Entries]]\",\"value\":{\"type\":\"object\",\"subtype\":\"array\","
582         "\"className\":\"Array\",\"unserializableValue\":\"Array(0)\",\"description\":\"Array(0)\",\"objectId\":"
583         "\"121\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,\"isOwn\":false}]}}",
584 
585         "{\"id\":20,\"result\":{\"result\":[{\"name\":\"key0\",\"value\":{\"type\":\"string\",\"unserializableValue\":"
586         "\"value0\",\"description\":\"value0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":"
587         "true},{\"name\":\"key1\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"100\",\"description\":"
588         "\"100\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true}]}}",
589 
590         "{\"id\":21,\"result\":{\"result\":[{\"name\":\"global\",\"value\":{\"type\":\"boolean\","
591         "\"unserializableValue\":\"false\",\"description\":\"false\",\"objectId\":\"122\"},\"writable\":false,"
592         "\"configurable\":false,\"enumerable\":false,\"isOwn\":false},{\"name\":\"ignoreCase\",\"value\":{\"type\":"
593         "\"boolean\",\"unserializableValue\":\"true\",\"description\":\"true\",\"objectId\":\"123\"},\"writable\":"
594         "false,\"configurable\":false,\"enumerable\":false,\"isOwn\":false},{\"name\":\"multiline\",\"value\":"
595         "{\"type\":\"boolean\",\"unserializableValue\":\"false\",\"description\":\"false\",\"objectId\":\"124\"},"
596         "\"writable\":false,\"configurable\":false,\"enumerable\":false,\"isOwn\":false},{\"name\":\"dotAll\","
597         "\"value\":{\"type\":\"boolean\",\"unserializableValue\":\"false\",\"description\":\"false\",\"objectId\":"
598         "\"125\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,\"isOwn\":false},{\"name\":"
599         "\"hasIndices\",\"value\":{\"type\":\"boolean\",\"unserializableValue\":\"false\",\"description\":\"false\","
600         "\"objectId\":\"126\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,\"isOwn\":false},"
601         "{\"name\":\"unicode\",\"value\":{\"type\":\"boolean\",\"unserializableValue\":\"false\",\"description\":"
602         "\"false\",\"objectId\":\"127\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,\"isOwn\":"
603         "false},{\"name\":\"sticky\",\"value\":{\"type\":\"boolean\",\"unserializableValue\":\"false\",\"description\":"
604         "\"false\",\"objectId\":\"128\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,\"isOwn\":"
605         "false},{\"name\":\"flags\",\"value\":{\"type\":\"string\",\"unserializableValue\":\"i\",\"description\":"
606         "\"i\",\"objectId\":\"129\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,\"isOwn\":false},"
607         "{\"name\":\"source\",\"value\":{\"type\":\"string\",\"unserializableValue\":\"^\\\\d+\\\\.\\\\d+$\","
608         "\"description\":\"^\\\\d+\\\\.\\\\d+$\",\"objectId\":\"130\"},\"writable\":false,\"configurable\":false,"
609         "\"enumerable\":false,\"isOwn\":false},{\"name\":\"lastIndex\",\"value\":{\"type\":\"number\","
610         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":false,\"enumerable\":"
611         "false,\"isOwn\":true}]}}",
612 
613         "{\"id\":22,\"result\":{\"result\":[{\"name\":\"size\",\"value\":{\"type\":\"number\",\"unserializableValue\":"
614         "\"0\",\"description\":\"0\",\"objectId\":\"131\"},\"writable\":false,\"configurable\":false,\"enumerable\":"
615         "false,\"isOwn\":false},{\"name\":\"[[Entries]]\",\"value\":{\"type\":\"object\",\"subtype\":\"array\","
616         "\"className\":\"Array\",\"unserializableValue\":\"Array(0)\",\"description\":\"Array(0)\",\"objectId\":"
617         "\"132\"},\"writable\":false,\"configurable\":false,\"enumerable\":false,\"isOwn\":false}]}}",
618 
619         "{\"id\":23,\"result\":{\"result\":[{\"name\":\"[[Int8Array]]\",\"value\":{\"type\":\"object\",\"className\":"
620         "\"Object\",\"unserializableValue\":\"Int8Array(32)\",\"description\":\"Int8Array(32)\",\"objectId\":\"133\"},"
621         "\"writable\":true,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[Uint8Array]]\","
622         "\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":\"Uint8Array(32)\","
623         "\"description\":\"Uint8Array(32)\",\"objectId\":\"134\"},\"writable\":true,\"configurable\":true,"
624         "\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[Int16Array]]\",\"value\":{\"type\":\"object\","
625         "\"className\":\"Object\",\"unserializableValue\":\"Int16Array(16)\",\"description\":\"Int16Array(16)\","
626         "\"objectId\":\"135\"},\"writable\":true,\"configurable\":true,\"enumerable\":false,\"isOwn\":true},{\"name\":"
627         "\"[[Int32Array]]\",\"value\":{\"type\":\"object\",\"className\":\"Object\",\"unserializableValue\":"
628         "\"Int32Array(8)\",\"description\":\"Int32Array(8)\",\"objectId\":\"136\"},\"writable\":true,\"configurable\":"
629         "true,\"enumerable\":false,\"isOwn\":true},{\"name\":\"[[ArrayBufferByteLength]]\",\"value\":{\"type\":"
630         "\"number\",\"unserializableValue\":\"32\",\"description\":\"32\",\"objectId\":\"137\"},\"writable\":false,"
631         "\"configurable\":false,\"enumerable\":false,\"isOwn\":false},{\"name\":\"byteLength\",\"value\":{\"type\":"
632         "\"number\",\"unserializableValue\":\"32\",\"description\":\"32\",\"objectId\":\"138\"},\"writable\":false,"
633         "\"configurable\":false,\"enumerable\":false,\"isOwn\":false}]}}",
634 
635         "{\"id\":24,\"result\":{\"result\":[{\"name\":\"0\",\"value\":{\"type\":\"number\",\"unserializableValue\":"
636         "\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},"
637         "{\"name\":\"1\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},"
638         "\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"2\",\"value\":"
639         "{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":"
640         "true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"3\",\"value\":{\"type\":\"number\","
641         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
642         "true,\"isOwn\":true},{\"name\":\"4\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
643         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
644         "\"5\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
645         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"6\",\"value\":{\"type\":\"number\","
646         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
647         "true,\"isOwn\":true},{\"name\":\"7\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
648         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
649         "\"8\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
650         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"9\",\"value\":{\"type\":\"number\","
651         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
652         "true,\"isOwn\":true},{\"name\":\"10\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
653         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
654         "\"11\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
655         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"12\",\"value\":{\"type\":\"number\","
656         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
657         "true,\"isOwn\":true},{\"name\":\"13\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
658         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
659         "\"14\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
660         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"15\",\"value\":{\"type\":\"number\","
661         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
662         "true,\"isOwn\":true},{\"name\":\"16\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
663         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
664         "\"17\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
665         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"18\",\"value\":{\"type\":\"number\","
666         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
667         "true,\"isOwn\":true},{\"name\":\"19\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
668         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
669         "\"20\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
670         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"21\",\"value\":{\"type\":\"number\","
671         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
672         "true,\"isOwn\":true},{\"name\":\"22\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
673         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
674         "\"23\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
675         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true}]}}",
676 
677         "{\"id\":25,\"result\":{\"result\":[{\"name\":\"[[PrimitiveValue]]\",\"value\":{\"type\":\"boolean\","
678         "\"unserializableValue\":\"true\",\"description\":\"true\",\"objectId\":\"139\"},\"writable\":false,"
679         "\"configurable\":false,\"enumerable\":false,\"isOwn\":false}]}}",
680 
681         "{\"id\":26,\"result\":{\"result\":[{\"name\":\"0\",\"value\":{\"type\":\"number\",\"unserializableValue\":"
682         "\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},"
683         "{\"name\":\"1\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},"
684         "\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"2\",\"value\":"
685         "{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":"
686         "true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"3\",\"value\":{\"type\":\"number\","
687         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
688         "true,\"isOwn\":true},{\"name\":\"4\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
689         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
690         "\"5\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
691         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"6\",\"value\":{\"type\":\"number\","
692         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
693         "true,\"isOwn\":true},{\"name\":\"7\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
694         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
695         "\"8\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
696         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"9\",\"value\":{\"type\":\"number\","
697         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
698         "true,\"isOwn\":true},{\"name\":\"10\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
699         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
700         "\"11\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
701         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"12\",\"value\":{\"type\":\"number\","
702         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
703         "true,\"isOwn\":true},{\"name\":\"13\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
704         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},"
705         "{\"name\":\"14\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},"
706         "\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"15\",\"value\":"
707         "{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":"
708         "true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"16\",\"value\":{\"type\":\"number\","
709         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
710         "true,\"isOwn\":true},{\"name\":\"17\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
711         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
712         "\"18\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
713         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"19\",\"value\":{\"type\":\"number\","
714         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
715         "true,\"isOwn\":true},{\"name\":\"20\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
716         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":"
717         "\"21\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,"
718         "\"configurable\":true,\"enumerable\":true,\"isOwn\":true},{\"name\":\"22\",\"value\":{\"type\":\"number\","
719         "\"unserializableValue\":\"0\",\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":"
720         "true,\"isOwn\":true},{\"name\":\"23\",\"value\":{\"type\":\"number\",\"unserializableValue\":\"0\","
721         "\"description\":\"0\"},\"writable\":true,\"configurable\":true,\"enumerable\":true,\"isOwn\":true}]}}"
722     };
723 };
724 
GetJsModuleVariableTest()725 std::unique_ptr<TestActions> GetJsModuleVariableTest()
726 {
727     return std::make_unique<JsModuleVariableTest>();
728 }
729 }  // namespace panda::ecmascript::tooling::test
730 
731 #endif  // ECMASCRIPT_TOOLING_TEST_TESTCASES_JS_MODULE_VARIABLE_TEST_H
732