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