14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_shared_array.h"
174514f5e3Sopenharmony_ci
184514f5e3Sopenharmony_ci#include "ecmascript/ecma_string.h"
194514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h"
204514f5e3Sopenharmony_ci#include "ecmascript/global_env.h"
214514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_array.h"
224514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_array_iterator.h"
234514f5e3Sopenharmony_ci#include "ecmascript/js_array_iterator.h"
244514f5e3Sopenharmony_ci
254514f5e3Sopenharmony_ci#include "ecmascript/js_handle.h"
264514f5e3Sopenharmony_ci#include "ecmascript/js_hclass.h"
274514f5e3Sopenharmony_ci#include "ecmascript/js_object-inl.h"
284514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value-inl.h"
294514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h"
304514f5e3Sopenharmony_ci#include "ecmascript/js_thread.h"
314514f5e3Sopenharmony_ci
324514f5e3Sopenharmony_ci#include "ecmascript/object_factory.h"
334514f5e3Sopenharmony_ci#include "ecmascript/object_operator.h"
344514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h"
354514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_object.h"
364514f5e3Sopenharmony_ci#include "ecmascript/js_array.h"
374514f5e3Sopenharmony_ci
384514f5e3Sopenharmony_ciusing namespace panda::ecmascript;
394514f5e3Sopenharmony_ciusing namespace panda::ecmascript::builtins;
404514f5e3Sopenharmony_ciusing namespace panda::ecmascript::base;
414514f5e3Sopenharmony_ci
424514f5e3Sopenharmony_cienum class ArrayIndex {
434514f5e3Sopenharmony_ci    ARRAY_INDEX_0,
444514f5e3Sopenharmony_ci    ARRAY_INDEX_1,
454514f5e3Sopenharmony_ci    ARRAY_INDEX_2,
464514f5e3Sopenharmony_ci    ARRAY_INDEX_3
474514f5e3Sopenharmony_ci};
484514f5e3Sopenharmony_ci
494514f5e3Sopenharmony_cinamespace panda::test {
504514f5e3Sopenharmony_ciusing Array = ecmascript::builtins::BuiltinsSharedArray;
514514f5e3Sopenharmony_ciclass BuiltinsSharedArrayTest : public BaseTestWithScope<false> {
524514f5e3Sopenharmony_cipublic:
534514f5e3Sopenharmony_ci    class TestClass : public base::BuiltinsBase {
544514f5e3Sopenharmony_ci    public:
554514f5e3Sopenharmony_ci        static JSTaggedValue TestForEachFunc(EcmaRuntimeCallInfo *argv)
564514f5e3Sopenharmony_ci        {
574514f5e3Sopenharmony_ci            JSHandle<JSTaggedValue> key = GetCallArg(argv, 0);
584514f5e3Sopenharmony_ci            if (key->IsUndefined()) {
594514f5e3Sopenharmony_ci                return JSTaggedValue::Undefined();
604514f5e3Sopenharmony_ci            }
614514f5e3Sopenharmony_ci            JSSharedArray *JSSharedArray = JSSharedArray::Cast(GetThis(argv)->GetTaggedObject());
624514f5e3Sopenharmony_ci            uint32_t length = JSSharedArray->GetArrayLength() + 1U;
634514f5e3Sopenharmony_ci            JSSharedArray->SetArrayLength(argv->GetThread(), length);
644514f5e3Sopenharmony_ci            return JSTaggedValue::Undefined();
654514f5e3Sopenharmony_ci        }
664514f5e3Sopenharmony_ci
674514f5e3Sopenharmony_ci        static JSTaggedValue TestEveryFunc(EcmaRuntimeCallInfo *argv)
684514f5e3Sopenharmony_ci        {
694514f5e3Sopenharmony_ci            uint32_t argc = argv->GetArgsNumber();
704514f5e3Sopenharmony_ci            if (argc > 0) {
714514f5e3Sopenharmony_ci                if (GetCallArg(argv, 0)->GetInt() > 10) { // 10 : test case
724514f5e3Sopenharmony_ci                    return GetTaggedBoolean(true);
734514f5e3Sopenharmony_ci                }
744514f5e3Sopenharmony_ci            }
754514f5e3Sopenharmony_ci            return GetTaggedBoolean(false);
764514f5e3Sopenharmony_ci        }
774514f5e3Sopenharmony_ci
784514f5e3Sopenharmony_ci        static JSTaggedValue TestMapFunc(EcmaRuntimeCallInfo *argv)
794514f5e3Sopenharmony_ci        {
804514f5e3Sopenharmony_ci            int accumulator = GetCallArg(argv, 0)->GetInt();
814514f5e3Sopenharmony_ci            accumulator = accumulator * 2; // 2 : mapped to 2 times the original value
824514f5e3Sopenharmony_ci            return BuiltinsBase::GetTaggedInt(accumulator);
834514f5e3Sopenharmony_ci        }
844514f5e3Sopenharmony_ci
854514f5e3Sopenharmony_ci        static JSTaggedValue TestFlatMapFunc(EcmaRuntimeCallInfo *argv)
864514f5e3Sopenharmony_ci        {
874514f5e3Sopenharmony_ci            int accumulator = GetCallArg(argv, 0)->GetInt();
884514f5e3Sopenharmony_ci            accumulator = accumulator * 2; // 2 : mapped to 2 times the original value
894514f5e3Sopenharmony_ci
904514f5e3Sopenharmony_ci            JSThread *thread = argv->GetThread();
914514f5e3Sopenharmony_ci            JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
924514f5e3Sopenharmony_ci            JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
934514f5e3Sopenharmony_ci                .GetTaggedValue().GetTaggedObject());
944514f5e3Sopenharmony_ci            EXPECT_TRUE(arr != nullptr);
954514f5e3Sopenharmony_ci            JSHandle<JSObject> obj(thread, arr);
964514f5e3Sopenharmony_ci            auto property = JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle,
974514f5e3Sopenharmony_ci                                                       SCheckMode::SKIP);
984514f5e3Sopenharmony_ci            EXPECT_EQ(property.GetValue()->GetInt(), 0);
994514f5e3Sopenharmony_ci
1004514f5e3Sopenharmony_ci            JSHandle<JSTaggedValue> key(thread, JSTaggedValue(0));
1014514f5e3Sopenharmony_ci            PropertyDescriptor desc(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(accumulator)),
1024514f5e3Sopenharmony_ci                                                                    true, true, true);
1034514f5e3Sopenharmony_ci            JSSharedArray::DefineOwnProperty(thread, obj, key, desc, SCheckMode::SKIP);
1044514f5e3Sopenharmony_ci            return obj.GetTaggedValue();
1054514f5e3Sopenharmony_ci        }
1064514f5e3Sopenharmony_ci
1074514f5e3Sopenharmony_ci        static JSTaggedValue TestFindFunc(EcmaRuntimeCallInfo *argv)
1084514f5e3Sopenharmony_ci        {
1094514f5e3Sopenharmony_ci            uint32_t argc = argv->GetArgsNumber();
1104514f5e3Sopenharmony_ci            if (argc > 0) {
1114514f5e3Sopenharmony_ci                // 10 : test case
1124514f5e3Sopenharmony_ci                if (GetCallArg(argv, 0)->GetInt() > 10) {
1134514f5e3Sopenharmony_ci                    return GetTaggedBoolean(true);
1144514f5e3Sopenharmony_ci                }
1154514f5e3Sopenharmony_ci            }
1164514f5e3Sopenharmony_ci            return GetTaggedBoolean(false);
1174514f5e3Sopenharmony_ci        }
1184514f5e3Sopenharmony_ci
1194514f5e3Sopenharmony_ci        static JSTaggedValue TestFindIndexFunc(EcmaRuntimeCallInfo *argv)
1204514f5e3Sopenharmony_ci        {
1214514f5e3Sopenharmony_ci            uint32_t argc = argv->GetArgsNumber();
1224514f5e3Sopenharmony_ci            if (argc > 0) {
1234514f5e3Sopenharmony_ci                // 10 : test case
1244514f5e3Sopenharmony_ci                if (GetCallArg(argv, 0)->GetInt() > 10) {
1254514f5e3Sopenharmony_ci                    return GetTaggedBoolean(true);
1264514f5e3Sopenharmony_ci                }
1274514f5e3Sopenharmony_ci            }
1284514f5e3Sopenharmony_ci            return GetTaggedBoolean(false);
1294514f5e3Sopenharmony_ci        }
1304514f5e3Sopenharmony_ci
1314514f5e3Sopenharmony_ci        static JSTaggedValue TestFindLastFunc(EcmaRuntimeCallInfo *argv)
1324514f5e3Sopenharmony_ci        {
1334514f5e3Sopenharmony_ci            uint32_t argc = argv->GetArgsNumber();
1344514f5e3Sopenharmony_ci            if (argc > 0) {
1354514f5e3Sopenharmony_ci                // 20 : test case
1364514f5e3Sopenharmony_ci                if (GetCallArg(argv, 0)->GetInt() > 20) {
1374514f5e3Sopenharmony_ci                    return GetTaggedBoolean(true);
1384514f5e3Sopenharmony_ci                }
1394514f5e3Sopenharmony_ci            }
1404514f5e3Sopenharmony_ci            return GetTaggedBoolean(false);
1414514f5e3Sopenharmony_ci        }
1424514f5e3Sopenharmony_ci
1434514f5e3Sopenharmony_ci        static JSTaggedValue TestFindLastIndexFunc(EcmaRuntimeCallInfo *argv)
1444514f5e3Sopenharmony_ci        {
1454514f5e3Sopenharmony_ci            uint32_t argc = argv->GetArgsNumber();
1464514f5e3Sopenharmony_ci            if (argc > 0) {
1474514f5e3Sopenharmony_ci                // 20 : test case
1484514f5e3Sopenharmony_ci                if (GetCallArg(argv, 0)->GetInt() > 20) {
1494514f5e3Sopenharmony_ci                    return GetTaggedBoolean(true);
1504514f5e3Sopenharmony_ci                }
1514514f5e3Sopenharmony_ci            }
1524514f5e3Sopenharmony_ci            return GetTaggedBoolean(false);
1534514f5e3Sopenharmony_ci        }
1544514f5e3Sopenharmony_ci
1554514f5e3Sopenharmony_ci        static JSTaggedValue TestReduceFunc(EcmaRuntimeCallInfo *argv)
1564514f5e3Sopenharmony_ci        {
1574514f5e3Sopenharmony_ci            int accumulator = GetCallArg(argv, 0)->GetInt();
1584514f5e3Sopenharmony_ci            accumulator = accumulator + GetCallArg(argv, 1)->GetInt();
1594514f5e3Sopenharmony_ci            return BuiltinsBase::GetTaggedInt(accumulator);
1604514f5e3Sopenharmony_ci        }
1614514f5e3Sopenharmony_ci
1624514f5e3Sopenharmony_ci        static JSTaggedValue TestReduceRightFunc(EcmaRuntimeCallInfo *argv)
1634514f5e3Sopenharmony_ci        {
1644514f5e3Sopenharmony_ci            int accumulator = GetCallArg(argv, 0)->GetInt();
1654514f5e3Sopenharmony_ci            accumulator = accumulator + GetCallArg(argv, 1)->GetInt();
1664514f5e3Sopenharmony_ci            return BuiltinsBase::GetTaggedInt(accumulator);
1674514f5e3Sopenharmony_ci        }
1684514f5e3Sopenharmony_ci
1694514f5e3Sopenharmony_ci        static JSTaggedValue TestSomeFunc(EcmaRuntimeCallInfo *argv)
1704514f5e3Sopenharmony_ci        {
1714514f5e3Sopenharmony_ci            uint32_t argc = argv->GetArgsNumber();
1724514f5e3Sopenharmony_ci            if (argc > 0) {
1734514f5e3Sopenharmony_ci                if (GetCallArg(argv, 0)->GetInt() > 10) { // 10 : test case
1744514f5e3Sopenharmony_ci                    return GetTaggedBoolean(true);
1754514f5e3Sopenharmony_ci                }
1764514f5e3Sopenharmony_ci            }
1774514f5e3Sopenharmony_ci            return GetTaggedBoolean(false);
1784514f5e3Sopenharmony_ci        }
1794514f5e3Sopenharmony_ci
1804514f5e3Sopenharmony_ci        static JSTaggedValue TestToSortedFunc(EcmaRuntimeCallInfo *argv)
1814514f5e3Sopenharmony_ci        {
1824514f5e3Sopenharmony_ci            uint32_t argc = argv->GetArgsNumber();
1834514f5e3Sopenharmony_ci            if (argc > 1) {
1844514f5e3Sopenharmony_ci                // x < y
1854514f5e3Sopenharmony_ci                if (GetCallArg(argv, 0)->GetInt() > GetCallArg(argv, 1)->GetInt()) {
1864514f5e3Sopenharmony_ci                    return GetTaggedBoolean(true);
1874514f5e3Sopenharmony_ci                }
1884514f5e3Sopenharmony_ci            }
1894514f5e3Sopenharmony_ci            return GetTaggedBoolean(false);
1904514f5e3Sopenharmony_ci        }
1914514f5e3Sopenharmony_ci    };
1924514f5e3Sopenharmony_ci};
1934514f5e3Sopenharmony_ci
1944514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, ArrayConstructor)
1954514f5e3Sopenharmony_ci{
1964514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
1974514f5e3Sopenharmony_ci    JSHandle<JSObject> globalObject(thread, thread->GetEcmaVM()->GetGlobalEnv()->GetGlobalObject());
1984514f5e3Sopenharmony_ci
1994514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 10);
2004514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetFunction(array.GetTaggedValue());
2014514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue());
2024514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1)));
2034514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(3)));
2044514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetCallArg(2, JSTaggedValue(static_cast<int32_t>(5)));
2054514f5e3Sopenharmony_ci
2064514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
2074514f5e3Sopenharmony_ci    JSTaggedValue result = Array::ArrayConstructor(ecmaRuntimeCallInfo);
2084514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
2094514f5e3Sopenharmony_ci    JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
2104514f5e3Sopenharmony_ci    ASSERT_TRUE(value.IsECMAObject());
2114514f5e3Sopenharmony_ci    PropertyDescriptor descRes(thread);
2124514f5e3Sopenharmony_ci    JSHandle<JSObject> valueHandle(thread, value);
2134514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key0(thread, JSTaggedValue(0));
2144514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key1(thread, JSTaggedValue(1));
2154514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key2(thread, JSTaggedValue(2));
2164514f5e3Sopenharmony_ci    JSObject::GetOwnProperty(thread, valueHandle, key0, descRes);
2174514f5e3Sopenharmony_ci    ASSERT_EQ(descRes.GetValue().GetTaggedValue(), JSTaggedValue(1));
2184514f5e3Sopenharmony_ci    JSObject::GetOwnProperty(thread, valueHandle, key1, descRes);
2194514f5e3Sopenharmony_ci    ASSERT_EQ(descRes.GetValue().GetTaggedValue(), JSTaggedValue(3));
2204514f5e3Sopenharmony_ci    JSObject::GetOwnProperty(thread, valueHandle, key2, descRes);
2214514f5e3Sopenharmony_ci    ASSERT_EQ(descRes.GetValue().GetTaggedValue(), JSTaggedValue(5));
2224514f5e3Sopenharmony_ci}
2234514f5e3Sopenharmony_ci
2244514f5e3Sopenharmony_cistd::vector<JSHandle<JSTaggedValue>> SharedArrayDefineOwnPropertyTest(JSThread* thread, JSHandle<JSObject>& obj,
2254514f5e3Sopenharmony_ci    std::vector<int>& vals)
2264514f5e3Sopenharmony_ci{
2274514f5e3Sopenharmony_ci    std::vector<JSHandle<JSTaggedValue>> keys;
2284514f5e3Sopenharmony_ci    for (size_t i = 0; i < vals.size(); i++) {
2294514f5e3Sopenharmony_ci        keys.push_back(JSHandle<JSTaggedValue>(thread, JSTaggedValue(static_cast<int>(i))));
2304514f5e3Sopenharmony_ci        PropertyDescriptor desc0(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(vals[i])), true, true, true);
2314514f5e3Sopenharmony_ci        JSArray::DefineOwnProperty(thread, obj, keys[i], desc0);
2324514f5e3Sopenharmony_ci    }
2334514f5e3Sopenharmony_ci    return keys;
2344514f5e3Sopenharmony_ci}
2354514f5e3Sopenharmony_ci
2364514f5e3Sopenharmony_cistd::vector<JSHandle<JSTaggedValue>> SharedArrayDefineOwnPropertyTest(JSThread* thread, JSHandle<JSTaggedValue>& obj,
2374514f5e3Sopenharmony_ci    std::vector<int>& vals)
2384514f5e3Sopenharmony_ci{
2394514f5e3Sopenharmony_ci    JSHandle<JSObject> jsObj(obj);
2404514f5e3Sopenharmony_ci    std::vector<JSHandle<JSTaggedValue>> keys;
2414514f5e3Sopenharmony_ci    for (size_t i = 0; i < vals.size(); i++) {
2424514f5e3Sopenharmony_ci        keys.push_back(JSHandle<JSTaggedValue>(thread, JSTaggedValue(static_cast<int>(i))));
2434514f5e3Sopenharmony_ci        PropertyDescriptor desc0(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(vals[i])), true, true, true);
2444514f5e3Sopenharmony_ci        JSArray::DefineOwnProperty(thread, jsObj, keys[i], desc0);
2454514f5e3Sopenharmony_ci    }
2464514f5e3Sopenharmony_ci    return keys;
2474514f5e3Sopenharmony_ci}
2484514f5e3Sopenharmony_ci
2494514f5e3Sopenharmony_civoid SharedArrayCheckKeyValueCommon(JSThread* thread, JSHandle<JSObject>& valueHandle, PropertyDescriptor& descRes,
2504514f5e3Sopenharmony_ci    std::vector<JSHandle<JSTaggedValue>>& keys, std::vector<int32_t>& vals)
2514514f5e3Sopenharmony_ci{
2524514f5e3Sopenharmony_ci    for (size_t i = 0; i < vals.size(); i++) {
2534514f5e3Sopenharmony_ci        JSObject::GetOwnProperty(thread, valueHandle, keys[i], descRes);
2544514f5e3Sopenharmony_ci        ASSERT_EQ(descRes.GetValue().GetTaggedValue(), JSTaggedValue(vals[i]));
2554514f5e3Sopenharmony_ci    }
2564514f5e3Sopenharmony_ci}
2574514f5e3Sopenharmony_ci
2584514f5e3Sopenharmony_ci// Array.from ( items [ , mapfn [ , thisArg ] ] )
2594514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, From)
2604514f5e3Sopenharmony_ci{
2614514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
2624514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
2634514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
2644514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
2654514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
2664514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
2674514f5e3Sopenharmony_ci
2684514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3, 4, 5};
2694514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
2704514f5e3Sopenharmony_ci
2714514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
2724514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 6);
2734514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(array.GetTaggedValue());
2744514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
2754514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, obj.GetTaggedValue());
2764514f5e3Sopenharmony_ci
2774514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
2784514f5e3Sopenharmony_ci    JSTaggedValue result = Array::From(ecmaRuntimeCallInfo1);
2794514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
2804514f5e3Sopenharmony_ci    JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
2814514f5e3Sopenharmony_ci    ASSERT_TRUE(value.IsECMAObject());
2824514f5e3Sopenharmony_ci    PropertyDescriptor descRes(thread);
2834514f5e3Sopenharmony_ci    JSHandle<JSObject> valueHandle(thread, value);
2844514f5e3Sopenharmony_ci    std::vector<int> vals{1, 2, 3, 4, 5};
2854514f5e3Sopenharmony_ci    SharedArrayCheckKeyValueCommon(thread, valueHandle, descRes, keys, vals);
2864514f5e3Sopenharmony_ci}
2874514f5e3Sopenharmony_ci
2884514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Species)
2894514f5e3Sopenharmony_ci{
2904514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
2914514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
2924514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(env->GetArrayFunction());
2934514f5e3Sopenharmony_ci    JSHandle<JSObject> globalObject(thread, env->GetGlobalObject());
2944514f5e3Sopenharmony_ci
2954514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
2964514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(array.GetTaggedValue());
2974514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(globalObject.GetTaggedValue());
2984514f5e3Sopenharmony_ci
2994514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
3004514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Species(ecmaRuntimeCallInfo1);
3014514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
3024514f5e3Sopenharmony_ci    ASSERT_TRUE(result.IsECMAObject());
3034514f5e3Sopenharmony_ci}
3044514f5e3Sopenharmony_ci
3054514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Concat)
3064514f5e3Sopenharmony_ci{
3074514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
3084514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
3094514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
3104514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
3114514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
3124514f5e3Sopenharmony_ci
3134514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3};
3144514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
3154514f5e3Sopenharmony_ci
3164514f5e3Sopenharmony_ci    JSSharedArray *arr1 = JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)).GetObject<JSSharedArray>();
3174514f5e3Sopenharmony_ci    EXPECT_TRUE(arr1 != nullptr);
3184514f5e3Sopenharmony_ci    JSHandle<JSObject> obj1(thread, arr1);
3194514f5e3Sopenharmony_ci
3204514f5e3Sopenharmony_ci    std::vector<int> descVals2{4, 5, 6};
3214514f5e3Sopenharmony_ci    keys = SharedArrayDefineOwnPropertyTest(thread, obj1, descVals2);
3224514f5e3Sopenharmony_ci
3234514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
3244514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
3254514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
3264514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, obj1.GetTaggedValue());
3274514f5e3Sopenharmony_ci
3284514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
3294514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Concat(ecmaRuntimeCallInfo1);
3304514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
3314514f5e3Sopenharmony_ci    JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
3324514f5e3Sopenharmony_ci    ASSERT_TRUE(value.IsECMAObject());
3334514f5e3Sopenharmony_ci
3344514f5e3Sopenharmony_ci    PropertyDescriptor descRes(thread);
3354514f5e3Sopenharmony_ci    JSHandle<JSObject> valueHandle(thread, value);
3364514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key7(thread, JSTaggedValue(5));
3374514f5e3Sopenharmony_ci    EXPECT_EQ(
3384514f5e3Sopenharmony_ci        JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(valueHandle), lengthKeyHandle,
3394514f5e3Sopenharmony_ci                                   SCheckMode::SKIP).GetValue()->GetInt(), 6);
3404514f5e3Sopenharmony_ci
3414514f5e3Sopenharmony_ci    JSObject::GetOwnProperty(thread, valueHandle, key7, descRes);
3424514f5e3Sopenharmony_ci}
3434514f5e3Sopenharmony_ci
3444514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Map)
3454514f5e3Sopenharmony_ci{
3464514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
3474514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
3484514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVM->GetFactory();
3494514f5e3Sopenharmony_ci
3504514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
3514514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
3524514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
3534514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
3544514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
3554514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
3564514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
3574514f5e3Sopenharmony_ci
3584514f5e3Sopenharmony_ci    std::vector<int> descVals{50, 200, 3};
3594514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
3604514f5e3Sopenharmony_ci
3614514f5e3Sopenharmony_ci    JSHandle<JSSharedArray> JSSharedArray(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)));
3624514f5e3Sopenharmony_ci    JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestMapFunc));
3634514f5e3Sopenharmony_ci
3644514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
3654514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
3664514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
3674514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, func.GetTaggedValue());
3684514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSSharedArray.GetTaggedValue());
3694514f5e3Sopenharmony_ci
3704514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
3714514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Map(ecmaRuntimeCallInfo1);
3724514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
3734514f5e3Sopenharmony_ci    JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
3744514f5e3Sopenharmony_ci    ASSERT_TRUE(value.IsECMAObject());
3754514f5e3Sopenharmony_ci
3764514f5e3Sopenharmony_ci    PropertyDescriptor descRes(thread);
3774514f5e3Sopenharmony_ci    JSHandle<JSObject> valueHandle(thread, value);
3784514f5e3Sopenharmony_ci    std::vector<int> vals{100, 400, 6};
3794514f5e3Sopenharmony_ci    EXPECT_EQ(
3804514f5e3Sopenharmony_ci        JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(valueHandle), lengthKeyHandle,
3814514f5e3Sopenharmony_ci                                   SCheckMode::SKIP).GetValue()->GetInt(), 3);
3824514f5e3Sopenharmony_ci    SharedArrayCheckKeyValueCommon(thread, valueHandle, descRes, keys, vals);
3834514f5e3Sopenharmony_ci}
3844514f5e3Sopenharmony_ci
3854514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Slice)
3864514f5e3Sopenharmony_ci{
3874514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
3884514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))  \
3894514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
3904514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
3914514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
3924514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
3934514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
3944514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3, 4, 5};
3954514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
3964514f5e3Sopenharmony_ci
3974514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
3984514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
3994514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
4004514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1)));
4014514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(4)));
4024514f5e3Sopenharmony_ci
4034514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
4044514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Slice(ecmaRuntimeCallInfo1);
4054514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
4064514f5e3Sopenharmony_ci    JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
4074514f5e3Sopenharmony_ci    ASSERT_TRUE(value.IsECMAObject());
4084514f5e3Sopenharmony_ci
4094514f5e3Sopenharmony_ci    PropertyDescriptor descRes(thread);
4104514f5e3Sopenharmony_ci    JSHandle<JSObject> valueHandle(thread, value);
4114514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(valueHandle), lengthKeyHandle,
4124514f5e3Sopenharmony_ci                                         SCheckMode::SKIP).GetValue()->GetInt(), 3);
4134514f5e3Sopenharmony_ci    std::vector<int> vals{2, 3, 4};
4144514f5e3Sopenharmony_ci    SharedArrayCheckKeyValueCommon(thread, valueHandle, descRes, keys, vals);
4154514f5e3Sopenharmony_ci}
4164514f5e3Sopenharmony_ci
4174514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Splice)
4184514f5e3Sopenharmony_ci{
4194514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
4204514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
4214514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
4224514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
4234514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
4244514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
4254514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
4264514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3, 4, 5};
4274514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
4284514f5e3Sopenharmony_ci
4294514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
4304514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
4314514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
4324514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1)));
4334514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(2)));
4344514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(2, JSTaggedValue(static_cast<int32_t>(100)));
4354514f5e3Sopenharmony_ci
4364514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
4374514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Splice(ecmaRuntimeCallInfo1);
4384514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
4394514f5e3Sopenharmony_ci    JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
4404514f5e3Sopenharmony_ci    ASSERT_TRUE(value.IsECMAObject());
4414514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle,
4424514f5e3Sopenharmony_ci                                         SCheckMode::SKIP).GetValue()->GetInt(), 4);
4434514f5e3Sopenharmony_ci
4444514f5e3Sopenharmony_ci    PropertyDescriptor descRes(thread);
4454514f5e3Sopenharmony_ci    JSHandle<JSObject> valueHandle(thread, value);
4464514f5e3Sopenharmony_ci    EXPECT_EQ(
4474514f5e3Sopenharmony_ci        JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(valueHandle), lengthKeyHandle,
4484514f5e3Sopenharmony_ci                                   SCheckMode::SKIP).GetValue()->GetInt(), 2);
4494514f5e3Sopenharmony_ci    JSObject::GetOwnProperty(thread, valueHandle, keys[0], descRes);
4504514f5e3Sopenharmony_ci    ASSERT_EQ(descRes.GetValue().GetTaggedValue(), JSTaggedValue(2));
4514514f5e3Sopenharmony_ci}
4524514f5e3Sopenharmony_ci
4534514f5e3Sopenharmony_ci// new Array(1,2,3,4,5).Fill(0,1,3)
4544514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Fill)
4554514f5e3Sopenharmony_ci{
4564514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
4574514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
4584514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
4594514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
4604514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
4614514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
4624514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
4634514f5e3Sopenharmony_ci
4644514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3, 4, 5};
4654514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
4664514f5e3Sopenharmony_ci
4674514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
4684514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
4694514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
4704514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(0)));
4714514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(1)));
4724514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(2, JSTaggedValue(static_cast<int32_t>(3)));
4734514f5e3Sopenharmony_ci
4744514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
4754514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Fill(ecmaRuntimeCallInfo1);
4764514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
4774514f5e3Sopenharmony_ci    JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
4784514f5e3Sopenharmony_ci    ASSERT_TRUE(value.IsECMAObject());
4794514f5e3Sopenharmony_ci    PropertyDescriptor descRes(thread);
4804514f5e3Sopenharmony_ci    JSHandle<JSObject> valueHandle(thread, value);
4814514f5e3Sopenharmony_ci    std::vector<int32_t> vals{1, 0, 0, 4, 5};
4824514f5e3Sopenharmony_ci    SharedArrayCheckKeyValueCommon(thread, valueHandle, descRes, keys, vals);
4834514f5e3Sopenharmony_ci}
4844514f5e3Sopenharmony_ci
4854514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Find)
4864514f5e3Sopenharmony_ci{
4874514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
4884514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
4894514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVM->GetFactory();
4904514f5e3Sopenharmony_ci
4914514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
4924514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
4934514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
4944514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
4954514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
4964514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
4974514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
4984514f5e3Sopenharmony_ci
4994514f5e3Sopenharmony_ci    std::vector<int> vals{1, 102, 3};
5004514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, vals);
5014514f5e3Sopenharmony_ci    JSHandle<JSSharedArray> JSSharedArray(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)));
5024514f5e3Sopenharmony_ci    JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestFindFunc));
5034514f5e3Sopenharmony_ci
5044514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
5054514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
5064514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
5074514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, func.GetTaggedValue());
5084514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSSharedArray.GetTaggedValue());
5094514f5e3Sopenharmony_ci
5104514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
5114514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::Find(ecmaRuntimeCallInfo1);
5124514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
5134514f5e3Sopenharmony_ci
5144514f5e3Sopenharmony_ci    EXPECT_EQ(result2.GetRawData(), JSTaggedValue(102).GetRawData());
5154514f5e3Sopenharmony_ci}
5164514f5e3Sopenharmony_ci
5174514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, FindIndex)
5184514f5e3Sopenharmony_ci{
5194514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
5204514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
5214514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVM->GetFactory();
5224514f5e3Sopenharmony_ci
5234514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
5244514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
5254514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
5264514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
5274514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
5284514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
5294514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
5304514f5e3Sopenharmony_ci
5314514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 30};
5324514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
5334514f5e3Sopenharmony_ci
5344514f5e3Sopenharmony_ci    JSHandle<JSSharedArray> JSSharedArray(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)));
5354514f5e3Sopenharmony_ci    JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestFindIndexFunc));
5364514f5e3Sopenharmony_ci
5374514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
5384514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
5394514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
5404514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, func.GetTaggedValue());
5414514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSSharedArray.GetTaggedValue());
5424514f5e3Sopenharmony_ci
5434514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
5444514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::FindIndex(ecmaRuntimeCallInfo1);
5454514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
5464514f5e3Sopenharmony_ci
5474514f5e3Sopenharmony_ci    EXPECT_EQ(result2.GetRawData(), JSTaggedValue(static_cast<double>(2)).GetRawData());
5484514f5e3Sopenharmony_ci}
5494514f5e3Sopenharmony_ci
5504514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, ForEach)
5514514f5e3Sopenharmony_ci{
5524514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
5534514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
5544514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVM->GetFactory();
5554514f5e3Sopenharmony_ci
5564514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
5574514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
5584514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
5594514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
5604514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
5614514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
5624514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
5634514f5e3Sopenharmony_ci
5644514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3};
5654514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
5664514f5e3Sopenharmony_ci
5674514f5e3Sopenharmony_ci    JSHandle<JSSharedArray> JSSharedArray(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)));
5684514f5e3Sopenharmony_ci    JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestForEachFunc));
5694514f5e3Sopenharmony_ci
5704514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
5714514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
5724514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
5734514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, func.GetTaggedValue());
5744514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSSharedArray.GetTaggedValue());
5754514f5e3Sopenharmony_ci
5764514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
5774514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::ForEach(ecmaRuntimeCallInfo1);
5784514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
5794514f5e3Sopenharmony_ci    EXPECT_EQ(result2.GetRawData(), JSTaggedValue::VALUE_UNDEFINED);
5804514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray->GetArrayLength(), 3U);
5814514f5e3Sopenharmony_ci}
5824514f5e3Sopenharmony_ci
5834514f5e3Sopenharmony_ci#define ARRAY_DEFINE_OWN_PROPERTY(dest, index, value)                                                               \
5844514f5e3Sopenharmony_ci    do {                                                                                                            \
5854514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> key(thread, JSTaggedValue(index));                                                  \
5864514f5e3Sopenharmony_ci        PropertyDescriptor desc(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(value)), true, true, true);   \
5874514f5e3Sopenharmony_ci        JSSharedArray::DefineOwnProperty(thread, dest, key, desc, SCheckMode::SKIP);                                \
5884514f5e3Sopenharmony_ci    } while (false)
5894514f5e3Sopenharmony_ci
5904514f5e3Sopenharmony_ci#define ARRAY_BUILTIN_METHOD_TEST_CASE_ARG0(method, target, expected)                                               \
5914514f5e3Sopenharmony_ci    do {                                                                                                            \
5924514f5e3Sopenharmony_ci        auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);    \
5934514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());                                               \
5944514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetThis((target).GetTaggedValue());                                                    \
5954514f5e3Sopenharmony_ci                                                                                                                    \
5964514f5e3Sopenharmony_ci        [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);                           \
5974514f5e3Sopenharmony_ci        JSTaggedValue result = Array::method(ecmaRuntimeCallInfo);                                                  \
5984514f5e3Sopenharmony_ci        TestHelper::TearDownFrame(thread, prev);                                                                    \
5994514f5e3Sopenharmony_ci        ASSERT_TRUE(JSTaggedValue::StrictEqual(result, JSTaggedValue(expected)));                                   \
6004514f5e3Sopenharmony_ci    } while (false)
6014514f5e3Sopenharmony_ci
6024514f5e3Sopenharmony_ci#define ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(method, target, expected, arg0)                                         \
6034514f5e3Sopenharmony_ci    do {                                                                                                            \
6044514f5e3Sopenharmony_ci        auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);    \
6054514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());                                               \
6064514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetThis((target).GetTaggedValue());                                                    \
6074514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(arg0));                                                    \
6084514f5e3Sopenharmony_ci                                                                                                                    \
6094514f5e3Sopenharmony_ci        [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);                           \
6104514f5e3Sopenharmony_ci        JSTaggedValue result = Array::method(ecmaRuntimeCallInfo);                                                  \
6114514f5e3Sopenharmony_ci        TestHelper::TearDownFrame(thread, prev);                                                                    \
6124514f5e3Sopenharmony_ci        ASSERT_TRUE(JSTaggedValue::StrictEqual(result, JSTaggedValue(expected)));                                   \
6134514f5e3Sopenharmony_ci    } while (false)
6144514f5e3Sopenharmony_ci
6154514f5e3Sopenharmony_ci#define ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(method, target, expected, arg0, arg1)                                   \
6164514f5e3Sopenharmony_ci    do {                                                                                                            \
6174514f5e3Sopenharmony_ci        auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);    \
6184514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());                                               \
6194514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetThis((target).GetTaggedValue());                                                    \
6204514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(arg0));                                                    \
6214514f5e3Sopenharmony_ci        ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(arg1));                                                    \
6224514f5e3Sopenharmony_ci                                                                                                                    \
6234514f5e3Sopenharmony_ci        [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);                           \
6244514f5e3Sopenharmony_ci        JSTaggedValue result = Array::method(ecmaRuntimeCallInfo);                                                  \
6254514f5e3Sopenharmony_ci        TestHelper::TearDownFrame(thread, prev);                                                                    \
6264514f5e3Sopenharmony_ci        ASSERT_TRUE(JSTaggedValue::StrictEqual(result, JSTaggedValue(expected)));                                   \
6274514f5e3Sopenharmony_ci    } while (false)
6284514f5e3Sopenharmony_ci
6294514f5e3Sopenharmony_ci// Array.IndexOf(searchElement [ , fromIndex ])
6304514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, IndexOf)
6314514f5e3Sopenharmony_ci{
6324514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
6334514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(20)) \
6344514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
6354514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
6364514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
6374514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
6384514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 20);
6394514f5e3Sopenharmony_ci
6404514f5e3Sopenharmony_ci    // arr = [1, 2, 3, 4, 3, 0, 2.0, +0.0, 3.0, -0.0, <hole>, <hole>, undefined]
6414514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 0, 1);
6424514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 1, 2);
6434514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 2, 3);
6444514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 3, 4);
6454514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 4, 3);
6464514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 5, 0);
6474514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 6, 2.0);
6484514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 7, +0.0);
6494514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 8, 3.0);
6504514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 9, -0.0);
6514514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 12, JSTaggedValue::Undefined());
6524514f5e3Sopenharmony_ci
6534514f5e3Sopenharmony_ci    // arr.indexOf(3, 0) == 2
6544514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(IndexOf, obj, 2, 3, 0);
6554514f5e3Sopenharmony_ci    // arr.indexOf(3, 3) == 4
6564514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(IndexOf, obj, 4, 3, 3);
6574514f5e3Sopenharmony_ci    // arr.indexOf(5, 0) == -1
6584514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(IndexOf, obj, -1, 5, 0);
6594514f5e3Sopenharmony_ci    // arr.indexOf(3) == 2
6604514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(IndexOf, obj, 2, 3);
6614514f5e3Sopenharmony_ci
6624514f5e3Sopenharmony_ci    // Expects int32_t(x) and double(x) to be strictly equal
6634514f5e3Sopenharmony_ci    // arr.indexOf(3.0) == 2
6644514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(IndexOf, obj, 2, 3.0);
6654514f5e3Sopenharmony_ci    // arr.indexOf(3, 5) == 8
6664514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(IndexOf, obj, 8, 3, 5);
6674514f5e3Sopenharmony_ci
6684514f5e3Sopenharmony_ci    // Expects 0, +0.0, -0.0 to be strictly equal
6694514f5e3Sopenharmony_ci    // arr.indexOf(+0.0) == 5
6704514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(IndexOf, obj, 5, +0.0);
6714514f5e3Sopenharmony_ci    // arr.indexOf(-0.0) == 5
6724514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(IndexOf, obj, 5, -0.0);
6734514f5e3Sopenharmony_ci    // arr.indexOf(0, 6) == 7
6744514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(IndexOf, obj, 7, 0, 6);
6754514f5e3Sopenharmony_ci    // arr.indexOf(-0.0, 6) == 7
6764514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(IndexOf, obj, 7, -0.0, 6);
6774514f5e3Sopenharmony_ci    // arr.indexOf(0, 8) == 9
6784514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(IndexOf, obj, 9, 0, 8);
6794514f5e3Sopenharmony_ci    // arr.indexOf(+0.0, 8) == 9
6804514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(IndexOf, obj, 9, +0.0, 8);
6814514f5e3Sopenharmony_ci
6824514f5e3Sopenharmony_ci    // Expects undefined to be found
6834514f5e3Sopenharmony_ci    // arr.indexOf() == 12, where the first argument is undefined
6844514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG0(IndexOf, obj, 12);
6854514f5e3Sopenharmony_ci}
6864514f5e3Sopenharmony_ci
6874514f5e3Sopenharmony_ci// Array.LastIndexOf(searchElement [ , fromIndex ])
6884514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, LastIndexOf)
6894514f5e3Sopenharmony_ci{
6904514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
6914514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
6924514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
6934514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
6944514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP)
6954514f5e3Sopenharmony_ci                  .GetValue()
6964514f5e3Sopenharmony_ci                  ->GetInt(),
6974514f5e3Sopenharmony_ci              0);
6984514f5e3Sopenharmony_ci
6994514f5e3Sopenharmony_ci    // arr.lastIndexOf(0) == -1
7004514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(LastIndexOf, obj, -1, 0);
7014514f5e3Sopenharmony_ci
7024514f5e3Sopenharmony_ci    // arr = [1, 2, 3, 4, 3, 0, 2.0, +0.0, 3.0, -0.0, <hole>, <hole>, undefined, <hole>, <hole>, -1]
7034514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 0, 1);
7044514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 1, 2);
7054514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 2, 3);
7064514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 3, 4);
7074514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 4, 3);
7084514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 5, 0);
7094514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 6, 2.0);
7104514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 7, +0.0);
7114514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 8, 3.0);
7124514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 9, -0.0);
7134514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 12, JSTaggedValue::Undefined());
7144514f5e3Sopenharmony_ci    ARRAY_DEFINE_OWN_PROPERTY(obj, 15, -1);
7154514f5e3Sopenharmony_ci
7164514f5e3Sopenharmony_ci    // arr.lastIndexOf(1, -17) == -1
7174514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(LastIndexOf, obj, -1, 1, -17);
7184514f5e3Sopenharmony_ci
7194514f5e3Sopenharmony_ci    // arr.lastIndexOf(3, 4) == 4
7204514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(LastIndexOf, obj, 4, 3, 4);
7214514f5e3Sopenharmony_ci    // arr.lastIndexOf(3, 3) == 2
7224514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(LastIndexOf, obj, 2, 3, 3);
7234514f5e3Sopenharmony_ci    // arr.lastIndexOf(5, 4) == -1
7244514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(LastIndexOf, obj, -1, 5, 4);
7254514f5e3Sopenharmony_ci
7264514f5e3Sopenharmony_ci    // Expects int32_t(x) and double(x) to be strictly equal
7274514f5e3Sopenharmony_ci    // arr.lastIndexOf(3) == 8
7284514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(LastIndexOf, obj, 8, 3);
7294514f5e3Sopenharmony_ci    // arr.lastIndexOf(1.0) == 0
7304514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(LastIndexOf, obj, 0, 1.0);
7314514f5e3Sopenharmony_ci
7324514f5e3Sopenharmony_ci    // Expects 0, +0.0, -0.0 to be strictly equal
7334514f5e3Sopenharmony_ci    // arr.indexOf(+0.0) == 9
7344514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(LastIndexOf, obj, 9, +0.0);
7354514f5e3Sopenharmony_ci    // arr.indexOf(0) == 9
7364514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG1(LastIndexOf, obj, 9, 0);
7374514f5e3Sopenharmony_ci    // arr.indexOf(0, 8) == 7
7384514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(LastIndexOf, obj, 7, 0, 8);
7394514f5e3Sopenharmony_ci    // arr.indexOf(-0.0, 8) == 7
7404514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(LastIndexOf, obj, 7, -0.0, 8);
7414514f5e3Sopenharmony_ci    // arr.indexOf(-0.0, 6) == 5
7424514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(LastIndexOf, obj, 5, -0.0, 6);
7434514f5e3Sopenharmony_ci    // arr.indexOf(+0.0, 6) == 5
7444514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG2(LastIndexOf, obj, 5, +0.0, 6);
7454514f5e3Sopenharmony_ci
7464514f5e3Sopenharmony_ci    // Expects undefined to be found
7474514f5e3Sopenharmony_ci    // arr.indexOf() == 12, where the first argument is undefined
7484514f5e3Sopenharmony_ci    ARRAY_BUILTIN_METHOD_TEST_CASE_ARG0(LastIndexOf, obj, 12);
7494514f5e3Sopenharmony_ci}
7504514f5e3Sopenharmony_ci
7514514f5e3Sopenharmony_ci// new Array().Pop()
7524514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Pop)
7534514f5e3Sopenharmony_ci{
7544514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
7554514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
7564514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
7574514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
7584514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
7594514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle,
7604514f5e3Sopenharmony_ci                                         SCheckMode::SKIP).GetValue()->GetInt(), 0);
7614514f5e3Sopenharmony_ci
7624514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
7634514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
7644514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
7654514f5e3Sopenharmony_ci
7664514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
7674514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Pop(ecmaRuntimeCallInfo1);
7684514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
7694514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue::VALUE_UNDEFINED);
7704514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue::VALUE_UNDEFINED);
7714514f5e3Sopenharmony_ci
7724514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key0(thread, JSTaggedValue(0));
7734514f5e3Sopenharmony_ci    PropertyDescriptor desc0(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(1)), true, true, true);
7744514f5e3Sopenharmony_ci    JSSharedArray::DefineOwnProperty(thread, obj, key0, desc0, SCheckMode::SKIP);
7754514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key1(thread, JSTaggedValue(1));
7764514f5e3Sopenharmony_ci    PropertyDescriptor desc1(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(2)), true, true, true);
7774514f5e3Sopenharmony_ci    JSSharedArray::DefineOwnProperty(thread, obj, key1, desc1, SCheckMode::SKIP);
7784514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key2(thread, JSTaggedValue(2));
7794514f5e3Sopenharmony_ci    PropertyDescriptor desc2(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(3)), true, true, true);
7804514f5e3Sopenharmony_ci    JSSharedArray::DefineOwnProperty(thread, obj, key2, desc2, SCheckMode::SKIP);
7814514f5e3Sopenharmony_ci
7824514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
7834514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
7844514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetThis(obj.GetTaggedValue());
7854514f5e3Sopenharmony_ci
7864514f5e3Sopenharmony_ci    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
7874514f5e3Sopenharmony_ci    result = Array::Pop(ecmaRuntimeCallInfo2);
7884514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
7894514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue(3).GetRawData());
7904514f5e3Sopenharmony_ci}
7914514f5e3Sopenharmony_ci
7924514f5e3Sopenharmony_ci// new Array(1,2,3).Push(...items)
7934514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Push)
7944514f5e3Sopenharmony_ci{
7954514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
7964514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
7974514f5e3Sopenharmony_ci                        .GetTaggedValue().GetTaggedObject());
7984514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
7994514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
8004514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
8014514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
8024514f5e3Sopenharmony_ci
8034514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key0(thread, JSTaggedValue(0));
8044514f5e3Sopenharmony_ci    PropertyDescriptor desc0(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(1)), true, true, true);
8054514f5e3Sopenharmony_ci    JSSharedArray::DefineOwnProperty(thread, obj, key0, desc0, SCheckMode::SKIP);
8064514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key1(thread, JSTaggedValue(1));
8074514f5e3Sopenharmony_ci    PropertyDescriptor desc1(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(2)), true, true, true);
8084514f5e3Sopenharmony_ci    JSSharedArray::DefineOwnProperty(thread, obj, key1, desc1, SCheckMode::SKIP);
8094514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key2(thread, JSTaggedValue(2));
8104514f5e3Sopenharmony_ci    PropertyDescriptor desc2(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(3)), true, true, true);
8114514f5e3Sopenharmony_ci    JSSharedArray::DefineOwnProperty(thread, obj, key2, desc2, SCheckMode::SKIP);
8124514f5e3Sopenharmony_ci
8134514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
8144514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
8154514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
8164514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(4)));
8174514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(5)));
8184514f5e3Sopenharmony_ci
8194514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
8204514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Push(ecmaRuntimeCallInfo1);
8214514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
8224514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetNumber(), 5);
8234514f5e3Sopenharmony_ci
8244514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle,
8254514f5e3Sopenharmony_ci                                         SCheckMode::SKIP).GetValue()->GetInt(), 5);
8264514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key3(thread, JSTaggedValue(3));
8274514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), key3, SCheckMode::SKIP) \
8284514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 4);
8294514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key4(thread, JSTaggedValue(4));
8304514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), key4, SCheckMode::SKIP) \
8314514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 5);
8324514f5e3Sopenharmony_ci}
8334514f5e3Sopenharmony_ci
8344514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, DefineOwnProperty_Array)
8354514f5e3Sopenharmony_ci{
8364514f5e3Sopenharmony_ci    JSArray *arr = JSArray::Cast(JSArray::ArrayCreate(thread, JSTaggedNumber(0)) \
8374514f5e3Sopenharmony_ci                        .GetTaggedValue().GetTaggedObject());
8384514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
8394514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
8404514f5e3Sopenharmony_ci
8414514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key0(thread, JSTaggedValue(0));
8424514f5e3Sopenharmony_ci    PropertyDescriptor desc0(thread, JSHandle<JSTaggedValue>(thread, JSTaggedValue(arr)), true, true, true);
8434514f5e3Sopenharmony_ci    bool res = JSSharedArray::DefineOwnProperty(thread, obj, key0, desc0, SCheckMode::SKIP);
8444514f5e3Sopenharmony_ci    ASSERT_TRUE(!res);
8454514f5e3Sopenharmony_ci}
8464514f5e3Sopenharmony_ci
8474514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Reduce)
8484514f5e3Sopenharmony_ci{
8494514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
8504514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
8514514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVM->GetFactory();
8524514f5e3Sopenharmony_ci
8534514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
8544514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
8554514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
8564514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
8574514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
8584514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
8594514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
8604514f5e3Sopenharmony_ci
8614514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3};
8624514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
8634514f5e3Sopenharmony_ci
8644514f5e3Sopenharmony_ci    JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestReduceFunc));
8654514f5e3Sopenharmony_ci
8664514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
8674514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
8684514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
8694514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, func.GetTaggedValue());
8704514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(10)));
8714514f5e3Sopenharmony_ci
8724514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
8734514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Reduce(ecmaRuntimeCallInfo1);
8744514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
8754514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue(16).GetRawData());
8764514f5e3Sopenharmony_ci}
8774514f5e3Sopenharmony_ci
8784514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Shift)
8794514f5e3Sopenharmony_ci{
8804514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
8814514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
8824514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
8834514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
8844514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
8854514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
8864514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
8874514f5e3Sopenharmony_ci
8884514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3};
8894514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
8904514f5e3Sopenharmony_ci
8914514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
8924514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
8934514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
8944514f5e3Sopenharmony_ci
8954514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
8964514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Shift(ecmaRuntimeCallInfo1);
8974514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
8984514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue(1).GetRawData());
8994514f5e3Sopenharmony_ci}
9004514f5e3Sopenharmony_ci
9014514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Sort)
9024514f5e3Sopenharmony_ci{
9034514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
9044514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
9054514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
9064514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
9074514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
9084514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
9094514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
9104514f5e3Sopenharmony_ci
9114514f5e3Sopenharmony_ci    std::vector<int> descVals{3, 2, 1};
9124514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
9134514f5e3Sopenharmony_ci
9144514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
9154514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
9164514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
9174514f5e3Sopenharmony_ci
9184514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
9194514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::Sort(ecmaRuntimeCallInfo1);
9204514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
9214514f5e3Sopenharmony_ci
9224514f5e3Sopenharmony_ci    EXPECT_TRUE(result2.IsECMAObject());
9234514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultArr =
9244514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue>(thread, JSTaggedValue(static_cast<JSTaggedType>(result2.GetRawData())));
9254514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, resultArr, keys[0], SCheckMode::SKIP).GetValue()->GetInt(), 1);
9264514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, resultArr, keys[1], SCheckMode::SKIP).GetValue()->GetInt(), 2);
9274514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, resultArr, keys[2], SCheckMode::SKIP).GetValue()->GetInt(), 3);
9284514f5e3Sopenharmony_ci}
9294514f5e3Sopenharmony_ci
9304514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Sort_Exception)
9314514f5e3Sopenharmony_ci{
9324514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
9334514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
9344514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
9354514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
9364514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
9374514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
9384514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
9394514f5e3Sopenharmony_ci
9404514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
9414514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
9424514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
9434514f5e3Sopenharmony_ci
9444514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
9454514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::Sort(ecmaRuntimeCallInfo1);
9464514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
9474514f5e3Sopenharmony_ci
9484514f5e3Sopenharmony_ci    EXPECT_TRUE(result2.IsECMAObject());
9494514f5e3Sopenharmony_ci}
9504514f5e3Sopenharmony_ci
9514514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Sort_Exception_1)
9524514f5e3Sopenharmony_ci{
9534514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
9544514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(1)) \
9554514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
9564514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
9574514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
9584514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
9594514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 1);
9604514f5e3Sopenharmony_ci
9614514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
9624514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
9634514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
9644514f5e3Sopenharmony_ci
9654514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
9664514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::Sort(ecmaRuntimeCallInfo1);
9674514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
9684514f5e3Sopenharmony_ci
9694514f5e3Sopenharmony_ci    EXPECT_TRUE(result2.IsECMAObject());
9704514f5e3Sopenharmony_ci}
9714514f5e3Sopenharmony_ci
9724514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Unshift)
9734514f5e3Sopenharmony_ci{
9744514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
9754514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
9764514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
9774514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
9784514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
9794514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
9804514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
9814514f5e3Sopenharmony_ci
9824514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3};
9834514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
9844514f5e3Sopenharmony_ci
9854514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
9864514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
9874514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
9884514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(4)));
9894514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(5)));
9904514f5e3Sopenharmony_ci
9914514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
9924514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Unshift(ecmaRuntimeCallInfo1);
9934514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
9944514f5e3Sopenharmony_ci
9954514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue(static_cast<double>(5)).GetRawData());
9964514f5e3Sopenharmony_ci
9974514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
9984514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 5);
9994514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key3(thread, JSTaggedValue(0));
10004514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), key3, SCheckMode::SKIP) \
10014514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 4);
10024514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key4(thread, JSTaggedValue(1));
10034514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), key4, SCheckMode::SKIP) \
10044514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 5);
10054514f5e3Sopenharmony_ci}
10064514f5e3Sopenharmony_ci
10074514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Join)
10084514f5e3Sopenharmony_ci{
10094514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
10104514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
10114514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
10124514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
10134514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(thread, arr);
10144514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, obj, lengthKeyHandle, SCheckMode::SKIP).GetValue()->GetInt(), 0);
10154514f5e3Sopenharmony_ci
10164514f5e3Sopenharmony_ci    std::vector<int> descVals{2, 3, 4};
10174514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
10184514f5e3Sopenharmony_ci
10194514f5e3Sopenharmony_ci    JSHandle<EcmaString> str = thread->GetEcmaVM()->GetFactory()->NewFromASCII("2,3,4");
10204514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
10214514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
10224514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
10234514f5e3Sopenharmony_ci
10244514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
10254514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Join(ecmaRuntimeCallInfo1);
10264514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
10274514f5e3Sopenharmony_ci    JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
10284514f5e3Sopenharmony_ci
10294514f5e3Sopenharmony_ci    ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, str), 0);
10304514f5e3Sopenharmony_ci}
10314514f5e3Sopenharmony_ci
10324514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, ToString)
10334514f5e3Sopenharmony_ci{
10344514f5e3Sopenharmony_ci    std::vector<int> descVals{2, 3, 4};
10354514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
10364514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
10374514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
10384514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
10394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(thread, arr);
10404514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, obj, lengthKeyHandle, SCheckMode::SKIP).GetValue()->GetInt(), 0);
10414514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
10424514f5e3Sopenharmony_ci
10434514f5e3Sopenharmony_ci    JSHandle<EcmaString> str = thread->GetEcmaVM()->GetFactory()->NewFromASCII("2,3,4");
10444514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
10454514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
10464514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
10474514f5e3Sopenharmony_ci
10484514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
10494514f5e3Sopenharmony_ci    JSTaggedValue result = Array::ToString(ecmaRuntimeCallInfo1);
10504514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
10514514f5e3Sopenharmony_ci    JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
10524514f5e3Sopenharmony_ci
10534514f5e3Sopenharmony_ci    ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, str), 0);
10544514f5e3Sopenharmony_ci}
10554514f5e3Sopenharmony_ci
10564514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Includes_one)
10574514f5e3Sopenharmony_ci{
10584514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
10594514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
10604514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
10614514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
10624514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(thread, arr);
10634514f5e3Sopenharmony_ci    std::vector<int> descVals{2, 3, 4};
10644514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, obj, lengthKeyHandle, SCheckMode::SKIP).GetValue()->GetInt(), 0);
10654514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
10664514f5e3Sopenharmony_ci
10674514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
10684514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
10694514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
10704514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(2)));
10714514f5e3Sopenharmony_ci
10724514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
10734514f5e3Sopenharmony_ci    [[maybe_unused]] JSTaggedValue result = Array::Includes(ecmaRuntimeCallInfo1);
10744514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
10754514f5e3Sopenharmony_ci
10764514f5e3Sopenharmony_ci    ASSERT_TRUE(result.JSTaggedValue::ToBoolean());  // new Int8Array[2,3,4].includes(2)
10774514f5e3Sopenharmony_ci
10784514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
10794514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
10804514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetThis(obj.GetTaggedValue());
10814514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1)));
10824514f5e3Sopenharmony_ci
10834514f5e3Sopenharmony_ci    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
10844514f5e3Sopenharmony_ci    result = Array::Includes(ecmaRuntimeCallInfo2);
10854514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
10864514f5e3Sopenharmony_ci
10874514f5e3Sopenharmony_ci    ASSERT_TRUE(!result.JSTaggedValue::ToBoolean());  // new Int8Array[2,3,4].includes(1)
10884514f5e3Sopenharmony_ci
10894514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
10904514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo3->SetFunction(JSTaggedValue::Undefined());
10914514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo3->SetThis(obj.GetTaggedValue());
10924514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo3->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(3)));
10934514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo3->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(1)));
10944514f5e3Sopenharmony_ci
10954514f5e3Sopenharmony_ci    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
10964514f5e3Sopenharmony_ci    result = Array::Includes(ecmaRuntimeCallInfo3);
10974514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
10984514f5e3Sopenharmony_ci
10994514f5e3Sopenharmony_ci    ASSERT_TRUE(result.JSTaggedValue::ToBoolean());  // new Int8Array[2,3,4].includes(3, 1)
11004514f5e3Sopenharmony_ci}
11014514f5e3Sopenharmony_ci
11024514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Includes_two)
11034514f5e3Sopenharmony_ci{
11044514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
11054514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
11064514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
11074514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
11084514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(thread, arr);
11094514f5e3Sopenharmony_ci    std::vector<int> descVals{2, 3, 4};
11104514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, obj, lengthKeyHandle, SCheckMode::SKIP).GetValue()->GetInt(), 0);
11114514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
11124514f5e3Sopenharmony_ci
11134514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo4 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
11144514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
11154514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo4->SetThis(obj.GetTaggedValue());
11164514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo4->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(2)));
11174514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo4->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(5)));
11184514f5e3Sopenharmony_ci
11194514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
11204514f5e3Sopenharmony_ci    [[maybe_unused]] JSTaggedValue result = Array::Includes(ecmaRuntimeCallInfo4);
11214514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
11224514f5e3Sopenharmony_ci
11234514f5e3Sopenharmony_ci    ASSERT_TRUE(!result.JSTaggedValue::ToBoolean());  // new Int8Array[2,3,4].includes(2, 5)
11244514f5e3Sopenharmony_ci
11254514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo5 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
11264514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo5->SetFunction(JSTaggedValue::Undefined());
11274514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo5->SetThis(obj.GetTaggedValue());
11284514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo5->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(2)));
11294514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo5->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(-2)));
11304514f5e3Sopenharmony_ci
11314514f5e3Sopenharmony_ci    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo5);
11324514f5e3Sopenharmony_ci    result = Array::Includes(ecmaRuntimeCallInfo5);
11334514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
11344514f5e3Sopenharmony_ci
11354514f5e3Sopenharmony_ci    ASSERT_TRUE(!result.JSTaggedValue::ToBoolean());  // new Int8Array[2,3,4].includes(2, -2)
11364514f5e3Sopenharmony_ci}
11374514f5e3Sopenharmony_ci
11384514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, At_ONE)
11394514f5e3Sopenharmony_ci{
11404514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
11414514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
11424514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
11434514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
11444514f5e3Sopenharmony_ci    std::vector<int> descVals{2, 3, 4};
11454514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(thread, arr);
11464514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, obj, lengthKeyHandle, SCheckMode::SKIP).GetValue()->GetInt(), 0);
11474514f5e3Sopenharmony_ci
11484514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
11494514f5e3Sopenharmony_ci
11504514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
11514514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
11524514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
11534514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(0)));
11544514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
11554514f5e3Sopenharmony_ci    JSTaggedValue result = Array::At(ecmaRuntimeCallInfo1);
11564514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev1);
11574514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue(2).GetRawData());
11584514f5e3Sopenharmony_ci
11594514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
11604514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
11614514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetThis(obj.GetTaggedValue());
11624514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(2)));
11634514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
11644514f5e3Sopenharmony_ci    result = Array::At(ecmaRuntimeCallInfo2);
11654514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev2);
11664514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue(4).GetRawData());
11674514f5e3Sopenharmony_ci
11684514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
11694514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo3->SetFunction(JSTaggedValue::Undefined());
11704514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo3->SetThis(obj.GetTaggedValue());
11714514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo3->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(3)));
11724514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev3 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
11734514f5e3Sopenharmony_ci    result = Array::At(ecmaRuntimeCallInfo3);
11744514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev3);
11754514f5e3Sopenharmony_ci    ASSERT_EQ(result, JSTaggedValue::Undefined());
11764514f5e3Sopenharmony_ci}
11774514f5e3Sopenharmony_ci
11784514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, At_TWO)
11794514f5e3Sopenharmony_ci{
11804514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
11814514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
11824514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
11834514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
11844514f5e3Sopenharmony_ci    std::vector<int> descVals{2, 3, 4};
11854514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(thread, arr);
11864514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, obj, lengthKeyHandle, SCheckMode::SKIP).GetValue()->GetInt(), 0);
11874514f5e3Sopenharmony_ci
11884514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
11894514f5e3Sopenharmony_ci
11904514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo4 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
11914514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
11924514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo4->SetThis(obj.GetTaggedValue());
11934514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo4->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(-1)));
11944514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev4 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
11954514f5e3Sopenharmony_ci    JSTaggedValue result = Array::At(ecmaRuntimeCallInfo4);
11964514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev4);
11974514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue(4).GetRawData());
11984514f5e3Sopenharmony_ci
11994514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo5 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
12004514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo5->SetFunction(JSTaggedValue::Undefined());
12014514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo5->SetThis(obj.GetTaggedValue());
12024514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo5->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(-3)));
12034514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev5 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo5);
12044514f5e3Sopenharmony_ci    result = Array::At(ecmaRuntimeCallInfo5);
12054514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev5);
12064514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue(2).GetRawData());
12074514f5e3Sopenharmony_ci
12084514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo6 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
12094514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo6->SetFunction(JSTaggedValue::Undefined());
12104514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo6->SetThis(obj.GetTaggedValue());
12114514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo6->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(-4)));
12124514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev6 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo6);
12134514f5e3Sopenharmony_ci    result = Array::At(ecmaRuntimeCallInfo6);
12144514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev6);
12154514f5e3Sopenharmony_ci    ASSERT_EQ(result, JSTaggedValue::Undefined());
12164514f5e3Sopenharmony_ci}
12174514f5e3Sopenharmony_ci
12184514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Create1)
12194514f5e3Sopenharmony_ci{
12204514f5e3Sopenharmony_ci    static int32_t len = 3;
12214514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
12224514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
12234514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
12244514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
12254514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
12264514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
12274514f5e3Sopenharmony_ci
12284514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
12294514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 8);
12304514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(array.GetTaggedValue());
12314514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
12324514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(len));
12334514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, obj.GetTaggedValue());
12344514f5e3Sopenharmony_ci
12354514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
12364514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Create(ecmaRuntimeCallInfo1);
12374514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
12384514f5e3Sopenharmony_ci    ASSERT_TRUE(result.IsECMAObject());
12394514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::Cast(result.GetTaggedObject())->GetArrayLength(), len);
12404514f5e3Sopenharmony_ci}
12414514f5e3Sopenharmony_ci
12424514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Create2)
12434514f5e3Sopenharmony_ci{
12444514f5e3Sopenharmony_ci    static double len = 100;
12454514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
12464514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
12474514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
12484514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
12494514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP) \
12504514f5e3Sopenharmony_ci        .GetValue()->GetInt(), 0);
12514514f5e3Sopenharmony_ci
12524514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
12534514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 8);
12544514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(array.GetTaggedValue());
12554514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
12564514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(len));
12574514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, obj.GetTaggedValue());
12584514f5e3Sopenharmony_ci
12594514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
12604514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Create(ecmaRuntimeCallInfo1);
12614514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
12624514f5e3Sopenharmony_ci    ASSERT_TRUE(result.IsECMAObject());
12634514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::Cast(result.GetTaggedObject())->GetArrayLength(), len);
12644514f5e3Sopenharmony_ci}
12654514f5e3Sopenharmony_ci
12664514f5e3Sopenharmony_ci// Array.isArray(arg)
12674514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, IsArray)
12684514f5e3Sopenharmony_ci{
12694514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
12704514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
12714514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
12724514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
12734514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle, SCheckMode::SKIP)
12744514f5e3Sopenharmony_ci                  .GetValue()
12754514f5e3Sopenharmony_ci                  ->GetInt(),
12764514f5e3Sopenharmony_ci              0);
12774514f5e3Sopenharmony_ci
12784514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
12794514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
12804514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
12814514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, obj.GetTaggedValue());
12824514f5e3Sopenharmony_ci
12834514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
12844514f5e3Sopenharmony_ci    JSTaggedValue result = Array::IsArray(ecmaRuntimeCallInfo1);
12854514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
12864514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue::True().GetRawData());
12874514f5e3Sopenharmony_ci
12884514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
12894514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
12904514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetThis(JSTaggedValue::Undefined());
12914514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo2->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1)));
12924514f5e3Sopenharmony_ci
12934514f5e3Sopenharmony_ci    prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
12944514f5e3Sopenharmony_ci    result = Array::IsArray(ecmaRuntimeCallInfo2);
12954514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
12964514f5e3Sopenharmony_ci    ASSERT_EQ(result.GetRawData(), JSTaggedValue::False().GetRawData());
12974514f5e3Sopenharmony_ci}
12984514f5e3Sopenharmony_ci
12994514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, GetIterator)
13004514f5e3Sopenharmony_ci{
13014514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
13024514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
13034514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(thread, arr);
13044514f5e3Sopenharmony_ci
13054514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
13064514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
13074514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetThis(obj.GetTaggedValue());
13084514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
13094514f5e3Sopenharmony_ci
13104514f5e3Sopenharmony_ci    // test Values()
13114514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Values(ecmaRuntimeCallInfo);
13124514f5e3Sopenharmony_ci    JSHandle<JSSharedArrayIterator> iter(thread, result);
13134514f5e3Sopenharmony_ci    EXPECT_EQ(IterationKind::VALUE, iter->GetIterationKind());
13144514f5e3Sopenharmony_ci
13154514f5e3Sopenharmony_ci    // test Keys()
13164514f5e3Sopenharmony_ci    JSTaggedValue result1 = Array::Keys(ecmaRuntimeCallInfo);
13174514f5e3Sopenharmony_ci    JSHandle<JSArrayIterator> iter1(thread, result1);
13184514f5e3Sopenharmony_ci    EXPECT_EQ(IterationKind::KEY, iter1->GetIterationKind());
13194514f5e3Sopenharmony_ci
13204514f5e3Sopenharmony_ci    // test entries()
13214514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::Entries(ecmaRuntimeCallInfo);
13224514f5e3Sopenharmony_ci    JSHandle<JSSharedArrayIterator> iter2(thread, result2);
13234514f5e3Sopenharmony_ci    EXPECT_EQ(IterationKind::KEY_AND_VALUE, iter2->GetIterationKind());
13244514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
13254514f5e3Sopenharmony_ci}
13264514f5e3Sopenharmony_ci
13274514f5e3Sopenharmony_ci
13284514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Unscopables)
13294514f5e3Sopenharmony_ci{
13304514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
13314514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
13324514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
13334514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
13344514f5e3Sopenharmony_ci
13354514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
13364514f5e3Sopenharmony_ci    JSTaggedValue result = Array::Unscopables(ecmaRuntimeCallInfo1);
13374514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
13384514f5e3Sopenharmony_ci    JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
13394514f5e3Sopenharmony_ci    ASSERT_TRUE(value.IsECMAObject());
13404514f5e3Sopenharmony_ci}
13414514f5e3Sopenharmony_ci
13424514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, ShrinkTo1)
13434514f5e3Sopenharmony_ci{
13444514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(10))->GetTaggedObject());
13454514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
13464514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
13474514f5e3Sopenharmony_ci
13484514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3, 4, 5};
13494514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
13504514f5e3Sopenharmony_ci
13514514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
13524514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 6);
13534514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(array.GetTaggedValue());
13544514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
13554514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(3)));
13564514f5e3Sopenharmony_ci
13574514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
13584514f5e3Sopenharmony_ci    JSTaggedValue result = Array::ShrinkTo(ecmaRuntimeCallInfo1);
13594514f5e3Sopenharmony_ci    EXPECT_EQ(result, JSTaggedValue::Undefined());
13604514f5e3Sopenharmony_ci    EXPECT_EQ(arr->GetArrayLength(), 3U);
13614514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
13624514f5e3Sopenharmony_ci}
13634514f5e3Sopenharmony_ci
13644514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, ShrinkTo2)
13654514f5e3Sopenharmony_ci{
13664514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(10))->GetTaggedObject());
13674514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
13684514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
13694514f5e3Sopenharmony_ci
13704514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 2, 3, 4, 5};
13714514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
13724514f5e3Sopenharmony_ci
13734514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
13744514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 6);
13754514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(array.GetTaggedValue());
13764514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
13774514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<double>(3)));
13784514f5e3Sopenharmony_ci
13794514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
13804514f5e3Sopenharmony_ci    JSTaggedValue result = Array::ShrinkTo(ecmaRuntimeCallInfo1);
13814514f5e3Sopenharmony_ci    EXPECT_EQ(result, JSTaggedValue::Undefined());
13824514f5e3Sopenharmony_ci    EXPECT_EQ(arr->GetArrayLength(), 3U);
13834514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
13844514f5e3Sopenharmony_ci}
13854514f5e3Sopenharmony_ci
13864514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, ExtendTo1)
13874514f5e3Sopenharmony_ci{
13884514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
13894514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
13904514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
13914514f5e3Sopenharmony_ci
13924514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
13934514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 8);
13944514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(array.GetTaggedValue());
13954514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
13964514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(3)));
13974514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, obj.GetTaggedValue());
13984514f5e3Sopenharmony_ci
13994514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
14004514f5e3Sopenharmony_ci    JSTaggedValue result = Array::ExtendTo(ecmaRuntimeCallInfo1);
14014514f5e3Sopenharmony_ci    ASSERT_EQ(result, JSTaggedValue::Undefined());
14024514f5e3Sopenharmony_ci    EXPECT_EQ(arr->GetArrayLength(), 3U);
14034514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
14044514f5e3Sopenharmony_ci}
14054514f5e3Sopenharmony_ci
14064514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, ExtendTo2)
14074514f5e3Sopenharmony_ci{
14084514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
14094514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
14104514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
14114514f5e3Sopenharmony_ci
14124514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
14134514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 8);
14144514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(array.GetTaggedValue());
14154514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
14164514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<double>(3)));
14174514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, obj.GetTaggedValue());
14184514f5e3Sopenharmony_ci
14194514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
14204514f5e3Sopenharmony_ci    JSTaggedValue result = Array::ExtendTo(ecmaRuntimeCallInfo1);
14214514f5e3Sopenharmony_ci    ASSERT_EQ(result, JSTaggedValue::Undefined());
14224514f5e3Sopenharmony_ci    EXPECT_EQ(arr->GetArrayLength(), 3U);
14234514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
14244514f5e3Sopenharmony_ci}
14254514f5e3Sopenharmony_ci
14264514f5e3Sopenharmony_cibool TestSharedArraySetProperty(EcmaRuntimeCallInfo *argv)
14274514f5e3Sopenharmony_ci{
14284514f5e3Sopenharmony_ci    JSThread *thread = argv->GetThread();
14294514f5e3Sopenharmony_ci    [[maybe_unused]] EcmaHandleScope handleScope(thread);
14304514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> thisHandle = BuiltinsBase::GetThis(argv);
14314514f5e3Sopenharmony_ci    if (!thisHandle->IsJSSharedArray()) {
14324514f5e3Sopenharmony_ci        return false;
14334514f5e3Sopenharmony_ci    }
14344514f5e3Sopenharmony_ci
14354514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> value = BuiltinsBase::GetCallArg(argv, 1);
14364514f5e3Sopenharmony_ci    uint32_t key = static_cast<uint32_t>(BuiltinsBase::GetCallArg(argv, 0)->GetInt());
14374514f5e3Sopenharmony_ci
14384514f5e3Sopenharmony_ci    return JSSharedArray::SetProperty(thread, thisHandle, key, value, true, SCheckMode::CHECK);
14394514f5e3Sopenharmony_ci}
14404514f5e3Sopenharmony_ci
14414514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, SetPropertyTest001)
14424514f5e3Sopenharmony_ci{
14434514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(5)) \
14444514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
14454514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
14464514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(thread, arr);
14474514f5e3Sopenharmony_ci
14484514f5e3Sopenharmony_ci    std::vector<int> descVals{2, 3, 4, 5, 7};
14494514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
14504514f5e3Sopenharmony_ci
14514514f5e3Sopenharmony_ci
14524514f5e3Sopenharmony_ci    JSHandle<JSFunction> array(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
14534514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 8);
14544514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
14554514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetThis(obj.GetTaggedValue());
14564514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(0)));
14574514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(5)));
14584514f5e3Sopenharmony_ci
14594514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
14604514f5e3Sopenharmony_ci    ASSERT_EQ(true, TestSharedArraySetProperty(ecmaRuntimeCallInfo));
14614514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
14624514f5e3Sopenharmony_ci
14634514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, array.GetTaggedValue(), 8);
14644514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
14654514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
14664514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(10)));
14674514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(5)));
14684514f5e3Sopenharmony_ci
14694514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
14704514f5e3Sopenharmony_ci    ASSERT_EQ(false, TestSharedArraySetProperty(ecmaRuntimeCallInfo1));
14714514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev1);
14724514f5e3Sopenharmony_ci}
14734514f5e3Sopenharmony_ci
14744514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, IncludeInSortedValue)
14754514f5e3Sopenharmony_ci{
14764514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
14774514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
14784514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVM->GetFactory();
14794514f5e3Sopenharmony_ci
14804514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(7)) \
14814514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
14824514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
14834514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
14844514f5e3Sopenharmony_ci
14854514f5e3Sopenharmony_ci    std::vector<int> descVals{2, 3, 4, 5, 7, 500, 600};
14864514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
14874514f5e3Sopenharmony_ci
14884514f5e3Sopenharmony_ci    JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestToSortedFunc));
14894514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> funcValue(thread, func.GetTaggedValue());
14904514f5e3Sopenharmony_ci
14914514f5e3Sopenharmony_ci    auto objCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 0);
14924514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
14934514f5e3Sopenharmony_ci
14944514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> value(thread, JSTaggedValue(7));
14954514f5e3Sopenharmony_ci    auto res = JSSharedArray::IncludeInSortedValue(thread, JSHandle<JSTaggedValue>(obj), value);
14964514f5e3Sopenharmony_ci    ASSERT_TRUE(res);
14974514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(100));
14984514f5e3Sopenharmony_ci    res = JSSharedArray::IncludeInSortedValue(thread, JSHandle<JSTaggedValue>(obj), value1);
14994514f5e3Sopenharmony_ci    ASSERT_TRUE(!res);
15004514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
15014514f5e3Sopenharmony_ci}
15024514f5e3Sopenharmony_ci
15034514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, IncludeInSortedValue_Len_0)
15044514f5e3Sopenharmony_ci{
15054514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
15064514f5e3Sopenharmony_ci        .GetTaggedValue().GetTaggedObject());
15074514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
15084514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
15094514f5e3Sopenharmony_ci
15104514f5e3Sopenharmony_ci    auto objCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 0);
15114514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
15124514f5e3Sopenharmony_ci
15134514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(0));
15144514f5e3Sopenharmony_ci    auto res = JSSharedArray::IncludeInSortedValue(thread, JSHandle<JSTaggedValue>(obj), value1);
15154514f5e3Sopenharmony_ci    ASSERT_TRUE(!res);
15164514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
15174514f5e3Sopenharmony_ci}
15184514f5e3Sopenharmony_ci
15194514f5e3Sopenharmony_ci
15204514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, DefineProperty)
15214514f5e3Sopenharmony_ci{
15224514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(2))->GetTaggedObject());
15234514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
15244514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
15254514f5e3Sopenharmony_ci
15264514f5e3Sopenharmony_ci    EcmaVM *ecmaVM = thread->GetEcmaVM();
15274514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
15284514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> function(thread, globalEnv->GetObjectFunction().GetObject<JSFunction>());
15294514f5e3Sopenharmony_ci
15304514f5e3Sopenharmony_ci    JSHandle<JSFunction> objFunc(globalEnv->GetObjectFunction());
15314514f5e3Sopenharmony_ci    JSHandle<JSObject> attHandle =
15324514f5e3Sopenharmony_ci        ecmaVM->GetFactory()->NewJSObjectByConstructor(JSHandle<JSFunction>(function), function);
15334514f5e3Sopenharmony_ci
15344514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(thread, JSTaggedValue(1));
15354514f5e3Sopenharmony_ci
15364514f5e3Sopenharmony_ci    auto objCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
15374514f5e3Sopenharmony_ci    objCallInfo->SetFunction(JSTaggedValue::Undefined());
15384514f5e3Sopenharmony_ci    objCallInfo->SetThis(JSTaggedValue::Undefined());
15394514f5e3Sopenharmony_ci    objCallInfo->SetCallArg(0, obj.GetTaggedValue());
15404514f5e3Sopenharmony_ci    objCallInfo->SetCallArg(1, key.GetTaggedValue());
15414514f5e3Sopenharmony_ci    objCallInfo->SetCallArg(2, attHandle.GetTaggedValue());
15424514f5e3Sopenharmony_ci
15434514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
15444514f5e3Sopenharmony_ci    JSTaggedValue result = BuiltinsObject::DefineProperty(objCallInfo);
15454514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
15464514f5e3Sopenharmony_ci
15474514f5e3Sopenharmony_ci    ASSERT_TRUE(result.IsECMAObject());
15484514f5e3Sopenharmony_ci    EXPECT_EQ(arr->GetArrayLength(), 2U);
15494514f5e3Sopenharmony_ci}
15504514f5e3Sopenharmony_ci
15514514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Some)
15524514f5e3Sopenharmony_ci{
15534514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
15544514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
15554514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVM->GetFactory();
15564514f5e3Sopenharmony_ci
15574514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
15584514f5e3Sopenharmony_ci    JSSharedArray *arr =
15594514f5e3Sopenharmony_ci        JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)).GetTaggedValue().GetTaggedObject());
15604514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
15614514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
15624514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj), lengthKeyHandle,
15634514f5e3Sopenharmony_ci                                         SCheckMode::SKIP).GetValue()->GetInt(), 0);
15644514f5e3Sopenharmony_ci
15654514f5e3Sopenharmony_ci    std::vector<int> descVals{1, 20, 3};
15664514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
15674514f5e3Sopenharmony_ci
15684514f5e3Sopenharmony_ci    JSHandle<JSSharedArray> jsSharedArray(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)));
15694514f5e3Sopenharmony_ci    JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestSomeFunc));
15704514f5e3Sopenharmony_ci
15714514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
15724514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
15734514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
15744514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, func.GetTaggedValue());
15754514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, jsSharedArray.GetTaggedValue());
15764514f5e3Sopenharmony_ci
15774514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
15784514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::Some(ecmaRuntimeCallInfo1);
15794514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
15804514f5e3Sopenharmony_ci    ASSERT_EQ(result2.GetRawData(), JSTaggedValue::True().GetRawData());
15814514f5e3Sopenharmony_ci}
15824514f5e3Sopenharmony_ci
15834514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, CheckAndCopyArray)
15844514f5e3Sopenharmony_ci{
15854514f5e3Sopenharmony_ci    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
15864514f5e3Sopenharmony_ci    JSHandle<TaggedArray> array(factory->NewCOWTaggedArray(2));
15874514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> val0(thread, JSTaggedValue(1));
15884514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> val1(thread, JSTaggedValue(2));
15894514f5e3Sopenharmony_ci    array->Set(thread, 0, val0);
15904514f5e3Sopenharmony_ci    array->Set(thread, 1, val1);
15914514f5e3Sopenharmony_ci
15924514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)) \
15934514f5e3Sopenharmony_ci                        .GetTaggedValue().GetTaggedObject());
15944514f5e3Sopenharmony_ci    JSHandle<JSObject> arrObj(thread, arr);
15954514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arrayH(arrObj);
15964514f5e3Sopenharmony_ci
15974514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
15984514f5e3Sopenharmony_ci    obj->SetElements(thread, array, SKIP_BARRIER);
15994514f5e3Sopenharmony_ci
16004514f5e3Sopenharmony_ci    JSHandle<JSSharedArray> jsSharedArray(arrayH);
16014514f5e3Sopenharmony_ci    JSSharedArray::CheckAndCopyArray(thread, jsSharedArray);
16024514f5e3Sopenharmony_ci    EXPECT_TRUE(arrayH->IsECMAObject());
16034514f5e3Sopenharmony_ci}
16044514f5e3Sopenharmony_ci
16054514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsSharedArrayTest, Every)
16064514f5e3Sopenharmony_ci{
16074514f5e3Sopenharmony_ci    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
16084514f5e3Sopenharmony_ci    auto ecmaVM = thread->GetEcmaVM();
16094514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
16104514f5e3Sopenharmony_ci
16114514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> lengthKeyHandle = thread->GlobalConstants()->GetHandledLengthString();
16124514f5e3Sopenharmony_ci    JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread,
16134514f5e3Sopenharmony_ci                                             JSTaggedNumber(0)).GetTaggedValue().GetTaggedObject());
16144514f5e3Sopenharmony_ci    EXPECT_TRUE(arr != nullptr);
16154514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(thread, arr);
16164514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArray::GetProperty(thread, JSHandle<JSTaggedValue>(obj),
16174514f5e3Sopenharmony_ci        lengthKeyHandle, SCheckMode::SKIP).GetValue()->GetInt(), 0);
16184514f5e3Sopenharmony_ci
16194514f5e3Sopenharmony_ci    std::vector<int> descVals{100, 200, 300};
16204514f5e3Sopenharmony_ci    auto keys = SharedArrayDefineOwnPropertyTest(thread, obj, descVals);
16214514f5e3Sopenharmony_ci
16224514f5e3Sopenharmony_ci    JSHandle<JSSharedArray> jsSharedArray(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0)));
16234514f5e3Sopenharmony_ci    JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestEveryFunc));
16244514f5e3Sopenharmony_ci
16254514f5e3Sopenharmony_ci    auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
16264514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
16274514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetThis(obj.GetTaggedValue());
16284514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(0, func.GetTaggedValue());
16294514f5e3Sopenharmony_ci    ecmaRuntimeCallInfo1->SetCallArg(1, jsSharedArray.GetTaggedValue());
16304514f5e3Sopenharmony_ci
16314514f5e3Sopenharmony_ci    [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
16324514f5e3Sopenharmony_ci    JSTaggedValue result2 = Array::Every(ecmaRuntimeCallInfo1);
16334514f5e3Sopenharmony_ci    TestHelper::TearDownFrame(thread, prev);
16344514f5e3Sopenharmony_ci
16354514f5e3Sopenharmony_ci    ASSERT_EQ(result2.GetRawData(), JSTaggedValue::True().GetRawData());
16364514f5e3Sopenharmony_ci    EXPECT_EQ(JSSharedArrayIterator::Next(ecmaRuntimeCallInfo1), JSTaggedValue::Exception());
16374514f5e3Sopenharmony_ci}
16384514f5e3Sopenharmony_ci
16394514f5e3Sopenharmony_ci}  // namespace panda::test
1640