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