1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License. 5e509ee18Sopenharmony_ci * You may obtain a copy of the License at 6e509ee18Sopenharmony_ci * 7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e509ee18Sopenharmony_ci * 9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and 13e509ee18Sopenharmony_ci * limitations under the License. 14e509ee18Sopenharmony_ci */ 15e509ee18Sopenharmony_ci 16e509ee18Sopenharmony_ci#ifndef ECMASCRIPT_TOOLING_TEST_TESTCASES_JS_CLOSURE_SCOPE_TEST_H 17e509ee18Sopenharmony_ci#define ECMASCRIPT_TOOLING_TEST_TESTCASES_JS_CLOSURE_SCOPE_TEST_H 18e509ee18Sopenharmony_ci 19e509ee18Sopenharmony_ci#include <map> 20e509ee18Sopenharmony_ci#include "tooling/test/client_utils/test_util.h" 21e509ee18Sopenharmony_ci 22e509ee18Sopenharmony_cinamespace panda::ecmascript::tooling::test { 23e509ee18Sopenharmony_ciclass JsClosureScopeTest : public TestActions { 24e509ee18Sopenharmony_cipublic: 25e509ee18Sopenharmony_ci JsClosureScopeTest() 26e509ee18Sopenharmony_ci { 27e509ee18Sopenharmony_ci testAction = { 28e509ee18Sopenharmony_ci {SocketAction::SEND, "enable"}, 29e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess}, 30e509ee18Sopenharmony_ci {SocketAction::SEND, "runtime-enable"}, 31e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess}, 32e509ee18Sopenharmony_ci {SocketAction::SEND, "run"}, 33e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess}, 34e509ee18Sopenharmony_ci // load closure_scope.js 35e509ee18Sopenharmony_ci {SocketAction::RECV, "Debugger.scriptParsed", ActionRule::STRING_CONTAIN}, 36e509ee18Sopenharmony_ci // break on start 37e509ee18Sopenharmony_ci {SocketAction::RECV, "Debugger.paused", ActionRule::STRING_CONTAIN}, 38e509ee18Sopenharmony_ci // set first breakpoint 39e509ee18Sopenharmony_ci {SocketAction::SEND, "b " DEBUGGER_JS_DIR "closure_scope.js 30"}, 40e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess}, 41e509ee18Sopenharmony_ci // // set second breakpoint 42e509ee18Sopenharmony_ci {SocketAction::SEND, "b " DEBUGGER_JS_DIR "closure_scope.js 53"}, 43e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess}, 44e509ee18Sopenharmony_ci 45e509ee18Sopenharmony_ci // hit breakpoint after resume first time 46e509ee18Sopenharmony_ci {SocketAction::SEND, "resume"}, 47e509ee18Sopenharmony_ci {SocketAction::RECV, "Debugger.resumed", ActionRule::STRING_CONTAIN}, 48e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess}, 49e509ee18Sopenharmony_ci {SocketAction::RECV, "Debugger.paused", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 50e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 51e509ee18Sopenharmony_ci Result ret; 52e509ee18Sopenharmony_ci std::string method; 53e509ee18Sopenharmony_ci ret = json->GetString("method", &method); 54e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || method != "Debugger.paused") { 55e509ee18Sopenharmony_ci return false; 56e509ee18Sopenharmony_ci } 57e509ee18Sopenharmony_ci 58e509ee18Sopenharmony_ci DebuggerClient debuggerClient(0); 59e509ee18Sopenharmony_ci debuggerClient.PausedReply(std::move(json)); 60e509ee18Sopenharmony_ci return true; 61e509ee18Sopenharmony_ci }}, 62e509ee18Sopenharmony_ci {SocketAction::SEND, "print"}, 63e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 64e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 65e509ee18Sopenharmony_ci int32_t id = 0; 66e509ee18Sopenharmony_ci Result ret = json->GetInt("id", &id); 67e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 68e509ee18Sopenharmony_ci return false; 69e509ee18Sopenharmony_ci } 70e509ee18Sopenharmony_ci RuntimeClient runtimeClient(0); 71e509ee18Sopenharmony_ci runtimeClient.HandleGetProperties(std::move(json), id); 72e509ee18Sopenharmony_ci return true; 73e509ee18Sopenharmony_ci }}, 74e509ee18Sopenharmony_ci {SocketAction::SEND, "print 2"}, 75e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 76e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 77e509ee18Sopenharmony_ci Result ret; 78e509ee18Sopenharmony_ci int32_t id = 0; 79e509ee18Sopenharmony_ci ret = json->GetInt("id", &id); 80e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 81e509ee18Sopenharmony_ci return false; 82e509ee18Sopenharmony_ci } 83e509ee18Sopenharmony_ci 84e509ee18Sopenharmony_ci std::unique_ptr<PtJson> result = nullptr; 85e509ee18Sopenharmony_ci ret = json->GetObject("result", &result); 86e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 87e509ee18Sopenharmony_ci return false; 88e509ee18Sopenharmony_ci } 89e509ee18Sopenharmony_ci 90e509ee18Sopenharmony_ci std::unique_ptr<PtJson> innerResult; 91e509ee18Sopenharmony_ci ret = result->GetArray("result", &innerResult); 92e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 93e509ee18Sopenharmony_ci return false; 94e509ee18Sopenharmony_ci } 95e509ee18Sopenharmony_ci 96e509ee18Sopenharmony_ci std::string name; 97e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetString("name", &name); 98e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || name != "v3") { 99e509ee18Sopenharmony_ci return false; 100e509ee18Sopenharmony_ci } 101e509ee18Sopenharmony_ci 102e509ee18Sopenharmony_ci std::unique_ptr<PtJson> value; 103e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetObject("value", &value); 104e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 105e509ee18Sopenharmony_ci return false; 106e509ee18Sopenharmony_ci } 107e509ee18Sopenharmony_ci 108e509ee18Sopenharmony_ci std::string valueDes; 109e509ee18Sopenharmony_ci ret = value->GetString("description", &valueDes); 110e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || valueDes != "4") { 111e509ee18Sopenharmony_ci return false; 112e509ee18Sopenharmony_ci } 113e509ee18Sopenharmony_ci return true; 114e509ee18Sopenharmony_ci }}, 115e509ee18Sopenharmony_ci {SocketAction::SEND, "print 3"}, 116e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 117e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 118e509ee18Sopenharmony_ci Result ret; 119e509ee18Sopenharmony_ci int32_t id = 0; 120e509ee18Sopenharmony_ci ret = json->GetInt("id", &id); 121e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 122e509ee18Sopenharmony_ci return false; 123e509ee18Sopenharmony_ci } 124e509ee18Sopenharmony_ci 125e509ee18Sopenharmony_ci std::unique_ptr<PtJson> result = nullptr; 126e509ee18Sopenharmony_ci ret = json->GetObject("result", &result); 127e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 128e509ee18Sopenharmony_ci return false; 129e509ee18Sopenharmony_ci } 130e509ee18Sopenharmony_ci 131e509ee18Sopenharmony_ci std::unique_ptr<PtJson> innerResult; 132e509ee18Sopenharmony_ci ret = result->GetArray("result", &innerResult); 133e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 134e509ee18Sopenharmony_ci return false; 135e509ee18Sopenharmony_ci } 136e509ee18Sopenharmony_ci 137e509ee18Sopenharmony_ci std::string name; 138e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetString("name", &name); 139e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || name != "v2_2") { 140e509ee18Sopenharmony_ci return false; 141e509ee18Sopenharmony_ci } 142e509ee18Sopenharmony_ci 143e509ee18Sopenharmony_ci std::unique_ptr<PtJson> value; 144e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetObject("value", &value); 145e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 146e509ee18Sopenharmony_ci return false; 147e509ee18Sopenharmony_ci } 148e509ee18Sopenharmony_ci 149e509ee18Sopenharmony_ci std::string valueDes; 150e509ee18Sopenharmony_ci ret = value->GetString("description", &valueDes); 151e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || valueDes != "3") { 152e509ee18Sopenharmony_ci return false; 153e509ee18Sopenharmony_ci } 154e509ee18Sopenharmony_ci 155e509ee18Sopenharmony_ci ret = innerResult->Get(1)->GetString("name", &name); 156e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || name != "v2_1") { 157e509ee18Sopenharmony_ci return false; 158e509ee18Sopenharmony_ci } 159e509ee18Sopenharmony_ci 160e509ee18Sopenharmony_ci ret = innerResult->Get(1)->GetObject("value", &value); 161e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 162e509ee18Sopenharmony_ci return false; 163e509ee18Sopenharmony_ci } 164e509ee18Sopenharmony_ci 165e509ee18Sopenharmony_ci ret = value->GetString("description", &valueDes); 166e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || valueDes != "2") { 167e509ee18Sopenharmony_ci return false; 168e509ee18Sopenharmony_ci } 169e509ee18Sopenharmony_ci return true; 170e509ee18Sopenharmony_ci }}, 171e509ee18Sopenharmony_ci {SocketAction::SEND, "print 4"}, 172e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 173e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 174e509ee18Sopenharmony_ci Result ret; 175e509ee18Sopenharmony_ci int32_t id = 0; 176e509ee18Sopenharmony_ci ret = json->GetInt("id", &id); 177e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 178e509ee18Sopenharmony_ci return false; 179e509ee18Sopenharmony_ci } 180e509ee18Sopenharmony_ci 181e509ee18Sopenharmony_ci std::unique_ptr<PtJson> result = nullptr; 182e509ee18Sopenharmony_ci ret = json->GetObject("result", &result); 183e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 184e509ee18Sopenharmony_ci return false; 185e509ee18Sopenharmony_ci } 186e509ee18Sopenharmony_ci 187e509ee18Sopenharmony_ci std::unique_ptr<PtJson> innerResult; 188e509ee18Sopenharmony_ci ret = result->GetArray("result", &innerResult); 189e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 190e509ee18Sopenharmony_ci return false; 191e509ee18Sopenharmony_ci } 192e509ee18Sopenharmony_ci 193e509ee18Sopenharmony_ci std::string name; 194e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetString("name", &name); 195e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || name != "v1") { 196e509ee18Sopenharmony_ci return false; 197e509ee18Sopenharmony_ci } 198e509ee18Sopenharmony_ci 199e509ee18Sopenharmony_ci std::unique_ptr<PtJson> value; 200e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetObject("value", &value); 201e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 202e509ee18Sopenharmony_ci return false; 203e509ee18Sopenharmony_ci } 204e509ee18Sopenharmony_ci 205e509ee18Sopenharmony_ci std::string valueDes; 206e509ee18Sopenharmony_ci ret = value->GetString("description", &valueDes); 207e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || valueDes != "1") { 208e509ee18Sopenharmony_ci return false; 209e509ee18Sopenharmony_ci } 210e509ee18Sopenharmony_ci return true; 211e509ee18Sopenharmony_ci }}, 212e509ee18Sopenharmony_ci 213e509ee18Sopenharmony_ci // hit breakpoint after resume second time 214e509ee18Sopenharmony_ci {SocketAction::SEND, "resume"}, 215e509ee18Sopenharmony_ci {SocketAction::RECV, "Debugger.resumed", ActionRule::STRING_CONTAIN}, 216e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess}, 217e509ee18Sopenharmony_ci {SocketAction::RECV, "Debugger.paused", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 218e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 219e509ee18Sopenharmony_ci Result ret; 220e509ee18Sopenharmony_ci std::string method; 221e509ee18Sopenharmony_ci ret = json->GetString("method", &method); 222e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || method != "Debugger.paused") { 223e509ee18Sopenharmony_ci return false; 224e509ee18Sopenharmony_ci } 225e509ee18Sopenharmony_ci DebuggerClient debuggerClient(0); 226e509ee18Sopenharmony_ci debuggerClient.PausedReply(std::move(json)); 227e509ee18Sopenharmony_ci return true; 228e509ee18Sopenharmony_ci }}, 229e509ee18Sopenharmony_ci {SocketAction::SEND, "print"}, 230e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 231e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 232e509ee18Sopenharmony_ci int32_t id = 0; 233e509ee18Sopenharmony_ci Result ret = json->GetInt("id", &id); 234e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 235e509ee18Sopenharmony_ci return false; 236e509ee18Sopenharmony_ci } 237e509ee18Sopenharmony_ci RuntimeClient runtimeClient(0); 238e509ee18Sopenharmony_ci runtimeClient.HandleGetProperties(std::move(json), id); 239e509ee18Sopenharmony_ci return true; 240e509ee18Sopenharmony_ci }}, 241e509ee18Sopenharmony_ci {SocketAction::SEND, "print 2"}, 242e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 243e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 244e509ee18Sopenharmony_ci Result ret; 245e509ee18Sopenharmony_ci int32_t id = 0; 246e509ee18Sopenharmony_ci ret = json->GetInt("id", &id); 247e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 248e509ee18Sopenharmony_ci return false; 249e509ee18Sopenharmony_ci } 250e509ee18Sopenharmony_ci 251e509ee18Sopenharmony_ci std::unique_ptr<PtJson> result = nullptr; 252e509ee18Sopenharmony_ci ret = json->GetObject("result", &result); 253e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 254e509ee18Sopenharmony_ci return false; 255e509ee18Sopenharmony_ci } 256e509ee18Sopenharmony_ci 257e509ee18Sopenharmony_ci std::unique_ptr<PtJson> innerResult; 258e509ee18Sopenharmony_ci ret = result->GetArray("result", &innerResult); 259e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 260e509ee18Sopenharmony_ci return false; 261e509ee18Sopenharmony_ci } 262e509ee18Sopenharmony_ci 263e509ee18Sopenharmony_ci std::string name; 264e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetString("name", &name); 265e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || name != "i") { 266e509ee18Sopenharmony_ci return false; 267e509ee18Sopenharmony_ci } 268e509ee18Sopenharmony_ci 269e509ee18Sopenharmony_ci std::unique_ptr<PtJson> value; 270e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetObject("value", &value); 271e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 272e509ee18Sopenharmony_ci return false; 273e509ee18Sopenharmony_ci } 274e509ee18Sopenharmony_ci 275e509ee18Sopenharmony_ci std::string valueDes; 276e509ee18Sopenharmony_ci ret = value->GetString("description", &valueDes); 277e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || valueDes != "5") { 278e509ee18Sopenharmony_ci return false; 279e509ee18Sopenharmony_ci } 280e509ee18Sopenharmony_ci return true; 281e509ee18Sopenharmony_ci }}, 282e509ee18Sopenharmony_ci {SocketAction::SEND, "print 3"}, 283e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, [] (auto recv, auto, auto) -> bool { 284e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = PtJson::Parse(recv); 285e509ee18Sopenharmony_ci Result ret; 286e509ee18Sopenharmony_ci int32_t id = 0; 287e509ee18Sopenharmony_ci ret = json->GetInt("id", &id); 288e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 289e509ee18Sopenharmony_ci return false; 290e509ee18Sopenharmony_ci } 291e509ee18Sopenharmony_ci 292e509ee18Sopenharmony_ci std::unique_ptr<PtJson> result = nullptr; 293e509ee18Sopenharmony_ci ret = json->GetObject("result", &result); 294e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 295e509ee18Sopenharmony_ci return false; 296e509ee18Sopenharmony_ci } 297e509ee18Sopenharmony_ci 298e509ee18Sopenharmony_ci std::unique_ptr<PtJson> innerResult; 299e509ee18Sopenharmony_ci ret = result->GetArray("result", &innerResult); 300e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 301e509ee18Sopenharmony_ci return false; 302e509ee18Sopenharmony_ci } 303e509ee18Sopenharmony_ci 304e509ee18Sopenharmony_ci std::string name; 305e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetString("name", &name); 306e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || name != "a") { 307e509ee18Sopenharmony_ci return false; 308e509ee18Sopenharmony_ci } 309e509ee18Sopenharmony_ci 310e509ee18Sopenharmony_ci std::unique_ptr<PtJson> value; 311e509ee18Sopenharmony_ci ret = innerResult->Get(0)->GetObject("value", &value); 312e509ee18Sopenharmony_ci if (ret != Result::SUCCESS) { 313e509ee18Sopenharmony_ci return false; 314e509ee18Sopenharmony_ci } 315e509ee18Sopenharmony_ci 316e509ee18Sopenharmony_ci std::string valueDes; 317e509ee18Sopenharmony_ci ret = value->GetString("description", &valueDes); 318e509ee18Sopenharmony_ci if (ret != Result::SUCCESS || valueDes != "10") { 319e509ee18Sopenharmony_ci return false; 320e509ee18Sopenharmony_ci } 321e509ee18Sopenharmony_ci return true; 322e509ee18Sopenharmony_ci }}, 323e509ee18Sopenharmony_ci // reply success and run 324e509ee18Sopenharmony_ci {SocketAction::SEND, "success"}, 325e509ee18Sopenharmony_ci {SocketAction::SEND, "resume"}, 326e509ee18Sopenharmony_ci {SocketAction::RECV, "Debugger.resumed", ActionRule::STRING_CONTAIN}, 327e509ee18Sopenharmony_ci {SocketAction::RECV, "", ActionRule::CUSTOM_RULE, MatchRule::replySuccess}, 328e509ee18Sopenharmony_ci }; 329e509ee18Sopenharmony_ci } 330e509ee18Sopenharmony_ci 331e509ee18Sopenharmony_ci std::pair<std::string, std::string> GetEntryPoint() override 332e509ee18Sopenharmony_ci { 333e509ee18Sopenharmony_ci return {pandaFile_, entryPoint_}; 334e509ee18Sopenharmony_ci } 335e509ee18Sopenharmony_ci ~JsClosureScopeTest() = default; 336e509ee18Sopenharmony_ci 337e509ee18Sopenharmony_ciprivate: 338e509ee18Sopenharmony_ci std::string pandaFile_ = DEBUGGER_ABC_DIR "closure_scope.abc"; 339e509ee18Sopenharmony_ci std::string sourceFile_ = DEBUGGER_JS_DIR "closure_scope.js"; 340e509ee18Sopenharmony_ci std::string entryPoint_ = "_GLOBAL::func_main_0"; 341e509ee18Sopenharmony_ci}; 342e509ee18Sopenharmony_ci 343e509ee18Sopenharmony_cistd::unique_ptr<TestActions> GetJsClosureScopeTest() 344e509ee18Sopenharmony_ci{ 345e509ee18Sopenharmony_ci return std::make_unique<JsClosureScopeTest>(); 346e509ee18Sopenharmony_ci} 347e509ee18Sopenharmony_ci} // namespace panda::ecmascript::tooling::test 348e509ee18Sopenharmony_ci 349e509ee18Sopenharmony_ci#endif // ECMASCRIPT_TOOLING_TEST_TESTCASES_JS_CLOSURE_SCOPE_TEST_H 350