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
21namespace panda::ecmascript::tooling::test {
22class JsModuleVariableTest : public TestActions {
23public:
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
285private:
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
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
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
725std::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