1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "ecmascript/builtins/builtins_global.h"
17
18#include "ecmascript/js_hclass.h"
19#include "ecmascript/ecma_runtime_call_info.h"
20#include "ecmascript/ecma_vm.h"
21#include "ecmascript/global_env.h"
22#include "ecmascript/js_tagged_value-inl.h"
23#include "ecmascript/js_thread.h"
24#include "ecmascript/object_factory.h"
25#include "ecmascript/js_array.h"
26#include "ecmascript/shared_objects/js_shared_array.h"
27#include "ecmascript/tests/test_helper.h"
28
29using namespace panda::ecmascript;
30using namespace panda::ecmascript::builtins;
31using BuiltinsBase = panda::ecmascript::base::BuiltinsBase;
32
33namespace panda::test {
34class BuiltinsGlobalTest : public BaseTestWithScope<false> {
35public:
36    static JSHandle<JSObject> NewJSObject(JSThread *thread, ObjectFactory *factory, JSHandle<GlobalEnv> globalEnv)
37    {
38    JSFunction *jsFunc = globalEnv->GetObjectFunction().GetObject<JSFunction>();
39    JSHandle<JSTaggedValue> jsFunc1(thread, jsFunc);
40    JSHandle<JSObject> jsObj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(jsFunc1), jsFunc1);
41    return jsObj;
42    }
43};
44
45HWTEST_F_L0(BuiltinsGlobalTest, DecodeURIComponent)
46{
47    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
48    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
49    ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
50    ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(123));
51
52    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
53    JSTaggedValue result = BuiltinsGlobal::DecodeURIComponent(ecmaRuntimeCallInfo);
54    TestHelper::TearDownFrame(thread, prev);
55    EXPECT_TRUE(result.IsString());
56    JSHandle<EcmaString> ecmaStrHandle(thread, result);
57    EXPECT_STREQ("123", EcmaStringAccessor(ecmaStrHandle).ToCString().c_str());
58}
59
60HWTEST_F_L0(BuiltinsGlobalTest, EncodeURIComponent)
61{
62    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
63    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
64    ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
65    ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(123));
66
67    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
68    JSTaggedValue result = BuiltinsGlobal::EncodeURIComponent(ecmaRuntimeCallInfo);
69    TestHelper::TearDownFrame(thread, prev);
70    EXPECT_TRUE(result.IsString());
71    JSHandle<EcmaString> ecmaStrHandle(thread, result);
72    EXPECT_STREQ("123", EcmaStringAccessor(ecmaStrHandle).ToCString().c_str());
73}
74
75HWTEST_F_L0(BuiltinsGlobalTest, PrintEntrypointAndPrintString)
76{
77    // msg == nullptr
78    JSTaggedValue result = BuiltinsGlobal::PrintEntrypoint(nullptr);
79    EXPECT_EQ(result, JSTaggedValue::Undefined());
80}
81
82HWTEST_F_L0(BuiltinsGlobalTest, CallJsProxy)
83{
84    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
85    auto ecmaVM = thread->GetEcmaVM();
86    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
87    JSHandle<JSTaggedValue> emptyObj(thread, NewJSObject(thread, factory, env).GetTaggedValue());
88    JSHandle<JSProxy> proxy = factory->NewJSProxy(emptyObj, emptyObj);
89    proxy->SetCallable(false);
90    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
91    ecmaRuntimeCallInfo->SetFunction(proxy.GetTaggedValue());
92    ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
93
94    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
95    JSTaggedValue result = BuiltinsGlobal::CallJsProxy(ecmaRuntimeCallInfo);
96    TestHelper::TearDownFrame(thread, prev);
97    EXPECT_TRUE(thread->HasPendingException());
98    EXPECT_EQ(result, JSTaggedValue::Undefined());
99    thread->ClearException();
100}
101
102HWTEST_F_L0(BuiltinsGlobalTest, Escape)
103{
104    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
105    JSHandle<EcmaString> str1 = factory->NewFromASCII("?!=()#%&");
106    auto ecmaRuntimeCallInfo1 =
107        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); // NOLINT, 6 means 3 paras
108    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
109    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
110    ecmaRuntimeCallInfo1->SetCallArg(0, str1.GetTaggedValue());
111
112    [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
113    JSTaggedValue result1 = BuiltinsGlobal::Escape(ecmaRuntimeCallInfo1);
114    TestHelper::TearDownFrame(thread, prev1);
115    EXPECT_TRUE(result1.IsString());
116    JSHandle<EcmaString> ecmaStrHandle1(thread, result1);
117    EXPECT_STREQ("%3F%21%3D%28%29%23%25%26", EcmaStringAccessor(ecmaStrHandle1).ToCString().c_str()); // NOLINT
118
119    JSHandle<EcmaString> str2 = factory->NewFromASCII("%u%u0%u9%ua%uF%u00%u09%u0f%u0F%u000%u00a%u00F");
120    auto ecmaRuntimeCallInfo2 =
121        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); // NOLINT
122    ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
123    ecmaRuntimeCallInfo2->SetThis(JSTaggedValue::Undefined());
124    ecmaRuntimeCallInfo2->SetCallArg(0, str2.GetTaggedValue()); // NOLINT
125
126    [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
127    JSTaggedValue result2 = BuiltinsGlobal::Escape(ecmaRuntimeCallInfo2);
128    TestHelper::TearDownFrame(thread, prev2);
129    EXPECT_TRUE(result2.IsString());
130    JSHandle<EcmaString> ecmaStrHandle2(thread, result2);
131    EXPECT_STREQ("%25u%25u0%25u9%25ua%25uF%25u00%25u09%25u0f%25u0F%25u000%25u00a%25u00F", // NOLINT special value
132        EcmaStringAccessor(ecmaStrHandle2).ToCString().c_str());
133
134    JSHandle<EcmaString> str3 = factory->NewFromASCII("Hello World!");
135    std::vector<JSTaggedValue> args{str3.GetTaggedValue()};
136    auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, args, 6);
137
138    [[maybe_unused]] auto prev3 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
139    JSTaggedValue result3 = BuiltinsGlobal::Escape(ecmaRuntimeCallInfo3);
140    TestHelper::TearDownFrame(thread, prev3);
141    EXPECT_TRUE(result3.IsString());
142    JSHandle<EcmaString> ecmaStrHandle3(thread, result3);
143    EXPECT_STREQ("Hello%20World%21", EcmaStringAccessor(ecmaStrHandle3).ToCString().c_str());
144}
145
146HWTEST_F_L0(BuiltinsGlobalTest, Unescape)
147{
148    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
149    JSHandle<EcmaString> str1 = factory->NewFromASCII("");
150    auto ecmaRuntimeCallInfo1 =
151        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); // NOLINT
152    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
153    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
154    ecmaRuntimeCallInfo1->SetCallArg(0, str1.GetTaggedValue());
155
156    [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
157    JSTaggedValue result1 = BuiltinsGlobal::Unescape(ecmaRuntimeCallInfo1);
158    TestHelper::TearDownFrame(thread, prev1);
159    EXPECT_TRUE(result1.IsString());
160    JSHandle<EcmaString> ecmaStrHandle1(thread, result1);
161    EXPECT_STREQ("", EcmaStringAccessor(ecmaStrHandle1).ToCString().c_str());
162
163    JSHandle<EcmaString> str2 = factory->NewFromASCII("%u%u0%u9%ua%uF%u00%u09%u0f%u0F%u000%u00a%u00F");
164    auto ecmaRuntimeCallInfo2 =
165        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); // NOLINT
166    ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
167    ecmaRuntimeCallInfo2->SetThis(JSTaggedValue::Undefined());
168    ecmaRuntimeCallInfo2->SetCallArg(0, str2.GetTaggedValue()); // NOLINT
169
170    [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
171    JSTaggedValue result2 = BuiltinsGlobal::Unescape(ecmaRuntimeCallInfo2);
172    TestHelper::TearDownFrame(thread, prev2);
173    EXPECT_TRUE(result2.IsString());
174    JSHandle<EcmaString> ecmaStrHandle2(thread, result2);
175    EXPECT_STREQ("%u%u0%u9%ua%uF%u00%u09%u0f%u0F%u000%u00a%u00F",
176        EcmaStringAccessor(ecmaStrHandle2).ToCString().c_str());
177
178    JSHandle<EcmaString> str3 = factory->NewFromASCII("Hello%20World%21");
179    std::vector<JSTaggedValue> args{str3.GetTaggedValue()};
180    auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, args, 6);
181
182    [[maybe_unused]] auto prev3 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
183    JSTaggedValue result3 = BuiltinsGlobal::Escape(ecmaRuntimeCallInfo3);
184    TestHelper::TearDownFrame(thread, prev3);
185    EXPECT_TRUE(result3.IsString());
186    JSHandle<EcmaString> ecmaStrHandle3(thread, result3);
187    EXPECT_STREQ("Hello%2520World%2521", EcmaStringAccessor(ecmaStrHandle3).ToCString().c_str());
188}
189
190HWTEST_F_L0(BuiltinsGlobalTest, isSendable_0)
191{
192    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
193    JSHandle<EcmaString> str1 = factory->NewFromASCII("?!=()#%&");
194    auto ecmaRuntimeCallInfo1 =
195        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
196    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
197    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
198    ecmaRuntimeCallInfo1->SetCallArg(0, str1.GetTaggedValue());
199
200    [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
201    JSTaggedValue result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo1);
202    TestHelper::TearDownFrame(thread, prev1);
203    EXPECT_EQ(JSTaggedValue::True(), result);
204
205    auto ecmaRuntimeCallInfo2 =
206        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
207    ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
208    ecmaRuntimeCallInfo2->SetThis(JSTaggedValue::Undefined());
209    ecmaRuntimeCallInfo2->SetCallArg(0, JSTaggedValue(1));
210
211    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
212    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo2);
213    TestHelper::TearDownFrame(thread, prev1);
214    EXPECT_EQ(JSTaggedValue::True(), result);
215
216    auto ecmaRuntimeCallInfo3 =
217        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
218    ecmaRuntimeCallInfo3->SetFunction(JSTaggedValue::Undefined());
219    ecmaRuntimeCallInfo3->SetThis(JSTaggedValue::Undefined());
220    ecmaRuntimeCallInfo3->SetCallArg(0, JSTaggedValue(1.5));
221
222    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
223    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo3);
224    TestHelper::TearDownFrame(thread, prev1);
225    EXPECT_EQ(JSTaggedValue::True(), result);
226}
227
228HWTEST_F_L0(BuiltinsGlobalTest, isSendable_1)
229{
230    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
231
232    auto ecmaRuntimeCallInfo5 =
233        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
234    ecmaRuntimeCallInfo5->SetFunction(JSTaggedValue::Undefined());
235    ecmaRuntimeCallInfo5->SetThis(JSTaggedValue::Undefined());
236    JSFunction *jsFunc = thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction().GetObject<JSFunction>();
237    JSHandle<JSTaggedValue> jsFunc1(thread, jsFunc);
238    JSHandle<JSObject> jsObj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(jsFunc1), jsFunc1);
239    ecmaRuntimeCallInfo5->SetCallArg(0, jsObj.GetTaggedValue());
240
241    [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo5);
242    auto result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo5);
243    TestHelper::TearDownFrame(thread, prev1);
244    EXPECT_EQ(JSTaggedValue::False(), result);
245
246    auto ecmaRuntimeCallInfo6 =
247        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
248    ecmaRuntimeCallInfo6->SetFunction(JSTaggedValue::Undefined());
249    ecmaRuntimeCallInfo6->SetThis(JSTaggedValue::Undefined());
250    JSHandle<JSObject>  sharedArrayFunc(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
251    ecmaRuntimeCallInfo6->SetCallArg(0, sharedArrayFunc.GetTaggedValue());
252
253    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo6);
254    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo6);
255    TestHelper::TearDownFrame(thread, prev1);
256    EXPECT_EQ(JSTaggedValue::True(), result);
257
258    auto ecmaRuntimeCallInfo8 =
259        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
260    ecmaRuntimeCallInfo8->SetFunction(JSTaggedValue::Undefined());
261    ecmaRuntimeCallInfo8->SetThis(JSTaggedValue::Undefined());
262    JSArray *arr = JSArray::Cast(JSArray::ArrayCreate(thread, JSTaggedNumber(0)).GetTaggedValue().GetTaggedObject());
263    EXPECT_TRUE(arr != nullptr);
264    JSHandle<JSObject> arrObj(thread, arr);
265    ecmaRuntimeCallInfo8->SetCallArg(0, arrObj.GetTaggedValue());
266
267    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo8);
268    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo8);
269    TestHelper::TearDownFrame(thread, prev1);
270    EXPECT_EQ(JSTaggedValue::False(), result);
271}
272
273HWTEST_F_L0(BuiltinsGlobalTest, isSendable_2)
274{
275    auto ecmaRuntimeCallInfo4 =
276        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
277    ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
278    ecmaRuntimeCallInfo4->SetThis(JSTaggedValue::Undefined());
279    JSFunction *jsFunc = thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction().GetObject<JSFunction>();
280    JSHandle<JSTaggedValue> jsFunc1(thread, jsFunc);
281    ecmaRuntimeCallInfo4->SetCallArg(0, jsFunc1.GetTaggedValue());
282
283    [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
284    auto result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo4);
285    TestHelper::TearDownFrame(thread, prev1);
286    EXPECT_EQ(JSTaggedValue::False(), result);
287
288    auto ecmaRuntimeCallInfo7 =
289        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
290    ecmaRuntimeCallInfo7->SetFunction(JSTaggedValue::Undefined());
291    ecmaRuntimeCallInfo7->SetThis(JSTaggedValue::Undefined());
292    JSHandle<JSObject>  sharedArrayFunc(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
293    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
294    EXPECT_TRUE(arr != nullptr);
295    JSHandle<JSObject> sharedObj(thread, arr);
296    ecmaRuntimeCallInfo7->SetCallArg(0, sharedObj.GetTaggedValue());
297
298    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo7);
299    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo7);
300    TestHelper::TearDownFrame(thread, prev1);
301    EXPECT_EQ(JSTaggedValue::True(), result);
302
303    auto ecmaRuntimeCallInfo9 =
304        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
305    ecmaRuntimeCallInfo9->SetFunction(JSTaggedValue::Undefined());
306    ecmaRuntimeCallInfo9->SetThis(JSTaggedValue::Undefined());
307    ecmaRuntimeCallInfo9->SetCallArg(0, sharedObj.GetTaggedValue());
308    ecmaRuntimeCallInfo9->SetCallArg(1, sharedObj.GetTaggedValue());
309
310    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo9);
311    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo9);
312    TestHelper::TearDownFrame(thread, prev1);
313    EXPECT_EQ(JSTaggedValue::False(), result);
314}
315
316HWTEST_F_L0(BuiltinsGlobalTest, isSendable_3)
317{
318    auto ecmaRuntimeCallInfo4 =
319        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
320    ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
321    ecmaRuntimeCallInfo4->SetThis(JSTaggedValue::Undefined());
322    ecmaRuntimeCallInfo4->SetCallArg(0, JSTaggedValue::Undefined());
323
324    [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
325    auto result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo4);
326    TestHelper::TearDownFrame(thread, prev1);
327    EXPECT_EQ(JSTaggedValue::True(), result);
328
329    auto ecmaRuntimeCallInfo5 =
330        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
331    ecmaRuntimeCallInfo5->SetFunction(JSTaggedValue::Undefined());
332    ecmaRuntimeCallInfo5->SetThis(JSTaggedValue::Undefined());
333    ecmaRuntimeCallInfo5->SetCallArg(0, JSTaggedValue::True());
334
335    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo5);
336    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo5);
337    TestHelper::TearDownFrame(thread, prev1);
338    EXPECT_EQ(JSTaggedValue::True(), result);
339
340    auto ecmaRuntimeCallInfo6 =
341        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
342    ecmaRuntimeCallInfo6->SetFunction(JSTaggedValue::Undefined());
343    ecmaRuntimeCallInfo6->SetThis(JSTaggedValue::Undefined());
344    ecmaRuntimeCallInfo6->SetCallArg(0, JSTaggedValue::Exception());
345
346    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo6);
347    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo6);
348    TestHelper::TearDownFrame(thread, prev1);
349    EXPECT_EQ(JSTaggedValue::False(), result);
350
351    auto ecmaRuntimeCallInfo9 =
352        TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
353    ecmaRuntimeCallInfo9->SetFunction(JSTaggedValue::Undefined());
354    ecmaRuntimeCallInfo9->SetThis(JSTaggedValue::Undefined());
355    ecmaRuntimeCallInfo9->SetCallArg(0, JSTaggedValue::Null());
356
357    prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo9);
358    result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo9);
359    TestHelper::TearDownFrame(thread, prev1);
360    EXPECT_EQ(JSTaggedValue::True(), result);
361}
362
363}  // namespace panda::test
364