14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2022 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 "builtin_test_util.h" 174514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_atomics.h" 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_array.h" 204514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_typedarray.h" 214514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_sharedarraybuffer.h" 224514f5e3Sopenharmony_ci#include "ecmascript/js_arraybuffer.h" 234514f5e3Sopenharmony_ci#include "ecmascript/base/atomic_helper.h" 244514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h" 254514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h" 264514f5e3Sopenharmony_ci#include "ecmascript/global_env.h" 274514f5e3Sopenharmony_ci#include "ecmascript/js_array.h" 284514f5e3Sopenharmony_ci#include "ecmascript/js_handle.h" 294514f5e3Sopenharmony_ci#include "ecmascript/js_thread.h" 304514f5e3Sopenharmony_ci#include "ecmascript/js_typed_array.h" 314514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h" 324514f5e3Sopenharmony_ci 334514f5e3Sopenharmony_ciusing namespace panda::ecmascript; 344514f5e3Sopenharmony_ciusing namespace panda::ecmascript::builtins; 354514f5e3Sopenharmony_ci 364514f5e3Sopenharmony_cinamespace panda::test { 374514f5e3Sopenharmony_ciusing TypedArray = ecmascript::builtins::BuiltinsTypedArray; 384514f5e3Sopenharmony_ciclass BuiltinsAtomicsTest : public BaseTestWithScope<false> { 394514f5e3Sopenharmony_ci}; 404514f5e3Sopenharmony_ci 414514f5e3Sopenharmony_ciJSTypedArray *CreateTypedArray(JSThread *thread, const JSHandle<TaggedArray> &array, DataViewType type) 424514f5e3Sopenharmony_ci{ 434514f5e3Sopenharmony_ci auto vm = thread->GetEcmaVM(); 444514f5e3Sopenharmony_ci auto env = vm->GetGlobalEnv(); 454514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> jsarray(JSArray::CreateArrayFromList(thread, array)); 464514f5e3Sopenharmony_ci JSHandle<JSObject> globalObject(thread, env->GetGlobalObject()); 474514f5e3Sopenharmony_ci JSHandle<JSFunction> arrayFunc; 484514f5e3Sopenharmony_ci JSTaggedValue result = JSTaggedValue::Hole(); 494514f5e3Sopenharmony_ci switch (type) { 504514f5e3Sopenharmony_ci case DataViewType::BIGINT64: { 514514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(env->GetBigInt64ArrayFunction()); 524514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*arrayFunc), 6); 534514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*arrayFunc)); 544514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 554514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, jsarray.GetTaggedValue()); 564514f5e3Sopenharmony_ci 574514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 584514f5e3Sopenharmony_ci result = TypedArray::BigInt64ArrayConstructor(ecmaRuntimeCallInfo1); 594514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 604514f5e3Sopenharmony_ci break; 614514f5e3Sopenharmony_ci } 624514f5e3Sopenharmony_ci case DataViewType::BIGUINT64: { 634514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(env->GetBigUint64ArrayFunction()); 644514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*arrayFunc), 6); 654514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*arrayFunc)); 664514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 674514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, jsarray.GetTaggedValue()); 684514f5e3Sopenharmony_ci 694514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 704514f5e3Sopenharmony_ci result = TypedArray::BigUint64ArrayConstructor(ecmaRuntimeCallInfo1); 714514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 724514f5e3Sopenharmony_ci break; 734514f5e3Sopenharmony_ci } 744514f5e3Sopenharmony_ci case DataViewType::INT16: { 754514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(env->GetInt16ArrayFunction()); 764514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*arrayFunc), 6); 774514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*arrayFunc)); 784514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 794514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, jsarray.GetTaggedValue()); 804514f5e3Sopenharmony_ci 814514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 824514f5e3Sopenharmony_ci result = TypedArray::Int16ArrayConstructor(ecmaRuntimeCallInfo1); 834514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 844514f5e3Sopenharmony_ci break; 854514f5e3Sopenharmony_ci } 864514f5e3Sopenharmony_ci case DataViewType::INT32: { 874514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(env->GetInt32ArrayFunction()); 884514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*arrayFunc), 6); 894514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*arrayFunc)); 904514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 914514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, jsarray.GetTaggedValue()); 924514f5e3Sopenharmony_ci 934514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 944514f5e3Sopenharmony_ci result = TypedArray::Int32ArrayConstructor(ecmaRuntimeCallInfo1); 954514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 964514f5e3Sopenharmony_ci break; 974514f5e3Sopenharmony_ci } 984514f5e3Sopenharmony_ci case DataViewType::INT8: { 994514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(env->GetInt8ArrayFunction()); 1004514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*arrayFunc), 6); 1014514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*arrayFunc)); 1024514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 1034514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, jsarray.GetTaggedValue()); 1044514f5e3Sopenharmony_ci 1054514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 1064514f5e3Sopenharmony_ci result = TypedArray::Int8ArrayConstructor(ecmaRuntimeCallInfo1); 1074514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 1084514f5e3Sopenharmony_ci break; 1094514f5e3Sopenharmony_ci } 1104514f5e3Sopenharmony_ci case DataViewType::UINT16: { 1114514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(env->GetUint16ArrayFunction()); 1124514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*arrayFunc), 6); 1134514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*arrayFunc)); 1144514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 1154514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, jsarray.GetTaggedValue()); 1164514f5e3Sopenharmony_ci 1174514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 1184514f5e3Sopenharmony_ci result = TypedArray::Uint16ArrayConstructor(ecmaRuntimeCallInfo1); 1194514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 1204514f5e3Sopenharmony_ci break; 1214514f5e3Sopenharmony_ci } 1224514f5e3Sopenharmony_ci case DataViewType::UINT32: { 1234514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(env->GetUint32ArrayFunction()); 1244514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*arrayFunc), 6); 1254514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*arrayFunc)); 1264514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 1274514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, jsarray.GetTaggedValue()); 1284514f5e3Sopenharmony_ci 1294514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 1304514f5e3Sopenharmony_ci result = TypedArray::Uint32ArrayConstructor(ecmaRuntimeCallInfo1); 1314514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 1324514f5e3Sopenharmony_ci break; 1334514f5e3Sopenharmony_ci } 1344514f5e3Sopenharmony_ci case DataViewType::UINT8: { 1354514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(env->GetUint8ArrayFunction()); 1364514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*arrayFunc), 6); 1374514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*arrayFunc)); 1384514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 1394514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, jsarray.GetTaggedValue()); 1404514f5e3Sopenharmony_ci 1414514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 1424514f5e3Sopenharmony_ci result = TypedArray::Uint8ArrayConstructor(ecmaRuntimeCallInfo1); 1434514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 1444514f5e3Sopenharmony_ci break; 1454514f5e3Sopenharmony_ci } 1464514f5e3Sopenharmony_ci default: { 1474514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> undefined(thread, JSTaggedValue::Undefined()); 1484514f5e3Sopenharmony_ci arrayFunc = JSHandle<JSFunction>(undefined); 1494514f5e3Sopenharmony_ci break; 1504514f5e3Sopenharmony_ci } 1514514f5e3Sopenharmony_ci } 1524514f5e3Sopenharmony_ci EXPECT_TRUE(result.IsECMAObject()); 1534514f5e3Sopenharmony_ci JSTypedArray *arr = JSTypedArray::Cast(reinterpret_cast<TaggedObject *>(result.GetRawData())); 1544514f5e3Sopenharmony_ci return arr; 1554514f5e3Sopenharmony_ci} 1564514f5e3Sopenharmony_ci 1574514f5e3Sopenharmony_ciJSTypedArray *CreateInt32TypedArray(JSThread *thread, const JSHandle<JSArrayBuffer> &arrBuf) 1584514f5e3Sopenharmony_ci{ 1594514f5e3Sopenharmony_ci auto ecmaVM = thread->GetEcmaVM(); 1604514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv(); 1614514f5e3Sopenharmony_ci 1624514f5e3Sopenharmony_ci JSHandle<JSFunction> int32_array(env->GetInt32ArrayFunction()); 1634514f5e3Sopenharmony_ci JSHandle<JSObject> globalObject(thread, env->GetGlobalObject()); 1644514f5e3Sopenharmony_ci // 6 : test case 1654514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*int32_array), 6); 1664514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue(*int32_array)); 1674514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetThis(JSTaggedValue(*globalObject)); 1684514f5e3Sopenharmony_ci ecmaRuntimeCallInfo1->SetCallArg(0, arrBuf.GetTaggedValue()); 1694514f5e3Sopenharmony_ci 1704514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1); 1714514f5e3Sopenharmony_ci JSTaggedValue result = TypedArray::Int32ArrayConstructor(ecmaRuntimeCallInfo1); 1724514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 1734514f5e3Sopenharmony_ci 1744514f5e3Sopenharmony_ci EXPECT_TRUE(result.IsECMAObject()); 1754514f5e3Sopenharmony_ci JSTypedArray *int32arr = JSTypedArray::Cast(reinterpret_cast<TaggedObject *>(result.GetRawData())); 1764514f5e3Sopenharmony_ci return int32arr; 1774514f5e3Sopenharmony_ci} 1784514f5e3Sopenharmony_ci 1794514f5e3Sopenharmony_cienum class AlgorithmType { 1804514f5e3Sopenharmony_ci ALGORITHM_AND, 1814514f5e3Sopenharmony_ci ALGORITHM_ADD, 1824514f5e3Sopenharmony_ci ALGORITHM_SUB, 1834514f5e3Sopenharmony_ci ALGORITHM_OR, 1844514f5e3Sopenharmony_ci ALGORITHM_XOR, 1854514f5e3Sopenharmony_ci ALGORITHM_LOAD, 1864514f5e3Sopenharmony_ci ALGORITHM_STORE, 1874514f5e3Sopenharmony_ci ALGORITHM_WAIT, 1884514f5e3Sopenharmony_ci ALGORITHM_NOTIFY, 1894514f5e3Sopenharmony_ci ALGORITHM_EXCHANGE, 1904514f5e3Sopenharmony_ci ALGORITHM_COMP_EXCHANGE, 1914514f5e3Sopenharmony_ci}; 1924514f5e3Sopenharmony_ci 1934514f5e3Sopenharmony_cistatic JSTaggedValue AtomicsAlgorithm(JSThread *thread, JSHandle<JSTaggedValue>& obj, std::vector<int32_t>& vals, 1944514f5e3Sopenharmony_ci uint32_t argLen = 8, AlgorithmType type = AlgorithmType::ALGORITHM_LOAD) 1954514f5e3Sopenharmony_ci{ 1964514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfos = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), argLen); 1974514f5e3Sopenharmony_ci ecmaRuntimeCallInfos->SetFunction(JSTaggedValue::Undefined()); 1984514f5e3Sopenharmony_ci ecmaRuntimeCallInfos->SetThis(JSTaggedValue::Undefined()); 1994514f5e3Sopenharmony_ci ecmaRuntimeCallInfos->SetCallArg(0, obj.GetTaggedValue()); 2004514f5e3Sopenharmony_ci for (size_t i = 0; i < vals.size(); i++) { 2014514f5e3Sopenharmony_ci ecmaRuntimeCallInfos->SetCallArg(i+1, JSTaggedValue(vals[i])); 2024514f5e3Sopenharmony_ci } 2034514f5e3Sopenharmony_ci auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfos); 2044514f5e3Sopenharmony_ci JSTaggedValue result; 2054514f5e3Sopenharmony_ci switch (type) { 2064514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_AND: 2074514f5e3Sopenharmony_ci result = BuiltinsAtomics::And(ecmaRuntimeCallInfos); 2084514f5e3Sopenharmony_ci break; 2094514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_ADD: 2104514f5e3Sopenharmony_ci result = BuiltinsAtomics::Add(ecmaRuntimeCallInfos); 2114514f5e3Sopenharmony_ci break; 2124514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_SUB: 2134514f5e3Sopenharmony_ci result = BuiltinsAtomics::Sub(ecmaRuntimeCallInfos); 2144514f5e3Sopenharmony_ci break; 2154514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_LOAD: 2164514f5e3Sopenharmony_ci result = BuiltinsAtomics::Load(ecmaRuntimeCallInfos); 2174514f5e3Sopenharmony_ci break; 2184514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_STORE: 2194514f5e3Sopenharmony_ci result = BuiltinsAtomics::Store(ecmaRuntimeCallInfos); 2204514f5e3Sopenharmony_ci break; 2214514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_COMP_EXCHANGE: 2224514f5e3Sopenharmony_ci result = BuiltinsAtomics::CompareExchange(ecmaRuntimeCallInfos); 2234514f5e3Sopenharmony_ci break; 2244514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_EXCHANGE: 2254514f5e3Sopenharmony_ci result = BuiltinsAtomics::Exchange(ecmaRuntimeCallInfos); 2264514f5e3Sopenharmony_ci break; 2274514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_OR: 2284514f5e3Sopenharmony_ci result = BuiltinsAtomics::Or(ecmaRuntimeCallInfos); 2294514f5e3Sopenharmony_ci break; 2304514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_XOR: 2314514f5e3Sopenharmony_ci result = BuiltinsAtomics::Xor(ecmaRuntimeCallInfos); 2324514f5e3Sopenharmony_ci break; 2334514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_WAIT: 2344514f5e3Sopenharmony_ci result = BuiltinsAtomics::Wait(ecmaRuntimeCallInfos); 2354514f5e3Sopenharmony_ci break; 2364514f5e3Sopenharmony_ci case AlgorithmType::ALGORITHM_NOTIFY: 2374514f5e3Sopenharmony_ci result = BuiltinsAtomics::Notify(ecmaRuntimeCallInfos); 2384514f5e3Sopenharmony_ci break; 2394514f5e3Sopenharmony_ci default: 2404514f5e3Sopenharmony_ci break; 2414514f5e3Sopenharmony_ci } 2424514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 2434514f5e3Sopenharmony_ci return result; 2444514f5e3Sopenharmony_ci} 2454514f5e3Sopenharmony_ci 2464514f5e3Sopenharmony_cistatic JSHandle<TaggedArray> CreateArrayList(JSThread *thread, std::vector<int32_t> vals, size_t maxLen) 2474514f5e3Sopenharmony_ci{ 2484514f5e3Sopenharmony_ci ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); 2494514f5e3Sopenharmony_ci JSHandle<TaggedArray> array(factory->NewTaggedArray(maxLen)); 2504514f5e3Sopenharmony_ci for (size_t i = 0; i < vals.size(); i++) { 2514514f5e3Sopenharmony_ci array->Set(thread, i, JSTaggedValue(vals[i])); 2524514f5e3Sopenharmony_ci } 2534514f5e3Sopenharmony_ci return array; 2544514f5e3Sopenharmony_ci} 2554514f5e3Sopenharmony_ci 2564514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Add_1) 2574514f5e3Sopenharmony_ci{ 2584514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 2594514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{7, 8, 9}; 2604514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, 3); 2614514f5e3Sopenharmony_ci 2624514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, DataViewType::UINT8)); 2634514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 5}; 2644514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_ADD); 2654514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 7); 2664514f5e3Sopenharmony_ci} 2674514f5e3Sopenharmony_ci 2684514f5e3Sopenharmony_cistatic JSTaggedValue AddCommon(JSThread *thread, DataViewType type, JSHandle<JSTaggedValue>& obj) 2694514f5e3Sopenharmony_ci{ 2704514f5e3Sopenharmony_ci ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); 2714514f5e3Sopenharmony_ci JSHandle<TaggedArray> array(factory->NewTaggedArray(10)); // 10: array len 2724514f5e3Sopenharmony_ci 2734514f5e3Sopenharmony_ci obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, type)); 2744514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 2754514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_ADD); 2764514f5e3Sopenharmony_ci return result; 2774514f5e3Sopenharmony_ci} 2784514f5e3Sopenharmony_ci 2794514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Add_2) 2804514f5e3Sopenharmony_ci{ 2814514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 2824514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj; 2834514f5e3Sopenharmony_ci auto result = AddCommon(thread, DataViewType::INT8, obj); 2844514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 0); 2854514f5e3Sopenharmony_ci} 2864514f5e3Sopenharmony_ci 2874514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Add_3) 2884514f5e3Sopenharmony_ci{ 2894514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 2904514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj; 2914514f5e3Sopenharmony_ci auto result = AddCommon(thread, DataViewType::UINT16, obj); 2924514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 0); 2934514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 2944514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_ADD); 2954514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 2); 2964514f5e3Sopenharmony_ci} 2974514f5e3Sopenharmony_ci 2984514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, SubAndAdd_1) 2994514f5e3Sopenharmony_ci{ 3004514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 3014514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 0, 0}; 3024514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 3034514f5e3Sopenharmony_ci 3044514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, DataViewType::INT16)); 3054514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10); 3064514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined()); 3074514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined()); 3084514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(0, obj.GetTaggedValue()); 3094514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(0))); 3104514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(2, JSTaggedValue(static_cast<int32_t>(2))); 3114514f5e3Sopenharmony_ci 3124514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); 3134514f5e3Sopenharmony_ci BuiltinsAtomics::Sub(ecmaRuntimeCallInfo); 3144514f5e3Sopenharmony_ci JSTaggedValue addResult = BuiltinsAtomics::Add(ecmaRuntimeCallInfo); 3154514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 3164514f5e3Sopenharmony_ci ASSERT_EQ(addResult.GetInt(), 3); 3174514f5e3Sopenharmony_ci} 3184514f5e3Sopenharmony_ci 3194514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, And_1) 3204514f5e3Sopenharmony_ci{ 3214514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 3224514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{7, 0, 0}; 3234514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, 10); 3244514f5e3Sopenharmony_ci 3254514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, DataViewType::INT32)); 3264514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 3274514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_AND); 3284514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 7); 3294514f5e3Sopenharmony_ci} 3304514f5e3Sopenharmony_ci 3314514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, And_2) 3324514f5e3Sopenharmony_ci{ 3334514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 3344514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{7, 0, 0}; 3354514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, 10); 3364514f5e3Sopenharmony_ci 3374514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, 3384514f5e3Sopenharmony_ci DataViewType::UINT32)); 3394514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 3404514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_AND); 3414514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 7); 3424514f5e3Sopenharmony_ci 3434514f5e3Sopenharmony_ci std::vector<int32_t> storeVals{0}; 3444514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, storeVals, 8, AlgorithmType::ALGORITHM_LOAD); 3454514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 2); 3464514f5e3Sopenharmony_ci} 3474514f5e3Sopenharmony_ci 3484514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, CompareExchange_1) 3494514f5e3Sopenharmony_ci{ 3504514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 3514514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 0, 0}; 3524514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 3534514f5e3Sopenharmony_ci 3544514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, DataViewType::UINT8)); 3554514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 5, 2}; 3564514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_COMP_EXCHANGE); 3574514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 5); 3584514f5e3Sopenharmony_ci} 3594514f5e3Sopenharmony_ci 3604514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, CompareExchange_2) 3614514f5e3Sopenharmony_ci{ 3624514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 3634514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 0, 0}; 3644514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 3654514f5e3Sopenharmony_ci 3664514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, DataViewType::INT8)); 3674514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 5, 2}; 3684514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_COMP_EXCHANGE); 3694514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 5); 3704514f5e3Sopenharmony_ci 3714514f5e3Sopenharmony_ci std::vector<int32_t> loadVals{0}; 3724514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, loadVals, 8, AlgorithmType::ALGORITHM_LOAD); 3734514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 2); 3744514f5e3Sopenharmony_ci} 3754514f5e3Sopenharmony_ci 3764514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, TypedArrayCover) 3774514f5e3Sopenharmony_ci{ 3784514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 3794514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{2, 0, 0}; 3804514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 3814514f5e3Sopenharmony_ci // UINT16 3824514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, 3834514f5e3Sopenharmony_ci DataViewType::UINT16)); 3844514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2, 2}; 3854514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_COMP_EXCHANGE); 3864514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 2); 3874514f5e3Sopenharmony_ci // INT16 3884514f5e3Sopenharmony_ci obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, DataViewType::INT16)); 3894514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_COMP_EXCHANGE); 3904514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 2); 3914514f5e3Sopenharmony_ci // UINT32 3924514f5e3Sopenharmony_ci obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, DataViewType::UINT32)); 3934514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_COMP_EXCHANGE); 3944514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 2); 3954514f5e3Sopenharmony_ci // INT32 3964514f5e3Sopenharmony_ci obj = JSHandle<JSTaggedValue>(thread, CreateTypedArray(thread, array, DataViewType::INT32)); 3974514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_COMP_EXCHANGE); 3984514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 2); 3994514f5e3Sopenharmony_ci 4004514f5e3Sopenharmony_ci // Detached Buffer 4014514f5e3Sopenharmony_ci JSTaggedValue tagged = BuiltTestUtil::CreateBuiltinsSharedArrayBuffer(thread, 0); 4024514f5e3Sopenharmony_ci JSHandle<JSArrayBuffer> arrBuf(thread, JSArrayBuffer::Cast(reinterpret_cast<TaggedObject *>(tagged.GetRawData()))); 4034514f5e3Sopenharmony_ci obj = JSHandle<JSTaggedValue>(thread, CreateInt32TypedArray(thread, arrBuf)); 4044514f5e3Sopenharmony_ci arrBuf->SetArrayBufferData(thread, JSTaggedValue::Null()); 4054514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_COMP_EXCHANGE); 4064514f5e3Sopenharmony_ci EXPECT_TRUE(thread->HasPendingException()); 4074514f5e3Sopenharmony_ci EXPECT_EQ(result, JSTaggedValue::Exception()); 4084514f5e3Sopenharmony_ci thread->ClearException(); 4094514f5e3Sopenharmony_ci} 4104514f5e3Sopenharmony_ci 4114514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Exchange_1) 4124514f5e3Sopenharmony_ci{ 4134514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 4144514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{3, 0, 0}; 4154514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 4164514f5e3Sopenharmony_ci 4174514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 4184514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 6}; 4194514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_EXCHANGE); 4204514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 3); 4214514f5e3Sopenharmony_ci} 4224514f5e3Sopenharmony_ci 4234514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Exchange_2) 4244514f5e3Sopenharmony_ci{ 4254514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 4264514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{3, 0, 0}; 4274514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 4284514f5e3Sopenharmony_ci 4294514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 4304514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 6}; 4314514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_EXCHANGE); 4324514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 3); 4334514f5e3Sopenharmony_ci 4344514f5e3Sopenharmony_ci std::vector<int32_t> loadVals{0}; 4354514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, loadVals, 8, AlgorithmType::ALGORITHM_LOAD); 4364514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 6); 4374514f5e3Sopenharmony_ci} 4384514f5e3Sopenharmony_ci 4394514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Or_1) 4404514f5e3Sopenharmony_ci{ 4414514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 4424514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 0, 0}; 4434514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 4444514f5e3Sopenharmony_ci 4454514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 4464514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 4474514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_OR); 4484514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 5); 4494514f5e3Sopenharmony_ci} 4504514f5e3Sopenharmony_ci 4514514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Or_2) 4524514f5e3Sopenharmony_ci{ 4534514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 4544514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 0, 0}; 4554514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 4564514f5e3Sopenharmony_ci 4574514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 4584514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 4594514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_OR); 4604514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 5); 4614514f5e3Sopenharmony_ci 4624514f5e3Sopenharmony_ci std::vector<int32_t> loadVals{0}; 4634514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, loadVals, 8, AlgorithmType::ALGORITHM_LOAD); 4644514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 7); 4654514f5e3Sopenharmony_ci} 4664514f5e3Sopenharmony_ci 4674514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Sub_1) 4684514f5e3Sopenharmony_ci{ 4694514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 4704514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 0, 0}; 4714514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 4724514f5e3Sopenharmony_ci 4734514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 4744514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 4754514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_SUB); 4764514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 5); 4774514f5e3Sopenharmony_ci} 4784514f5e3Sopenharmony_ci 4794514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Sub_2) 4804514f5e3Sopenharmony_ci{ 4814514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 4824514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{0, 5, 0}; 4834514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 4844514f5e3Sopenharmony_ci 4854514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 4864514f5e3Sopenharmony_ci std::vector<int32_t> vals{1, 2}; 4874514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_SUB); 4884514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 5); 4894514f5e3Sopenharmony_ci 4904514f5e3Sopenharmony_ci std::vector<int32_t> loadVals{1}; 4914514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, loadVals, 8, AlgorithmType::ALGORITHM_LOAD); 4924514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 3); 4934514f5e3Sopenharmony_ci} 4944514f5e3Sopenharmony_ci 4954514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Xor_1) 4964514f5e3Sopenharmony_ci{ 4974514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 4984514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 7, 0}; 4994514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 5004514f5e3Sopenharmony_ci 5014514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 5024514f5e3Sopenharmony_ci std::vector<int32_t> vals{1, 2}; 5034514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_XOR); 5044514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 7); 5054514f5e3Sopenharmony_ci} 5064514f5e3Sopenharmony_ci 5074514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Xor_2) 5084514f5e3Sopenharmony_ci{ 5094514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 5104514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 7, 0}; 5114514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 5124514f5e3Sopenharmony_ci 5134514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 5144514f5e3Sopenharmony_ci std::vector<int32_t> vals{1, 2}; 5154514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_XOR); 5164514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 7); 5174514f5e3Sopenharmony_ci 5184514f5e3Sopenharmony_ci std::vector<int32_t> loadVals{1}; 5194514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, loadVals, 8, AlgorithmType::ALGORITHM_LOAD); 5204514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 5); 5214514f5e3Sopenharmony_ci} 5224514f5e3Sopenharmony_ci 5234514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, IsLockFree_1) 5244514f5e3Sopenharmony_ci{ 5254514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); 5264514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined()); 5274514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined()); 5284514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1))); 5294514f5e3Sopenharmony_ci 5304514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); 5314514f5e3Sopenharmony_ci JSTaggedValue result = BuiltinsAtomics::IsLockFree(ecmaRuntimeCallInfo); 5324514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 5334514f5e3Sopenharmony_ci ASSERT_TRUE(result.ToBoolean()); 5344514f5e3Sopenharmony_ci} 5354514f5e3Sopenharmony_ci 5364514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, IsLockFree_2) 5374514f5e3Sopenharmony_ci{ 5384514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); 5394514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined()); 5404514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined()); 5414514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(2))); 5424514f5e3Sopenharmony_ci 5434514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); 5444514f5e3Sopenharmony_ci JSTaggedValue result = BuiltinsAtomics::IsLockFree(ecmaRuntimeCallInfo); 5454514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 5464514f5e3Sopenharmony_ci ASSERT_TRUE(result.ToBoolean()); 5474514f5e3Sopenharmony_ci} 5484514f5e3Sopenharmony_ci 5494514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, IsLockFree_3) 5504514f5e3Sopenharmony_ci{ 5514514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); 5524514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined()); 5534514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined()); 5544514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(4))); 5554514f5e3Sopenharmony_ci 5564514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); 5574514f5e3Sopenharmony_ci JSTaggedValue result = BuiltinsAtomics::IsLockFree(ecmaRuntimeCallInfo); 5584514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 5594514f5e3Sopenharmony_ci ASSERT_TRUE(result.ToBoolean()); 5604514f5e3Sopenharmony_ci} 5614514f5e3Sopenharmony_ci 5624514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, IsLockFree_4) 5634514f5e3Sopenharmony_ci{ 5644514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); 5654514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined()); 5664514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined()); 5674514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(-3))); 5684514f5e3Sopenharmony_ci 5694514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); 5704514f5e3Sopenharmony_ci JSTaggedValue result = BuiltinsAtomics::IsLockFree(ecmaRuntimeCallInfo); 5714514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 5724514f5e3Sopenharmony_ci ASSERT_FALSE(result.ToBoolean()); 5734514f5e3Sopenharmony_ci} 5744514f5e3Sopenharmony_ci 5754514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, IsLockFree_5) 5764514f5e3Sopenharmony_ci{ 5774514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); 5784514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined()); 5794514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined()); 5804514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(8))); 5814514f5e3Sopenharmony_ci 5824514f5e3Sopenharmony_ci [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); 5834514f5e3Sopenharmony_ci JSTaggedValue result = BuiltinsAtomics::IsLockFree(ecmaRuntimeCallInfo); 5844514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 5854514f5e3Sopenharmony_ci ASSERT_TRUE(result.ToBoolean()); 5864514f5e3Sopenharmony_ci} 5874514f5e3Sopenharmony_ci 5884514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Store_1) 5894514f5e3Sopenharmony_ci{ 5904514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 5914514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 6, 7}; 5924514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 5934514f5e3Sopenharmony_ci 5944514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 5954514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 5964514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_STORE); 5974514f5e3Sopenharmony_ci ASSERT_EQ(result.GetDouble(), 2); 5984514f5e3Sopenharmony_ci} 5994514f5e3Sopenharmony_ci 6004514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Store_2) 6014514f5e3Sopenharmony_ci{ 6024514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 6034514f5e3Sopenharmony_ci std::vector<int32_t> arrVals{5, 6, 7}; 6044514f5e3Sopenharmony_ci auto array = CreateArrayList(thread, arrVals, arrVals.size()); 6054514f5e3Sopenharmony_ci 6064514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, BuiltTestUtil::CreateTypedArray(thread, array)); 6074514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 6084514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_STORE); 6094514f5e3Sopenharmony_ci ASSERT_EQ(result.GetDouble(), 2); 6104514f5e3Sopenharmony_ci 6114514f5e3Sopenharmony_ci std::vector<int32_t> addVals{0}; 6124514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, addVals, 8, AlgorithmType::ALGORITHM_ADD); 6134514f5e3Sopenharmony_ci ASSERT_EQ(result.GetInt(), 2); 6144514f5e3Sopenharmony_ci} 6154514f5e3Sopenharmony_ci 6164514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Wait) 6174514f5e3Sopenharmony_ci{ 6184514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 6194514f5e3Sopenharmony_ci JSTaggedValue tagged = BuiltTestUtil::CreateBuiltinsSharedArrayBuffer(thread, 4); 6204514f5e3Sopenharmony_ci JSHandle<JSArrayBuffer> arrBuf(thread, JSArrayBuffer::Cast(reinterpret_cast<TaggedObject *>(tagged.GetRawData()))); 6214514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateInt32TypedArray(thread, arrBuf)); 6224514f5e3Sopenharmony_ci 6234514f5e3Sopenharmony_ci // Not Equal 6244514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2, 2}; 6254514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_WAIT); // 12 : arg max len 6264514f5e3Sopenharmony_ci ASSERT_EQ(result, thread->GlobalConstants()->GetNotEqualString()); 6274514f5e3Sopenharmony_ci 6284514f5e3Sopenharmony_ci // timeout 6294514f5e3Sopenharmony_ci vals[1] = 0; 6304514f5e3Sopenharmony_ci vals[2] = 100; 6314514f5e3Sopenharmony_ci result = AtomicsAlgorithm(thread, obj, vals, 12, AlgorithmType::ALGORITHM_WAIT); // 12 : arg max len 6324514f5e3Sopenharmony_ci ASSERT_EQ(result, thread->GlobalConstants()->GetTimeoutString()); 6334514f5e3Sopenharmony_ci} 6344514f5e3Sopenharmony_ci 6354514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsAtomicsTest, Notify) 6364514f5e3Sopenharmony_ci{ 6374514f5e3Sopenharmony_ci ASSERT_NE(thread, nullptr); 6384514f5e3Sopenharmony_ci JSTaggedValue tagged = BuiltTestUtil::CreateBuiltinsSharedArrayBuffer(thread, 4); 6394514f5e3Sopenharmony_ci JSHandle<JSArrayBuffer> arrBuf(thread, JSArrayBuffer::Cast(reinterpret_cast<TaggedObject *>(tagged.GetRawData()))); 6404514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(thread, CreateInt32TypedArray(thread, arrBuf)); 6414514f5e3Sopenharmony_ci 6424514f5e3Sopenharmony_ci std::vector<int32_t> vals{0, 2}; 6434514f5e3Sopenharmony_ci auto result = AtomicsAlgorithm(thread, obj, vals, 10, AlgorithmType::ALGORITHM_NOTIFY); 6444514f5e3Sopenharmony_ci ASSERT_EQ(result, JSTaggedValue(0)); 6454514f5e3Sopenharmony_ci} 6464514f5e3Sopenharmony_ci} 647