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