14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 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 <cstddef>
174514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins.h"
184514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_function.h"
194514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_object.h"
204514f5e3Sopenharmony_ci#include "ecmascript/compiler/aot_file/an_file_data_manager.h"
214514f5e3Sopenharmony_ci#include "ecmascript/compiler/aot_file/aot_file_manager.h"
224514f5e3Sopenharmony_ci#include "ecmascript/compiler/circuit_builder_helper.h"
234514f5e3Sopenharmony_ci#include "ecmascript/deoptimizer/deoptimizer.h"
244514f5e3Sopenharmony_ci#include "ecmascript/ecma_global_storage.h"
254514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h"
264514f5e3Sopenharmony_ci#include "ecmascript/global_env.h"
274514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_tree_map.h"
284514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_tree_set.h"
294514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_vector.h"
304514f5e3Sopenharmony_ci#include "ecmascript/js_array.h"
314514f5e3Sopenharmony_ci#include "ecmascript/js_bigint.h"
324514f5e3Sopenharmony_ci#include "ecmascript/js_date_time_format.h"
334514f5e3Sopenharmony_ci#include "ecmascript/js_generator_object.h"
344514f5e3Sopenharmony_ci#include "ecmascript/js_map.h"
354514f5e3Sopenharmony_ci#include "ecmascript/js_map_iterator.h"
364514f5e3Sopenharmony_ci#include "ecmascript/js_primitive_ref.h"
374514f5e3Sopenharmony_ci#include "ecmascript/js_regexp.h"
384514f5e3Sopenharmony_ci#include "ecmascript/js_runtime_options.h"
394514f5e3Sopenharmony_ci#include "ecmascript/js_set.h"
404514f5e3Sopenharmony_ci#include "ecmascript/js_set_iterator.h"
414514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h"
424514f5e3Sopenharmony_ci#include "ecmascript/js_thread.h"
434514f5e3Sopenharmony_ci#include "ecmascript/js_weak_container.h"
444514f5e3Sopenharmony_ci#include "ecmascript/linked_hash_table.h"
454514f5e3Sopenharmony_ci#include "ecmascript/mem/mem_map_allocator.h"
464514f5e3Sopenharmony_ci#include "ecmascript/module/js_module_manager.h"
474514f5e3Sopenharmony_ci#include "ecmascript/module/js_module_source_text.h"
484514f5e3Sopenharmony_ci#include "ecmascript/napi/include/jsnapi.h"
494514f5e3Sopenharmony_ci#include "ecmascript/napi/include/jsnapi_internals.h"
504514f5e3Sopenharmony_ci#include "ecmascript/napi/jsnapi_helper.h"
514514f5e3Sopenharmony_ci#include "ecmascript/object_factory.h"
524514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler.h"
534514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler_decoder.h"
544514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler_encoder.h"
554514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler_manager.h"
564514f5e3Sopenharmony_ci#include "ecmascript/tagged_array.h"
574514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h"
584514f5e3Sopenharmony_ci#include "ecmascript/tagged_tree.h"
594514f5e3Sopenharmony_ci#include "ecmascript/weak_vector.h"
604514f5e3Sopenharmony_ci#include "gtest/gtest.h"
614514f5e3Sopenharmony_ci
624514f5e3Sopenharmony_ciusing namespace panda;
634514f5e3Sopenharmony_ciusing namespace panda::ecmascript;
644514f5e3Sopenharmony_ciusing namespace panda::ecmascript::kungfu;
654514f5e3Sopenharmony_ci
664514f5e3Sopenharmony_cistatic constexpr char16_t UTF_16[] = u"This is a char16 array";
674514f5e3Sopenharmony_cistatic constexpr const char *DUPLICATE_KEY = "duplicateKey";
684514f5e3Sopenharmony_cistatic constexpr const char *SIMPLE_KEY = "simpleKey";
694514f5e3Sopenharmony_cinamespace panda::test {
704514f5e3Sopenharmony_ciusing BuiltinsFunction = ecmascript::builtins::BuiltinsFunction;
714514f5e3Sopenharmony_ciusing PGOProfilerManager = panda::ecmascript::pgo::PGOProfilerManager;
724514f5e3Sopenharmony_ciusing FunctionForRef = Local<JSValueRef> (*)(JsiRuntimeCallInfo *);
734514f5e3Sopenharmony_ciclass JSNApiTests : public testing::Test {
744514f5e3Sopenharmony_cipublic:
754514f5e3Sopenharmony_ci    static void SetUpTestCase()
764514f5e3Sopenharmony_ci    {
774514f5e3Sopenharmony_ci        GTEST_LOG_(INFO) << "SetUpTestCase";
784514f5e3Sopenharmony_ci    }
794514f5e3Sopenharmony_ci
804514f5e3Sopenharmony_ci    static void TearDownTestCase()
814514f5e3Sopenharmony_ci    {
824514f5e3Sopenharmony_ci        GTEST_LOG_(INFO) << "TearDownCase";
834514f5e3Sopenharmony_ci    }
844514f5e3Sopenharmony_ci
854514f5e3Sopenharmony_ci    void SetUp() override
864514f5e3Sopenharmony_ci    {
874514f5e3Sopenharmony_ci        RuntimeOption option;
884514f5e3Sopenharmony_ci        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
894514f5e3Sopenharmony_ci        vm_ = JSNApi::CreateJSVM(option);
904514f5e3Sopenharmony_ci        ASSERT_TRUE(vm_ != nullptr) << "Cannot create Runtime";
914514f5e3Sopenharmony_ci        thread_ = vm_->GetJSThread();
924514f5e3Sopenharmony_ci        vm_->SetEnableForceGC(true);
934514f5e3Sopenharmony_ci        thread_->ManagedCodeBegin();
944514f5e3Sopenharmony_ci    }
954514f5e3Sopenharmony_ci
964514f5e3Sopenharmony_ci    void TearDown() override
974514f5e3Sopenharmony_ci    {
984514f5e3Sopenharmony_ci        thread_->ManagedCodeEnd();
994514f5e3Sopenharmony_ci        vm_->SetEnableForceGC(false);
1004514f5e3Sopenharmony_ci        JSNApi::DestroyJSVM(vm_);
1014514f5e3Sopenharmony_ci    }
1024514f5e3Sopenharmony_ci
1034514f5e3Sopenharmony_ci    template <typename T> void TestNumberRef(T val, TaggedType expected)
1044514f5e3Sopenharmony_ci    {
1054514f5e3Sopenharmony_ci        LocalScope scope(vm_);
1064514f5e3Sopenharmony_ci        Local<NumberRef> obj = NumberRef::New(vm_, val);
1074514f5e3Sopenharmony_ci        ASSERT_TRUE(obj->IsNumber());
1084514f5e3Sopenharmony_ci        JSTaggedType res = JSNApiHelper::ToJSTaggedValue(*obj).GetRawData();
1094514f5e3Sopenharmony_ci        ASSERT_EQ(res, expected);
1104514f5e3Sopenharmony_ci        if constexpr (std::is_floating_point_v<T>) {
1114514f5e3Sopenharmony_ci            if (std::isnan(val)) {
1124514f5e3Sopenharmony_ci                ASSERT_TRUE(std::isnan(obj->Value()));
1134514f5e3Sopenharmony_ci            } else {
1144514f5e3Sopenharmony_ci                ASSERT_EQ(obj->Value(), val);
1154514f5e3Sopenharmony_ci            }
1164514f5e3Sopenharmony_ci        } else if constexpr (sizeof(T) >= sizeof(int32_t)) {
1174514f5e3Sopenharmony_ci            ASSERT_EQ(obj->IntegerValue(vm_), val);
1184514f5e3Sopenharmony_ci        } else if constexpr (std::is_signed_v<T>) {
1194514f5e3Sopenharmony_ci            ASSERT_EQ(obj->Int32Value(vm_), val);
1204514f5e3Sopenharmony_ci        } else {
1214514f5e3Sopenharmony_ci            ASSERT_EQ(obj->Uint32Value(vm_), val);
1224514f5e3Sopenharmony_ci        }
1234514f5e3Sopenharmony_ci    }
1244514f5e3Sopenharmony_ci
1254514f5e3Sopenharmony_ci    TaggedType ConvertDouble(double val)
1264514f5e3Sopenharmony_ci    {
1274514f5e3Sopenharmony_ci        return base::bit_cast<JSTaggedType>(val) + JSTaggedValue::DOUBLE_ENCODE_OFFSET;
1284514f5e3Sopenharmony_ci    }
1294514f5e3Sopenharmony_ci
1304514f5e3Sopenharmony_ciprotected:
1314514f5e3Sopenharmony_ci    void RegisterStringCacheTable();
1324514f5e3Sopenharmony_ci
1334514f5e3Sopenharmony_ci    JSThread *thread_ = nullptr;
1344514f5e3Sopenharmony_ci    EcmaVM *vm_ = nullptr;
1354514f5e3Sopenharmony_ci    bool isStringCacheTableCreated_ = false;
1364514f5e3Sopenharmony_ci};
1374514f5e3Sopenharmony_ci
1384514f5e3Sopenharmony_civoid JSNApiTests::RegisterStringCacheTable()
1394514f5e3Sopenharmony_ci{
1404514f5e3Sopenharmony_ci    constexpr uint32_t STRING_CACHE_TABLE_SIZE = 100;
1414514f5e3Sopenharmony_ci    auto res = ExternalStringCache::RegisterStringCacheTable(vm_, STRING_CACHE_TABLE_SIZE);
1424514f5e3Sopenharmony_ci    if (isStringCacheTableCreated_) {
1434514f5e3Sopenharmony_ci        ASSERT_FALSE(res);
1444514f5e3Sopenharmony_ci    } else {
1454514f5e3Sopenharmony_ci        ASSERT_TRUE(res);
1464514f5e3Sopenharmony_ci    }
1474514f5e3Sopenharmony_ci}
1484514f5e3Sopenharmony_ci
1494514f5e3Sopenharmony_ciLocal<JSValueRef> FunctionCallback(JsiRuntimeCallInfo *info)
1504514f5e3Sopenharmony_ci{
1514514f5e3Sopenharmony_ci    EscapeLocalScope scope(info->GetVM());
1524514f5e3Sopenharmony_ci    return scope.Escape(ArrayRef::New(info->GetVM(), info->GetArgsNumber()));
1534514f5e3Sopenharmony_ci}
1544514f5e3Sopenharmony_ci
1554514f5e3Sopenharmony_civoid WeakRefCallback(EcmaVM *vm)
1564514f5e3Sopenharmony_ci{
1574514f5e3Sopenharmony_ci    LocalScope scope(vm);
1584514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::New(vm);
1594514f5e3Sopenharmony_ci    Global<ObjectRef> globalObject(vm, object);
1604514f5e3Sopenharmony_ci    globalObject.SetWeak();
1614514f5e3Sopenharmony_ci    Local<ObjectRef> object1 = ObjectRef::New(vm);
1624514f5e3Sopenharmony_ci    Global<ObjectRef> globalObject1(vm, object1);
1634514f5e3Sopenharmony_ci    globalObject1.SetWeak();
1644514f5e3Sopenharmony_ci    vm->CollectGarbage(TriggerGCType::YOUNG_GC);
1654514f5e3Sopenharmony_ci    vm->CollectGarbage(TriggerGCType::OLD_GC);
1664514f5e3Sopenharmony_ci    globalObject.FreeGlobalHandleAddr();
1674514f5e3Sopenharmony_ci}
1684514f5e3Sopenharmony_ci
1694514f5e3Sopenharmony_civoid ThreadCheck(const EcmaVM *vm)
1704514f5e3Sopenharmony_ci{
1714514f5e3Sopenharmony_ci    EXPECT_TRUE(vm->GetJSThread()->GetThreadId() != JSThread::GetCurrentThreadId());
1724514f5e3Sopenharmony_ci}
1734514f5e3Sopenharmony_ci
1744514f5e3Sopenharmony_civoid CheckReject(JsiRuntimeCallInfo *info)
1754514f5e3Sopenharmony_ci{
1764514f5e3Sopenharmony_ci    ASSERT_EQ(info->GetArgsNumber(), 1U);
1774514f5e3Sopenharmony_ci    Local<JSValueRef> reason = info->GetCallArgRef(0);
1784514f5e3Sopenharmony_ci    ASSERT_TRUE(reason->IsString(info->GetVM()));
1794514f5e3Sopenharmony_ci    ASSERT_EQ(Local<StringRef>(reason)->ToString(info->GetVM()), "Reject");
1804514f5e3Sopenharmony_ci}
1814514f5e3Sopenharmony_ci
1824514f5e3Sopenharmony_ciLocal<JSValueRef> RejectCallback(JsiRuntimeCallInfo *info)
1834514f5e3Sopenharmony_ci{
1844514f5e3Sopenharmony_ci    LocalScope scope(info->GetVM());
1854514f5e3Sopenharmony_ci    CheckReject(info);
1864514f5e3Sopenharmony_ci    return JSValueRef::Undefined(info->GetVM());
1874514f5e3Sopenharmony_ci}
1884514f5e3Sopenharmony_ci
1894514f5e3Sopenharmony_ci/**
1904514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_105
1914514f5e3Sopenharmony_ci * @tc.name: JSValueRef_IsGeneratorObject
1924514f5e3Sopenharmony_ci * @tc.desc: Determine if it is a Generator generator object
1934514f5e3Sopenharmony_ci * @tc.type: FUNC
1944514f5e3Sopenharmony_ci * @tc.require:  parameter
1954514f5e3Sopenharmony_ci */
1964514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSValueRef_IsGeneratorObject)
1974514f5e3Sopenharmony_ci{
1984514f5e3Sopenharmony_ci    LocalScope scope(vm_);
1994514f5e3Sopenharmony_ci    ObjectFactory *factory = vm_->GetFactory();
2004514f5e3Sopenharmony_ci    auto env = vm_->GetGlobalEnv();
2014514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> genFunc = env->GetGeneratorFunctionFunction();
2024514f5e3Sopenharmony_ci    JSHandle<JSGeneratorObject> genObjHandleVal = factory->NewJSGeneratorObject(genFunc);
2034514f5e3Sopenharmony_ci    JSHandle<JSHClass> hclass = JSHandle<JSHClass>::Cast(env->GetGeneratorFunctionClass());
2044514f5e3Sopenharmony_ci    JSHandle<JSFunction> generatorFunc = JSHandle<JSFunction>::Cast(factory->NewJSObject(hclass));
2054514f5e3Sopenharmony_ci    JSFunction::InitializeJSFunction(thread_, generatorFunc, FunctionKind::GENERATOR_FUNCTION);
2064514f5e3Sopenharmony_ci    JSHandle<GeneratorContext> generatorContext = factory->NewGeneratorContext();
2074514f5e3Sopenharmony_ci    generatorContext->SetMethod(thread_, generatorFunc.GetTaggedValue());
2084514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> generatorContextVal = JSHandle<JSTaggedValue>::Cast(generatorContext);
2094514f5e3Sopenharmony_ci    genObjHandleVal->SetGeneratorContext(thread_, generatorContextVal.GetTaggedValue());
2104514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> genObjTagHandleVal = JSHandle<JSTaggedValue>::Cast(genObjHandleVal);
2114514f5e3Sopenharmony_ci    Local<JSValueRef> genObjectRef = JSNApiHelper::ToLocal<GeneratorObjectRef>(genObjTagHandleVal);
2124514f5e3Sopenharmony_ci    ASSERT_TRUE(genObjectRef->IsGeneratorObject(vm_));
2134514f5e3Sopenharmony_ci}
2144514f5e3Sopenharmony_ci
2154514f5e3Sopenharmony_cistatic JSFunction *JSObjectTestCreate(JSThread *thread)
2164514f5e3Sopenharmony_ci{
2174514f5e3Sopenharmony_ci    EcmaVM *ecmaVM = thread->GetEcmaVM();
2184514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
2194514f5e3Sopenharmony_ci    return globalEnv->GetObjectFunction().GetObject<JSFunction>();
2204514f5e3Sopenharmony_ci}
2214514f5e3Sopenharmony_ci
2224514f5e3Sopenharmony_ci/**
2234514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_106
2244514f5e3Sopenharmony_ci * @tc.name: JSValueRef_IsProxy
2254514f5e3Sopenharmony_ci * @tc.desc: Determine if it is the type of proxy
2264514f5e3Sopenharmony_ci * @tc.type: FUNC
2274514f5e3Sopenharmony_ci * @tc.require:  parameter
2284514f5e3Sopenharmony_ci */
2294514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSValueRef_IsProxy)
2304514f5e3Sopenharmony_ci{
2314514f5e3Sopenharmony_ci    LocalScope scope(vm_);
2324514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> hclass(thread_, JSObjectTestCreate(thread_));
2334514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> targetHandle(
2344514f5e3Sopenharmony_ci        thread_->GetEcmaVM()->GetFactory()->NewJSObjectByConstructor(JSHandle<JSFunction>::Cast(hclass), hclass));
2354514f5e3Sopenharmony_ci
2364514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(thread_->GetEcmaVM()->GetFactory()->NewFromASCII("x"));
2374514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> value(thread_, JSTaggedValue(1));
2384514f5e3Sopenharmony_ci    JSObject::SetProperty(thread_, targetHandle, key, value);
2394514f5e3Sopenharmony_ci    EXPECT_EQ(JSObject::GetProperty(thread_, targetHandle, key).GetValue()->GetInt(), 1);
2404514f5e3Sopenharmony_ci
2414514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> handlerHandle(
2424514f5e3Sopenharmony_ci        thread_->GetEcmaVM()->GetFactory()->NewJSObjectByConstructor(JSHandle<JSFunction>::Cast(hclass), hclass));
2434514f5e3Sopenharmony_ci    EXPECT_TRUE(handlerHandle->IsECMAObject());
2444514f5e3Sopenharmony_ci
2454514f5e3Sopenharmony_ci    JSHandle<JSProxy> proxyHandle = JSProxy::ProxyCreate(thread_, targetHandle, handlerHandle);
2464514f5e3Sopenharmony_ci    EXPECT_TRUE(*proxyHandle != nullptr);
2474514f5e3Sopenharmony_ci
2484514f5e3Sopenharmony_ci    EXPECT_EQ(JSProxy::GetProperty(thread_, proxyHandle, key).GetValue()->GetInt(), 1);
2494514f5e3Sopenharmony_ci    PropertyDescriptor desc(thread_);
2504514f5e3Sopenharmony_ci    JSProxy::GetOwnProperty(thread_, proxyHandle, key, desc);
2514514f5e3Sopenharmony_ci    EXPECT_EQ(desc.GetValue()->GetInt(), 1);
2524514f5e3Sopenharmony_ci    Local<JSValueRef> proxy = JSNApiHelper::ToLocal<JSProxy>(JSHandle<JSTaggedValue>(proxyHandle));
2534514f5e3Sopenharmony_ci    ASSERT_TRUE(proxy->IsProxy(vm_));
2544514f5e3Sopenharmony_ci}
2554514f5e3Sopenharmony_ci
2564514f5e3Sopenharmony_ci/**
2574514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_107
2584514f5e3Sopenharmony_ci * @tc.name: BufferRef_New_ByteLength
2594514f5e3Sopenharmony_ci * @tc.desc:
2604514f5e3Sopenharmony_ci * New:Create a buffer and specify the length size
2614514f5e3Sopenharmony_ci * ByteLength:Returns the length of the buffer
2624514f5e3Sopenharmony_ci * @tc.type: FUNC
2634514f5e3Sopenharmony_ci * @tc.require:  parameter
2644514f5e3Sopenharmony_ci */
2654514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BufferRef_New_ByteLength)
2664514f5e3Sopenharmony_ci{
2674514f5e3Sopenharmony_ci    LocalScope scope(vm_);
2684514f5e3Sopenharmony_ci    int32_t length = 10;
2694514f5e3Sopenharmony_ci    Local<BufferRef> buffer = BufferRef::New(vm_, length);
2704514f5e3Sopenharmony_ci    ASSERT_TRUE(buffer->IsBuffer(vm_));
2714514f5e3Sopenharmony_ci    EXPECT_EQ(buffer->ByteLength(vm_), length);
2724514f5e3Sopenharmony_ci}
2734514f5e3Sopenharmony_ci
2744514f5e3Sopenharmony_ci/**
2754514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_108
2764514f5e3Sopenharmony_ci * @tc.name: BufferRef_New_ByteLength_GetBuffer
2774514f5e3Sopenharmony_ci * @tc.desc:
2784514f5e3Sopenharmony_ci * New:Create a buffer and specify the length size
2794514f5e3Sopenharmony_ci * ByteLength:Returns the length of the buffer
2804514f5e3Sopenharmony_ci * GetBuffer:Return buffer pointer
2814514f5e3Sopenharmony_ci * @tc.type: FUNC
2824514f5e3Sopenharmony_ci * @tc.require:  parameter
2834514f5e3Sopenharmony_ci */
2844514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BufferRef_New_ByteLength_GetBuffer)
2854514f5e3Sopenharmony_ci{
2864514f5e3Sopenharmony_ci    LocalScope scope(vm_);
2874514f5e3Sopenharmony_ci    int32_t length = 10;
2884514f5e3Sopenharmony_ci    Local<BufferRef> buffer = BufferRef::New(vm_, length);
2894514f5e3Sopenharmony_ci    ASSERT_TRUE(buffer->IsBuffer(vm_));
2904514f5e3Sopenharmony_ci    EXPECT_EQ(buffer->ByteLength(vm_), 10U);
2914514f5e3Sopenharmony_ci    ASSERT_NE(buffer->GetBuffer(vm_), nullptr);
2924514f5e3Sopenharmony_ci}
2934514f5e3Sopenharmony_ci
2944514f5e3Sopenharmony_ci/**
2954514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_109
2964514f5e3Sopenharmony_ci * @tc.name: BufferRef_New01_ByteLength_GetBuffer_BufferToStringCallback
2974514f5e3Sopenharmony_ci * @tc.desc:
2984514f5e3Sopenharmony_ci * BufferToStringCallback:Implement callback when calling ToString (vm) mode in buffer
2994514f5e3Sopenharmony_ci * @tc.type: FUNC
3004514f5e3Sopenharmony_ci * @tc.require:  parameter
3014514f5e3Sopenharmony_ci */
3024514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BufferRef_New01_ByteLength_GetBuffer_BufferToStringCallback)
3034514f5e3Sopenharmony_ci{
3044514f5e3Sopenharmony_ci    LocalScope scope(vm_);
3054514f5e3Sopenharmony_ci    static bool isFree = false;
3064514f5e3Sopenharmony_ci    struct Data {
3074514f5e3Sopenharmony_ci        int32_t length;
3084514f5e3Sopenharmony_ci    };
3094514f5e3Sopenharmony_ci    const int32_t length = 15;
3104514f5e3Sopenharmony_ci    NativePointerCallback deleter = []([[maybe_unused]] void *env, void *buffer, void *data) -> void {
3114514f5e3Sopenharmony_ci        delete[] reinterpret_cast<uint8_t *>(buffer);
3124514f5e3Sopenharmony_ci        Data *currentData = reinterpret_cast<Data *>(data);
3134514f5e3Sopenharmony_ci        delete currentData;
3144514f5e3Sopenharmony_ci        isFree = true;
3154514f5e3Sopenharmony_ci    };
3164514f5e3Sopenharmony_ci    isFree = false;
3174514f5e3Sopenharmony_ci    uint8_t *buffer = new uint8_t[length]();
3184514f5e3Sopenharmony_ci    Data *data = new Data();
3194514f5e3Sopenharmony_ci    data->length = length;
3204514f5e3Sopenharmony_ci    Local<BufferRef> bufferRef = BufferRef::New(vm_, buffer, length, deleter, data);
3214514f5e3Sopenharmony_ci    ASSERT_TRUE(bufferRef->IsBuffer(vm_));
3224514f5e3Sopenharmony_ci    ASSERT_TRUE(bufferRef->IsBuffer(vm_));
3234514f5e3Sopenharmony_ci    EXPECT_EQ(bufferRef->ByteLength(vm_), 15U);
3244514f5e3Sopenharmony_ci    Local<StringRef> bufferStr = bufferRef->ToString(vm_);
3254514f5e3Sopenharmony_ci    ASSERT_TRUE(bufferStr->IsString(vm_));
3264514f5e3Sopenharmony_ci}
3274514f5e3Sopenharmony_ci
3284514f5e3Sopenharmony_ci/**
3294514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_110
3304514f5e3Sopenharmony_ci * @tc.name: LocalScope_LocalScope
3314514f5e3Sopenharmony_ci * @tc.desc: Build Escape LocalScope sub Vm scope
3324514f5e3Sopenharmony_ci * @tc.type: FUNC
3334514f5e3Sopenharmony_ci * @tc.require:  parameter
3344514f5e3Sopenharmony_ci */
3354514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, LocalScope_LocalScope)
3364514f5e3Sopenharmony_ci{
3374514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm_);
3384514f5e3Sopenharmony_ci    LocalScope *perScope = nullptr;
3394514f5e3Sopenharmony_ci    perScope = &scope;
3404514f5e3Sopenharmony_ci    ASSERT_TRUE(perScope != nullptr);
3414514f5e3Sopenharmony_ci}
3424514f5e3Sopenharmony_ci
3434514f5e3Sopenharmony_ci/**
3444514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_111
3454514f5e3Sopenharmony_ci * @tc.name: JSNApi_CreateJSContext_SwitchCurrentContext_DestroyJSContext
3464514f5e3Sopenharmony_ci * @tc.desc:
3474514f5e3Sopenharmony_ci * CreateJSContext:Create Context Object Pointer
3484514f5e3Sopenharmony_ci * SwitchCurrentContext:Record Update Context Object
3494514f5e3Sopenharmony_ci * DestroyJSContext:Delete Context Object
3504514f5e3Sopenharmony_ci * @tc.type: FUNC
3514514f5e3Sopenharmony_ci * @tc.require:  parameter
3524514f5e3Sopenharmony_ci */
3534514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApi_SwitchCurrentContext_DestroyJSContext)
3544514f5e3Sopenharmony_ci{
3554514f5e3Sopenharmony_ci    LocalScope scope(vm_);
3564514f5e3Sopenharmony_ci    EXPECT_EQ(vm_->GetJSThread()->GetEcmaContexts().size(), 1);
3574514f5e3Sopenharmony_ci    EcmaContext *context = JSNApi::CreateJSContext(vm_);
3584514f5e3Sopenharmony_ci    GTEST_LOG_(WARNING) << "context test =" << context;
3594514f5e3Sopenharmony_ci    EXPECT_EQ(vm_->GetJSThread()->GetEcmaContexts().size(), 2);
3604514f5e3Sopenharmony_ci    EcmaContext *context1 = JSNApi::CreateJSContext(vm_);
3614514f5e3Sopenharmony_ci    EXPECT_EQ(vm_->GetJSThread()->GetEcmaContexts().size(), 3);
3624514f5e3Sopenharmony_ci    JSNApi::SwitchCurrentContext(vm_, context1);
3634514f5e3Sopenharmony_ci    EXPECT_EQ(vm_->GetJSThread()->GetEcmaContexts().size(), 3);
3644514f5e3Sopenharmony_ci    JSNApi::DestroyJSContext(vm_, context1);
3654514f5e3Sopenharmony_ci    EXPECT_EQ(vm_->GetJSThread()->GetEcmaContexts().size(), 2);
3664514f5e3Sopenharmony_ci}
3674514f5e3Sopenharmony_ci
3684514f5e3Sopenharmony_ci/**
3694514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_112
3704514f5e3Sopenharmony_ci * @tc.name: JSNApi_CreateJSVM_DestroyJSVM
3714514f5e3Sopenharmony_ci * @tc.desc: Create/delete JSVM
3724514f5e3Sopenharmony_ci * @tc.type: FUNC
3734514f5e3Sopenharmony_ci * @tc.require:  parameter
3744514f5e3Sopenharmony_ci */
3754514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApi_CreateJSVM_DestroyJSVM)
3764514f5e3Sopenharmony_ci{
3774514f5e3Sopenharmony_ci    LocalScope scope(vm_);
3784514f5e3Sopenharmony_ci    std::thread t1([&](){
3794514f5e3Sopenharmony_ci        EcmaVM *vm1_ = nullptr;
3804514f5e3Sopenharmony_ci        RuntimeOption option;
3814514f5e3Sopenharmony_ci        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
3824514f5e3Sopenharmony_ci        vm1_ = JSNApi::CreateJSVM(option);
3834514f5e3Sopenharmony_ci        ASSERT_TRUE(vm1_ != nullptr) << "Cannot create Runtime";
3844514f5e3Sopenharmony_ci        vm1_->SetEnableForceGC(true);
3854514f5e3Sopenharmony_ci        vm1_->SetEnableForceGC(false);
3864514f5e3Sopenharmony_ci        JSNApi::DestroyJSVM(vm1_);
3874514f5e3Sopenharmony_ci    });
3884514f5e3Sopenharmony_ci    {
3894514f5e3Sopenharmony_ci        ThreadSuspensionScope suspensionScope(thread_);
3904514f5e3Sopenharmony_ci        t1.join();
3914514f5e3Sopenharmony_ci    }
3924514f5e3Sopenharmony_ci}
3934514f5e3Sopenharmony_ci
3944514f5e3Sopenharmony_ci/**
3954514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_114
3964514f5e3Sopenharmony_ci * @tc.name: JSNApi_GetUncaughtException
3974514f5e3Sopenharmony_ci * @tc.desc: Get uncaught exceptions
3984514f5e3Sopenharmony_ci * @tc.type: FUNC
3994514f5e3Sopenharmony_ci * @tc.require:  parameter
4004514f5e3Sopenharmony_ci */
4014514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApi_GetUncaughtException)
4024514f5e3Sopenharmony_ci{
4034514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4044514f5e3Sopenharmony_ci    Local<ObjectRef> excep = JSNApi::GetUncaughtException(vm_);
4054514f5e3Sopenharmony_ci    ASSERT_TRUE(excep.IsNull()) << "CreateInstance occur Exception";
4064514f5e3Sopenharmony_ci}
4074514f5e3Sopenharmony_ci
4084514f5e3Sopenharmony_ciLocal<JSValueRef> FuncRefNewCallbackForTest(JsiRuntimeCallInfo *info)
4094514f5e3Sopenharmony_ci{
4104514f5e3Sopenharmony_ci    GTEST_LOG_(INFO) << "runing FuncRefNewCallbackForTest";
4114514f5e3Sopenharmony_ci    EscapeLocalScope scope(info->GetVM());
4124514f5e3Sopenharmony_ci    return scope.Escape(ArrayRef::New(info->GetVM(), info->GetArgsNumber()));
4134514f5e3Sopenharmony_ci}
4144514f5e3Sopenharmony_ci
4154514f5e3Sopenharmony_ci/**
4164514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_115
4174514f5e3Sopenharmony_ci * @tc.name: ObjectRef_SetAccessorProperty
4184514f5e3Sopenharmony_ci * @tc.desc:
4194514f5e3Sopenharmony_ci * SetAccessorProperty:Set AccessorPro Properties
4204514f5e3Sopenharmony_ci * GetVM:Obtain environment information for runtime calls
4214514f5e3Sopenharmony_ci * LocalScope:Build Vm Scope
4224514f5e3Sopenharmony_ci * @tc.type: FUNC
4234514f5e3Sopenharmony_ci * @tc.require:  parameter
4244514f5e3Sopenharmony_ci */
4254514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ObjectRef_SetAccessorProperty_JsiRuntimeCallInfo_GetVM)
4264514f5e3Sopenharmony_ci{
4274514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4284514f5e3Sopenharmony_ci    Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey");
4294514f5e3Sopenharmony_ci    FunctionForRef nativeFunc = FuncRefNewCallbackForTest;
4304514f5e3Sopenharmony_ci    Local<FunctionRef> getter = FunctionRef::New(vm_, nativeFunc);
4314514f5e3Sopenharmony_ci    Local<FunctionRef> setter = FunctionRef::New(vm_, nativeFunc);
4324514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::New(vm_);
4334514f5e3Sopenharmony_ci    ASSERT_TRUE(object->SetAccessorProperty(vm_, key, getter, setter));
4344514f5e3Sopenharmony_ci}
4354514f5e3Sopenharmony_ci
4364514f5e3Sopenharmony_ci/*
4374514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_116
4384514f5e3Sopenharmony_ci * @tc.name: JSNApi_IsBoolean
4394514f5e3Sopenharmony_ci * @tc.desc: Judge  whether obj is a boolean type
4404514f5e3Sopenharmony_ci * @tc.type: FUNC
4414514f5e3Sopenharmony_ci * @tc.require:  parameter
4424514f5e3Sopenharmony_ci */
4434514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsBoolean)
4444514f5e3Sopenharmony_ci{
4454514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4464514f5e3Sopenharmony_ci    char16_t utf16[] = u"This is a char16 array";
4474514f5e3Sopenharmony_ci    int size = sizeof(utf16);
4484514f5e3Sopenharmony_ci    Local<StringRef> obj = StringRef::NewFromUtf16(vm_, utf16, size);
4494514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsBoolean());
4504514f5e3Sopenharmony_ci}
4514514f5e3Sopenharmony_ci
4524514f5e3Sopenharmony_ci/*
4534514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_117
4544514f5e3Sopenharmony_ci * @tc.name: JSNApi_IsNULL
4554514f5e3Sopenharmony_ci * @tc.desc: Judge  whether obj is a null type
4564514f5e3Sopenharmony_ci * @tc.type: FUNC
4574514f5e3Sopenharmony_ci * @tc.require:  parameter
4584514f5e3Sopenharmony_ci */
4594514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsNULL)
4604514f5e3Sopenharmony_ci{
4614514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4624514f5e3Sopenharmony_ci    char16_t utf16[] = u"This is a char16 array";
4634514f5e3Sopenharmony_ci    int size = sizeof(utf16);
4644514f5e3Sopenharmony_ci    Local<StringRef> obj = StringRef::NewFromUtf16(vm_, utf16, size);
4654514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsNull());
4664514f5e3Sopenharmony_ci}
4674514f5e3Sopenharmony_ci
4684514f5e3Sopenharmony_ci/*
4694514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_118
4704514f5e3Sopenharmony_ci * @tc.name: JSNApi_GetTime
4714514f5e3Sopenharmony_ci * @tc.desc: This function is to catch time
4724514f5e3Sopenharmony_ci * @tc.type: FUNC
4734514f5e3Sopenharmony_ci * @tc.require:  parameter
4744514f5e3Sopenharmony_ci */
4754514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetTime)
4764514f5e3Sopenharmony_ci{
4774514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4784514f5e3Sopenharmony_ci    const double time = 14.29;
4794514f5e3Sopenharmony_ci    Local<DateRef> date = DateRef::New(vm_, time);
4804514f5e3Sopenharmony_ci    ASSERT_EQ(date->GetTime(vm_), time);
4814514f5e3Sopenharmony_ci}
4824514f5e3Sopenharmony_ci
4834514f5e3Sopenharmony_ci/*
4844514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_119
4854514f5e3Sopenharmony_ci * @tc.name: JSNApi_IsDetach
4864514f5e3Sopenharmony_ci * @tc.desc: Judge whether arraybuffer is detached
4874514f5e3Sopenharmony_ci * @tc.type: FUNC
4884514f5e3Sopenharmony_ci * @tc.require:  parameter
4894514f5e3Sopenharmony_ci */
4904514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsDetach)
4914514f5e3Sopenharmony_ci{
4924514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4934514f5e3Sopenharmony_ci    const int32_t length = 33;
4944514f5e3Sopenharmony_ci    Local<ArrayBufferRef> arraybuffer = ArrayBufferRef::New(vm_, length);
4954514f5e3Sopenharmony_ci    ASSERT_FALSE(arraybuffer->IsDetach(vm_));
4964514f5e3Sopenharmony_ci}
4974514f5e3Sopenharmony_ci
4984514f5e3Sopenharmony_ci/*
4994514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_120
5004514f5e3Sopenharmony_ci * @tc.name: JSNApi_Detach
5014514f5e3Sopenharmony_ci * @tc.desc: This function is to detach arraybuffer
5024514f5e3Sopenharmony_ci * @tc.type: FUNC
5034514f5e3Sopenharmony_ci * @tc.require:  parameter
5044514f5e3Sopenharmony_ci */
5054514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Detach)
5064514f5e3Sopenharmony_ci{
5074514f5e3Sopenharmony_ci    LocalScope scope(vm_);
5084514f5e3Sopenharmony_ci    const int32_t length = 33;
5094514f5e3Sopenharmony_ci    Local<ArrayBufferRef> arraybuffer = ArrayBufferRef::New(vm_, length);
5104514f5e3Sopenharmony_ci    arraybuffer->Detach(vm_);
5114514f5e3Sopenharmony_ci}
5124514f5e3Sopenharmony_ci
5134514f5e3Sopenharmony_ci/*
5144514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_121
5154514f5e3Sopenharmony_ci * @tc.name: JSNApi_New1
5164514f5e3Sopenharmony_ci * @tc.desc:  create a obj that is a arraybuffer type
5174514f5e3Sopenharmony_ci * @tc.type: FUNC
5184514f5e3Sopenharmony_ci * @tc.require:  parameter
5194514f5e3Sopenharmony_ci */
5204514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, New1)
5214514f5e3Sopenharmony_ci{
5224514f5e3Sopenharmony_ci    LocalScope scope(vm_);
5234514f5e3Sopenharmony_ci    const int32_t length = 33;
5244514f5e3Sopenharmony_ci    Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
5254514f5e3Sopenharmony_ci    ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_));
5264514f5e3Sopenharmony_ci    ASSERT_EQ(arrayBuffer->ByteLength(vm_), length);
5274514f5e3Sopenharmony_ci    ASSERT_NE(arrayBuffer->GetBuffer(vm_), nullptr);
5284514f5e3Sopenharmony_ci}
5294514f5e3Sopenharmony_ci
5304514f5e3Sopenharmony_ci/*
5314514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_122
5324514f5e3Sopenharmony_ci * @tc.name: JSNApi_New1
5334514f5e3Sopenharmony_ci * @tc.desc:  create a obj that is a arraybuffer type
5344514f5e3Sopenharmony_ci * @tc.type: FUNC
5354514f5e3Sopenharmony_ci * @tc.require:  parameter
5364514f5e3Sopenharmony_ci */
5374514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, New2)
5384514f5e3Sopenharmony_ci{
5394514f5e3Sopenharmony_ci    static bool isFree = false;
5404514f5e3Sopenharmony_ci    struct Data {
5414514f5e3Sopenharmony_ci        int32_t length;
5424514f5e3Sopenharmony_ci    };
5434514f5e3Sopenharmony_ci    const int32_t length = 15;
5444514f5e3Sopenharmony_ci    Data *data = new Data();
5454514f5e3Sopenharmony_ci    data->length = length;
5464514f5e3Sopenharmony_ci    NativePointerCallback deleter = []([[maybe_unused]] void *env, void *buffer, void *data) -> void {
5474514f5e3Sopenharmony_ci        delete[] reinterpret_cast<uint8_t *>(buffer);
5484514f5e3Sopenharmony_ci        Data *currentData = reinterpret_cast<Data *>(data);
5494514f5e3Sopenharmony_ci        ASSERT_EQ(currentData->length, 15); // 5 : size of arguments
5504514f5e3Sopenharmony_ci        delete currentData;
5514514f5e3Sopenharmony_ci        isFree = true;
5524514f5e3Sopenharmony_ci    };
5534514f5e3Sopenharmony_ci    {
5544514f5e3Sopenharmony_ci        LocalScope scope(vm_);
5554514f5e3Sopenharmony_ci        uint8_t *buffer = new uint8_t[length]();
5564514f5e3Sopenharmony_ci        Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, buffer, length, deleter, data);
5574514f5e3Sopenharmony_ci        ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_));
5584514f5e3Sopenharmony_ci        ASSERT_EQ(arrayBuffer->ByteLength(vm_), length);
5594514f5e3Sopenharmony_ci        ASSERT_EQ(arrayBuffer->GetBuffer(vm_), buffer);
5604514f5e3Sopenharmony_ci    }
5614514f5e3Sopenharmony_ci}
5624514f5e3Sopenharmony_ci
5634514f5e3Sopenharmony_ci/*
5644514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_123
5654514f5e3Sopenharmony_ci * @tc.name: JSNApi_Bytelength
5664514f5e3Sopenharmony_ci * @tc.desc:   capture bytelength of arraybuffer
5674514f5e3Sopenharmony_ci * @tc.type: FUNC
5684514f5e3Sopenharmony_ci * @tc.require:  parameter
5694514f5e3Sopenharmony_ci */
5704514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Bytelength)
5714514f5e3Sopenharmony_ci{
5724514f5e3Sopenharmony_ci    LocalScope scope(vm_);
5734514f5e3Sopenharmony_ci    const int32_t length = 33;
5744514f5e3Sopenharmony_ci    Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length);
5754514f5e3Sopenharmony_ci    ASSERT_EQ(arrayBuffer->ByteLength(vm_), length);
5764514f5e3Sopenharmony_ci}
5774514f5e3Sopenharmony_ci
5784514f5e3Sopenharmony_ci/*
5794514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_124
5804514f5e3Sopenharmony_ci * @tc.name: JSNApi_GetBuffer
5814514f5e3Sopenharmony_ci * @tc.desc:  capture buffer of arraybuffer
5824514f5e3Sopenharmony_ci * @tc.type: FUNC
5834514f5e3Sopenharmony_ci * @tc.require:  parameter
5844514f5e3Sopenharmony_ci */
5854514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetBuffer)
5864514f5e3Sopenharmony_ci{
5874514f5e3Sopenharmony_ci    LocalScope scope(vm_);
5884514f5e3Sopenharmony_ci    const int32_t length = 33;
5894514f5e3Sopenharmony_ci    Local<ArrayBufferRef> arraybuffer = ArrayBufferRef::New(vm_, length);
5904514f5e3Sopenharmony_ci    ASSERT_NE(arraybuffer->GetBuffer(vm_), nullptr);
5914514f5e3Sopenharmony_ci}
5924514f5e3Sopenharmony_ci
5934514f5e3Sopenharmony_ci/*
5944514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_125
5954514f5e3Sopenharmony_ci * @tc.name: JSNApi_Is32Arraytest
5964514f5e3Sopenharmony_ci * @tc.desc:  judge  whether obj is a int32array type,
5974514f5e3Sopenharmony_ci * judge  whether obj is a uint32array type,
5984514f5e3Sopenharmony_ci * judge  whether obj is a float32array type,
5994514f5e3Sopenharmony_ci * judge  whether obj is a float64array type,
6004514f5e3Sopenharmony_ci * @tc.type: FUNC
6014514f5e3Sopenharmony_ci * @tc.require:  parameter
6024514f5e3Sopenharmony_ci */
6034514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Is32Arraytest)
6044514f5e3Sopenharmony_ci{
6054514f5e3Sopenharmony_ci    LocalScope scope(vm_);
6064514f5e3Sopenharmony_ci    char16_t utf16[] = u"This is a char16 array";
6074514f5e3Sopenharmony_ci    int size = sizeof(utf16);
6084514f5e3Sopenharmony_ci    Local<StringRef> obj = StringRef::NewFromUtf16(vm_, utf16, size);
6094514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsInt32Array(vm_));
6104514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsUint32Array(vm_));
6114514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsFloat32Array(vm_));
6124514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsFloat64Array(vm_));
6134514f5e3Sopenharmony_ci}
6144514f5e3Sopenharmony_ci
6154514f5e3Sopenharmony_ci/*
6164514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_126
6174514f5e3Sopenharmony_ci * @tc.name: JSNApi_SynchronizVMInfo
6184514f5e3Sopenharmony_ci * @tc.desc:  capture  synchronous info of vm
6194514f5e3Sopenharmony_ci * @tc.type: FUNC
6204514f5e3Sopenharmony_ci * @tc.require:  parameter
6214514f5e3Sopenharmony_ci */
6224514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SynchronizVMInfo)
6234514f5e3Sopenharmony_ci{
6244514f5e3Sopenharmony_ci    LocalScope scope(vm_);
6254514f5e3Sopenharmony_ci    std::thread t1([&]() {
6264514f5e3Sopenharmony_ci        JSRuntimeOptions option;
6274514f5e3Sopenharmony_ci        EcmaVM *hostVM = JSNApi::CreateEcmaVM(option);
6284514f5e3Sopenharmony_ci        {
6294514f5e3Sopenharmony_ci            LocalScope scope2(hostVM);
6304514f5e3Sopenharmony_ci            JSNApi::SynchronizVMInfo(vm_, hostVM);
6314514f5e3Sopenharmony_ci        }
6324514f5e3Sopenharmony_ci        JSNApi::DestroyJSVM(hostVM);
6334514f5e3Sopenharmony_ci    });
6344514f5e3Sopenharmony_ci    {
6354514f5e3Sopenharmony_ci        ThreadSuspensionScope suspensionScope(thread_);
6364514f5e3Sopenharmony_ci        t1.join();
6374514f5e3Sopenharmony_ci    }
6384514f5e3Sopenharmony_ci}
6394514f5e3Sopenharmony_ci
6404514f5e3Sopenharmony_ci/*
6414514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_127
6424514f5e3Sopenharmony_ci * @tc.name: JSNApi_IsProfiling
6434514f5e3Sopenharmony_ci * @tc.desc:  judge whether vm is profiling
6444514f5e3Sopenharmony_ci * @tc.type: FUNC
6454514f5e3Sopenharmony_ci * @tc.require:  parameter
6464514f5e3Sopenharmony_ci */
6474514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsProfiling)
6484514f5e3Sopenharmony_ci{
6494514f5e3Sopenharmony_ci    LocalScope scope(vm_);
6504514f5e3Sopenharmony_ci    ASSERT_FALSE(JSNApi::IsProfiling(vm_));
6514514f5e3Sopenharmony_ci}
6524514f5e3Sopenharmony_ci
6534514f5e3Sopenharmony_ci/*
6544514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_128
6554514f5e3Sopenharmony_ci * @tc.name: JSNApi_SetProfilerState
6564514f5e3Sopenharmony_ci * @tc.desc:  This function is to set state of profiler
6574514f5e3Sopenharmony_ci * @tc.type: FUNC
6584514f5e3Sopenharmony_ci * @tc.require:  parameter
6594514f5e3Sopenharmony_ci */
6604514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetProfilerState)
6614514f5e3Sopenharmony_ci{
6624514f5e3Sopenharmony_ci    bool value = true;
6634514f5e3Sopenharmony_ci    bool value2 = false;
6644514f5e3Sopenharmony_ci    LocalScope scope(vm_);
6654514f5e3Sopenharmony_ci    JSNApi::SetProfilerState(vm_, value);
6664514f5e3Sopenharmony_ci    JSNApi::SetProfilerState(vm_, value2);
6674514f5e3Sopenharmony_ci}
6684514f5e3Sopenharmony_ci
6694514f5e3Sopenharmony_ci/*
6704514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_129
6714514f5e3Sopenharmony_ci * @tc.name: JSNApi_SetLoop
6724514f5e3Sopenharmony_ci * @tc.desc:  This function is to set loop
6734514f5e3Sopenharmony_ci * @tc.type: FUNC
6744514f5e3Sopenharmony_ci * @tc.require:  parameter
6754514f5e3Sopenharmony_ci */
6764514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetLoop)
6774514f5e3Sopenharmony_ci{
6784514f5e3Sopenharmony_ci    LocalScope scope(vm_);
6794514f5e3Sopenharmony_ci    void *data = reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf);
6804514f5e3Sopenharmony_ci    JSNApi::SetLoop(vm_, data);
6814514f5e3Sopenharmony_ci}
6824514f5e3Sopenharmony_ci
6834514f5e3Sopenharmony_ci/*
6844514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_130
6854514f5e3Sopenharmony_ci * @tc.name: JSNApi_SetHostPromiseRejectionTracker
6864514f5e3Sopenharmony_ci * @tc.desc:  This function is to set host promise rejection about tracker
6874514f5e3Sopenharmony_ci * @tc.type: FUNC
6884514f5e3Sopenharmony_ci * @tc.require:  parameter
6894514f5e3Sopenharmony_ci */
6904514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetHostPromiseRejectionTracker)
6914514f5e3Sopenharmony_ci{
6924514f5e3Sopenharmony_ci    LocalScope scope(vm_);
6934514f5e3Sopenharmony_ci    void *data = reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf);
6944514f5e3Sopenharmony_ci    void *cb = reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf);
6954514f5e3Sopenharmony_ci    JSNApi::SetHostPromiseRejectionTracker(vm_, cb, data);
6964514f5e3Sopenharmony_ci}
6974514f5e3Sopenharmony_ci
6984514f5e3Sopenharmony_ci/*
6994514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_131
7004514f5e3Sopenharmony_ci * @tc.name: JSNApi_SetHostResolveBufferTracker
7014514f5e3Sopenharmony_ci * @tc.desc:   This function is to set host resolve buffer about tracker
7024514f5e3Sopenharmony_ci * @tc.type: FUNC
7034514f5e3Sopenharmony_ci * @tc.require:  parameter
7044514f5e3Sopenharmony_ci */
7054514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetHostResolveBufferTracker)
7064514f5e3Sopenharmony_ci{
7074514f5e3Sopenharmony_ci    LocalScope scope(vm_);
7084514f5e3Sopenharmony_ci    JSNApi::SetHostResolveBufferTracker(vm_,
7094514f5e3Sopenharmony_ci        [&](std::string, uint8_t **, size_t *, std::string &) -> bool { return true; });
7104514f5e3Sopenharmony_ci}
7114514f5e3Sopenharmony_ci
7124514f5e3Sopenharmony_ci/*
7134514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_132
7144514f5e3Sopenharmony_ci * @tc.name: JSNApi_SetUnloadNativeModuleCallback
7154514f5e3Sopenharmony_ci * @tc.desc:   This function is to set unload native module  about callback
7164514f5e3Sopenharmony_ci * @tc.type: FUNC
7174514f5e3Sopenharmony_ci * @tc.require:  parameter
7184514f5e3Sopenharmony_ci */
7194514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetUnloadNativeModuleCallback)
7204514f5e3Sopenharmony_ci{
7214514f5e3Sopenharmony_ci    LocalScope scope(vm_);
7224514f5e3Sopenharmony_ci    JSNApi::SetUnloadNativeModuleCallback(vm_, [&](const std::string &) -> bool { return true; });
7234514f5e3Sopenharmony_ci}
7244514f5e3Sopenharmony_ci
7254514f5e3Sopenharmony_ci/*
7264514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_133
7274514f5e3Sopenharmony_ci * @tc.name: JSNApi_SetNativePtrGetter
7284514f5e3Sopenharmony_ci * @tc.desc:   This function is to set a native pointer about getter
7294514f5e3Sopenharmony_ci * @tc.type: FUNC
7304514f5e3Sopenharmony_ci * @tc.require:  parameter
7314514f5e3Sopenharmony_ci */
7324514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetNativePtrGetter)
7334514f5e3Sopenharmony_ci{
7344514f5e3Sopenharmony_ci    LocalScope scope(vm_);
7354514f5e3Sopenharmony_ci    void *cb = reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf);
7364514f5e3Sopenharmony_ci    JSNApi::SetNativePtrGetter(vm_, cb);
7374514f5e3Sopenharmony_ci}
7384514f5e3Sopenharmony_ci
7394514f5e3Sopenharmony_ci/*
7404514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_134
7414514f5e3Sopenharmony_ci * @tc.name: JSNApi_PreFork
7424514f5e3Sopenharmony_ci * @tc.desc:  This function is to set prefork
7434514f5e3Sopenharmony_ci * @tc.type: FUNC
7444514f5e3Sopenharmony_ci * @tc.require:  parameter
7454514f5e3Sopenharmony_ci */
7464514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PreFork)
7474514f5e3Sopenharmony_ci{
7484514f5e3Sopenharmony_ci    LocalScope scope(vm_);
7494514f5e3Sopenharmony_ci    JSNApi::PreFork(vm_);
7504514f5e3Sopenharmony_ci}
7514514f5e3Sopenharmony_ci
7524514f5e3Sopenharmony_ci/*
7534514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_135
7544514f5e3Sopenharmony_ci * @tc.name: JSNApi_PostFork
7554514f5e3Sopenharmony_ci * @tc.desc:  This function is to set postfork
7564514f5e3Sopenharmony_ci * @tc.type: FUNC
7574514f5e3Sopenharmony_ci * @tc.require:  parameter
7584514f5e3Sopenharmony_ci */
7594514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PostFork)
7604514f5e3Sopenharmony_ci{
7614514f5e3Sopenharmony_ci    RuntimeOption option;
7624514f5e3Sopenharmony_ci    ecmascript::ThreadNativeScope nativeScope(vm_->GetJSThread());
7634514f5e3Sopenharmony_ci    LocalScope scope(vm_);
7644514f5e3Sopenharmony_ci    JSNApi::PreFork(vm_);
7654514f5e3Sopenharmony_ci    JSNApi::PostFork(vm_, option);
7664514f5e3Sopenharmony_ci}
7674514f5e3Sopenharmony_ci
7684514f5e3Sopenharmony_ci
7694514f5e3Sopenharmony_ci/*
7704514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_136
7714514f5e3Sopenharmony_ci * @tc.name: JSNApi_NewFromUtf8
7724514f5e3Sopenharmony_ci * @tc.desc:  create a newfromutf8 object
7734514f5e3Sopenharmony_ci * @tc.type: FUNC
7744514f5e3Sopenharmony_ci * @tc.require:  parameter
7754514f5e3Sopenharmony_ci */
7764514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewFromUtf8)
7774514f5e3Sopenharmony_ci{
7784514f5e3Sopenharmony_ci    LocalScope scope(vm_);
7794514f5e3Sopenharmony_ci    char utf8[] = "hello world!";
7804514f5e3Sopenharmony_ci    int length = strlen(utf8);
7814514f5e3Sopenharmony_ci    Local<StringRef> result = StringRef::NewFromUtf8(vm_, utf8, length);
7824514f5e3Sopenharmony_ci    ASSERT_EQ(result->Utf8Length(vm_), length + 1);
7834514f5e3Sopenharmony_ci}
7844514f5e3Sopenharmony_ci
7854514f5e3Sopenharmony_ci/*
7864514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_137
7874514f5e3Sopenharmony_ci * @tc.name: JSNApi_NewFromUtf16
7884514f5e3Sopenharmony_ci * @tc.desc:  create a newfromutf16 object
7894514f5e3Sopenharmony_ci * @tc.type: FUNC
7904514f5e3Sopenharmony_ci * @tc.require:  parameter
7914514f5e3Sopenharmony_ci */
7924514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewFromUtf16)
7934514f5e3Sopenharmony_ci{
7944514f5e3Sopenharmony_ci    LocalScope scope(vm_);
7954514f5e3Sopenharmony_ci    char16_t utf16[] = u"This is a char16 array";
7964514f5e3Sopenharmony_ci    int length = sizeof(utf16);
7974514f5e3Sopenharmony_ci    Local<StringRef> result = StringRef::NewFromUtf16(vm_, utf16, length);
7984514f5e3Sopenharmony_ci    ASSERT_EQ(result->Length(vm_), length);
7994514f5e3Sopenharmony_ci}
8004514f5e3Sopenharmony_ci
8014514f5e3Sopenharmony_ci/*
8024514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_138
8034514f5e3Sopenharmony_ci * @tc.name: JSNApi_GetNapiWrapperString
8044514f5e3Sopenharmony_ci * @tc.desc:  This function is to get a napiwrapper string
8054514f5e3Sopenharmony_ci * @tc.type: FUNC
8064514f5e3Sopenharmony_ci * @tc.require:  parameter
8074514f5e3Sopenharmony_ci */
8084514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetNapiWrapperString)
8094514f5e3Sopenharmony_ci{
8104514f5e3Sopenharmony_ci    LocalScope scope(vm_);
8114514f5e3Sopenharmony_ci    Local<StringRef> result = StringRef::GetNapiWrapperString(vm_);
8124514f5e3Sopenharmony_ci    ASSERT_TRUE(result->IsString(vm_));
8134514f5e3Sopenharmony_ci}
8144514f5e3Sopenharmony_ci
8154514f5e3Sopenharmony_ci/*
8164514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_139
8174514f5e3Sopenharmony_ci * @tc.name: JSNApi_JSExecutionScope
8184514f5e3Sopenharmony_ci * @tc.desc:  This function is to construct a object of jsexecutionscope
8194514f5e3Sopenharmony_ci * @tc.type: FUNC
8204514f5e3Sopenharmony_ci * @tc.require:  parameter
8214514f5e3Sopenharmony_ci */
8224514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSExecutionScope)
8234514f5e3Sopenharmony_ci{
8244514f5e3Sopenharmony_ci    LocalScope scope(vm_);
8254514f5e3Sopenharmony_ci    JSExecutionScope jsexecutionScope(vm_);
8264514f5e3Sopenharmony_ci}
8274514f5e3Sopenharmony_ci
8284514f5e3Sopenharmony_ci/*
8294514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_140
8304514f5e3Sopenharmony_ci * @tc.name: WeakMapRef_GetSize_GetTotalElements_GetKey_GetValue
8314514f5e3Sopenharmony_ci * @tc.desc:  This function is to set a weakmap and capture it's size ,
8324514f5e3Sopenharmony_ci * key, value and total elements
8334514f5e3Sopenharmony_ci * @tc.type: FUNC
8344514f5e3Sopenharmony_ci * @tc.require:  parameter
8354514f5e3Sopenharmony_ci */
8364514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, WeakMapRef_GetSize_GetTotalElements_GetKey_GetValue)
8374514f5e3Sopenharmony_ci{
8384514f5e3Sopenharmony_ci    LocalScope scope(vm_);
8394514f5e3Sopenharmony_ci    JSThread *thread = vm_->GetJSThread();
8404514f5e3Sopenharmony_ci    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
8414514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
8424514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor = env->GetBuiltinsWeakMapFunction();
8434514f5e3Sopenharmony_ci    JSHandle<JSWeakMap> weakMap =
8444514f5e3Sopenharmony_ci        JSHandle<JSWeakMap>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor));
8454514f5e3Sopenharmony_ci    JSHandle<LinkedHashMap> hashMap = LinkedHashMap::Create(thread);
8464514f5e3Sopenharmony_ci    weakMap->SetLinkedMap(thread, hashMap);
8474514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> weakMapTag = JSHandle<JSTaggedValue>::Cast(weakMap);
8484514f5e3Sopenharmony_ci
8494514f5e3Sopenharmony_ci    Local<WeakMapRef> map = JSNApiHelper::ToLocal<WeakMapRef>(weakMapTag);
8504514f5e3Sopenharmony_ci    EXPECT_TRUE(map->IsWeakMap(vm_));
8514514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> value(factory->NewFromASCII("value"));
8524514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(factory->NewFromASCII("key"));
8534514f5e3Sopenharmony_ci    JSWeakMap::Set(thread, weakMap, key, value);
8544514f5e3Sopenharmony_ci    int32_t num = map->GetSize(vm_);
8554514f5e3Sopenharmony_ci    int32_t num1 = map->GetTotalElements(vm_);
8564514f5e3Sopenharmony_ci    ASSERT_EQ(num, 1);
8574514f5e3Sopenharmony_ci    ASSERT_EQ(num1, 1);
8584514f5e3Sopenharmony_ci    Local<JSValueRef> res1 = map->GetKey(vm_, 0);
8594514f5e3Sopenharmony_ci    ASSERT_EQ(res1->ToString(vm_)->ToString(vm_), "key");
8604514f5e3Sopenharmony_ci    Local<JSValueRef> res2 = map->GetValue(vm_, 0);
8614514f5e3Sopenharmony_ci    ASSERT_EQ(res2->ToString(vm_)->ToString(vm_), "value");
8624514f5e3Sopenharmony_ci}
8634514f5e3Sopenharmony_ci
8644514f5e3Sopenharmony_ci/*
8654514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_141
8664514f5e3Sopenharmony_ci * @tc.name: JSNApi_ IsAGJA
8674514f5e3Sopenharmony_ci * @tc.desc:  This function is to judge whether object is a argumentsobject or
8684514f5e3Sopenharmony_ci * is a generatorfunction or is a asyncfunction
8694514f5e3Sopenharmony_ci * @tc.type: FUNC
8704514f5e3Sopenharmony_ci * @tc.require:  parameter
8714514f5e3Sopenharmony_ci */
8724514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsAGJA)
8734514f5e3Sopenharmony_ci{
8744514f5e3Sopenharmony_ci    LocalScope scope(vm_);
8754514f5e3Sopenharmony_ci    char16_t utf16[] = u"This is a char16 array";
8764514f5e3Sopenharmony_ci    int size = sizeof(utf16);
8774514f5e3Sopenharmony_ci    Local<StringRef> obj = StringRef::NewFromUtf16(vm_, utf16, size);
8784514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsArgumentsObject(vm_));
8794514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsGeneratorFunction(vm_));
8804514f5e3Sopenharmony_ci    ASSERT_FALSE(obj->IsAsyncFunction(vm_));
8814514f5e3Sopenharmony_ci}
8824514f5e3Sopenharmony_ci
8834514f5e3Sopenharmony_ci/**
8844514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_143
8854514f5e3Sopenharmony_ci * @tc.name: Int32Array
8864514f5e3Sopenharmony_ci * @tc.desc: Catch exceptions correctly
8874514f5e3Sopenharmony_ci * @tc.type: FUNC
8884514f5e3Sopenharmony_ci * @tc.require:  parameter
8894514f5e3Sopenharmony_ci */
8904514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, HasCaught)
8914514f5e3Sopenharmony_ci{
8924514f5e3Sopenharmony_ci    LocalScope scope(vm_);
8934514f5e3Sopenharmony_ci    Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest");
8944514f5e3Sopenharmony_ci    Local<JSValueRef> error = Exception::Error(vm_, message);
8954514f5e3Sopenharmony_ci    ASSERT_TRUE(error->IsError(vm_));
8964514f5e3Sopenharmony_ci    JSNApi::ThrowException(vm_, error);
8974514f5e3Sopenharmony_ci    TryCatch tryCatch(vm_);
8984514f5e3Sopenharmony_ci    ASSERT_TRUE(tryCatch.HasCaught());
8994514f5e3Sopenharmony_ci    vm_->GetJSThread()->ClearException();
9004514f5e3Sopenharmony_ci    ASSERT_FALSE(tryCatch.HasCaught());
9014514f5e3Sopenharmony_ci}
9024514f5e3Sopenharmony_ci
9034514f5e3Sopenharmony_ci/**
9044514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_144
9054514f5e3Sopenharmony_ci * @tc.name: Int32Array
9064514f5e3Sopenharmony_ci * @tc.desc: Rethrow the exception
9074514f5e3Sopenharmony_ci * @tc.type: FUNC
9084514f5e3Sopenharmony_ci * @tc.require:  parameter
9094514f5e3Sopenharmony_ci */
9104514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Rethrow)
9114514f5e3Sopenharmony_ci{
9124514f5e3Sopenharmony_ci    LocalScope scope(vm_);
9134514f5e3Sopenharmony_ci    TryCatch tryCatch(vm_);
9144514f5e3Sopenharmony_ci    tryCatch.Rethrow();
9154514f5e3Sopenharmony_ci    ASSERT_TRUE(tryCatch.getrethrow_());
9164514f5e3Sopenharmony_ci}
9174514f5e3Sopenharmony_ci
9184514f5e3Sopenharmony_ci/**
9194514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_145
9204514f5e3Sopenharmony_ci * @tc.name: Int32Array
9214514f5e3Sopenharmony_ci * @tc.desc: Clear caught exceptions
9224514f5e3Sopenharmony_ci * @tc.type: FUNC
9234514f5e3Sopenharmony_ci * @tc.require:  parameter
9244514f5e3Sopenharmony_ci */
9254514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetAndClearException)
9264514f5e3Sopenharmony_ci{
9274514f5e3Sopenharmony_ci    LocalScope scope(vm_);
9284514f5e3Sopenharmony_ci    Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest");
9294514f5e3Sopenharmony_ci    Local<JSValueRef> error = Exception::Error(vm_, message);
9304514f5e3Sopenharmony_ci    ASSERT_TRUE(error->IsError(vm_));
9314514f5e3Sopenharmony_ci    JSNApi::ThrowException(vm_, error);
9324514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
9334514f5e3Sopenharmony_ci    TryCatch tryCatch(vm_);
9344514f5e3Sopenharmony_ci    tryCatch.GetAndClearException();
9354514f5e3Sopenharmony_ci    EXPECT_FALSE(vm_->GetJSThread()->HasPendingException());
9364514f5e3Sopenharmony_ci}
9374514f5e3Sopenharmony_ci/**
9384514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_146
9394514f5e3Sopenharmony_ci * @tc.name: Int32Array
9404514f5e3Sopenharmony_ci * @tc.desc: trycatch class construction
9414514f5e3Sopenharmony_ci * @tc.type: FUNC
9424514f5e3Sopenharmony_ci * @tc.require:  parameter
9434514f5e3Sopenharmony_ci */
9444514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, TryCatch)
9454514f5e3Sopenharmony_ci{
9464514f5e3Sopenharmony_ci    LocalScope scope(vm_);
9474514f5e3Sopenharmony_ci    TryCatch tryCatch(vm_);
9484514f5e3Sopenharmony_ci    EXPECT_EQ(tryCatch.getrethrow_(), false);
9494514f5e3Sopenharmony_ci    EXPECT_FALSE(tryCatch.HasCaught());
9504514f5e3Sopenharmony_ci    tryCatch.Rethrow();
9514514f5e3Sopenharmony_ci    EXPECT_EQ(tryCatch.getrethrow_(), true);
9524514f5e3Sopenharmony_ci}
9534514f5e3Sopenharmony_ci
9544514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithProperties)
9554514f5e3Sopenharmony_ci{
9564514f5e3Sopenharmony_ci    LocalScope scope(vm_);
9574514f5e3Sopenharmony_ci    Local<JSValueRef> keys[1100];
9584514f5e3Sopenharmony_ci    Local<JSValueRef> values[1100];
9594514f5e3Sopenharmony_ci    PropertyAttribute attributes[1100];
9604514f5e3Sopenharmony_ci    for (int i = 0; i < 1100; i += (i < 80 ? (i < 10 ? 1 : 80) : 1000)) {
9614514f5e3Sopenharmony_ci        for (int j = 0; j <= i; ++j) {
9624514f5e3Sopenharmony_ci            std::string strKey("TestKey" + std::to_string(i) + "_" + std::to_string(j));
9634514f5e3Sopenharmony_ci            std::string strVal("TestValue" + std::to_string(i) + "_" + std::to_string(j));
9644514f5e3Sopenharmony_ci            keys[j] = StringRef::NewFromUtf8(vm_, strKey.c_str());
9654514f5e3Sopenharmony_ci            values[j] = StringRef::NewFromUtf8(vm_, strVal.c_str());
9664514f5e3Sopenharmony_ci            attributes[j] = PropertyAttribute(values[j], true, true, true);
9674514f5e3Sopenharmony_ci        }
9684514f5e3Sopenharmony_ci        Local<ObjectRef> object = ObjectRef::NewWithProperties(vm_, i + 1, keys, attributes);
9694514f5e3Sopenharmony_ci        for (int j = 0; j <= i; ++j) {
9704514f5e3Sopenharmony_ci            Local<JSValueRef> value1 = object->Get(vm_, keys[j]);
9714514f5e3Sopenharmony_ci            EXPECT_TRUE(values[j]->IsStrictEquals(vm_, value1));
9724514f5e3Sopenharmony_ci        }
9734514f5e3Sopenharmony_ci        JSHandle<JSObject> obj(JSNApiHelper::ToJSHandle(object));
9744514f5e3Sopenharmony_ci        uint32_t propCount = obj->GetJSHClass()->NumberOfProps();
9754514f5e3Sopenharmony_ci        if (i + 1 > PropertyAttributes::MAX_FAST_PROPS_CAPACITY) {
9764514f5e3Sopenharmony_ci            EXPECT_TRUE(propCount == 0);
9774514f5e3Sopenharmony_ci            EXPECT_TRUE(obj->GetJSHClass()->IsDictionaryMode());
9784514f5e3Sopenharmony_ci            JSHandle<NameDictionary> dict(thread_, obj->GetProperties());
9794514f5e3Sopenharmony_ci            EXPECT_TRUE(dict->EntriesCount() == i + 1);
9804514f5e3Sopenharmony_ci        } else {
9814514f5e3Sopenharmony_ci            EXPECT_TRUE(propCount == i + 1);
9824514f5e3Sopenharmony_ci            int32_t in_idx = obj->GetJSHClass()->GetNextInlinedPropsIndex();
9834514f5e3Sopenharmony_ci            int32_t nonin_idx = obj->GetJSHClass()->GetNextNonInlinedPropsIndex();
9844514f5e3Sopenharmony_ci            if (i + 1 < JSHClass::DEFAULT_CAPACITY_OF_IN_OBJECTS) {
9854514f5e3Sopenharmony_ci                EXPECT_TRUE(in_idx == i + 1);
9864514f5e3Sopenharmony_ci                EXPECT_TRUE(nonin_idx == -1);
9874514f5e3Sopenharmony_ci            } else {
9884514f5e3Sopenharmony_ci                EXPECT_TRUE(in_idx == -1);
9894514f5e3Sopenharmony_ci                EXPECT_TRUE(nonin_idx == 0);
9904514f5e3Sopenharmony_ci            }
9914514f5e3Sopenharmony_ci        }
9924514f5e3Sopenharmony_ci    }
9934514f5e3Sopenharmony_ci}
9944514f5e3Sopenharmony_ci
9954514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithPropertieNonPureStringKey)
9964514f5e3Sopenharmony_ci{
9974514f5e3Sopenharmony_ci    LocalScope scope(vm_);
9984514f5e3Sopenharmony_ci    Local<JSValueRef> keys[] = {
9994514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "1"),
10004514f5e3Sopenharmony_ci    };
10014514f5e3Sopenharmony_ci    Local<JSValueRef> values[] = {
10024514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "value1"),
10034514f5e3Sopenharmony_ci    };
10044514f5e3Sopenharmony_ci    PropertyAttribute attributes[] = {
10054514f5e3Sopenharmony_ci        PropertyAttribute(values[0], true, true, true),
10064514f5e3Sopenharmony_ci    };
10074514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::NewWithProperties(vm_, 1, keys, attributes);
10084514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(object);
10094514f5e3Sopenharmony_ci    EXPECT_TRUE(obj.GetTaggedValue() == JSTaggedValue::Undefined());
10104514f5e3Sopenharmony_ci    thread_->ClearException();
10114514f5e3Sopenharmony_ci}
10124514f5e3Sopenharmony_ci
10134514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithPropertiesDuplicate)
10144514f5e3Sopenharmony_ci{
10154514f5e3Sopenharmony_ci    LocalScope scope(vm_);
10164514f5e3Sopenharmony_ci    Local<JSValueRef> keys[] = {
10174514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, DUPLICATE_KEY),
10184514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, SIMPLE_KEY),
10194514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, DUPLICATE_KEY),
10204514f5e3Sopenharmony_ci    };
10214514f5e3Sopenharmony_ci    Local<JSValueRef> values[] = {
10224514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "value1"),
10234514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "value2"),
10244514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "value3"),
10254514f5e3Sopenharmony_ci    };
10264514f5e3Sopenharmony_ci    PropertyAttribute attributes[] = {
10274514f5e3Sopenharmony_ci        PropertyAttribute(values[0], true, true, true),
10284514f5e3Sopenharmony_ci        PropertyAttribute(values[1], true, true, true),
10294514f5e3Sopenharmony_ci        PropertyAttribute(values[2], true, true, true),
10304514f5e3Sopenharmony_ci    };
10314514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::NewWithProperties(vm_, 3, keys, attributes);
10324514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(object);
10334514f5e3Sopenharmony_ci    EXPECT_TRUE(obj.GetTaggedValue() == JSTaggedValue::Undefined());
10344514f5e3Sopenharmony_ci    thread_->ClearException();
10354514f5e3Sopenharmony_ci}
10364514f5e3Sopenharmony_ci
10374514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithNamedProperties)
10384514f5e3Sopenharmony_ci{
10394514f5e3Sopenharmony_ci    LocalScope scope(vm_);
10404514f5e3Sopenharmony_ci    const char *keys[1100];
10414514f5e3Sopenharmony_ci    std::string strKeys[1100];
10424514f5e3Sopenharmony_ci    Local<JSValueRef> values[1100];
10434514f5e3Sopenharmony_ci    for (int i = 0; i < 1100; i += (i < 80 ? (i < 10 ? 1 : 80) : 1000)) {
10444514f5e3Sopenharmony_ci        for (int j = 0; j <= i; ++j) {
10454514f5e3Sopenharmony_ci            strKeys[j] = "TestKey" + std::to_string(i) + "_" + std::to_string(j);
10464514f5e3Sopenharmony_ci            std::string strVal("TestValue" + std::to_string(i) + "_" + std::to_string(j));
10474514f5e3Sopenharmony_ci            keys[j] = const_cast<char *>(strKeys[j].c_str());
10484514f5e3Sopenharmony_ci            values[j] = StringRef::NewFromUtf8(vm_, strVal.c_str());
10494514f5e3Sopenharmony_ci        }
10504514f5e3Sopenharmony_ci        Local<ObjectRef> object = ObjectRef::NewWithNamedProperties(vm_, i + 1, keys, values);
10514514f5e3Sopenharmony_ci        for (int j = 0; j <= i; ++j) {
10524514f5e3Sopenharmony_ci            Local<JSValueRef> value1 = object->Get(vm_, StringRef::NewFromUtf8(vm_, keys[j]));
10534514f5e3Sopenharmony_ci            EXPECT_TRUE(values[j]->IsStrictEquals(vm_, value1));
10544514f5e3Sopenharmony_ci        }
10554514f5e3Sopenharmony_ci        JSHandle<JSObject> obj(JSNApiHelper::ToJSHandle(object));
10564514f5e3Sopenharmony_ci        uint32_t propCount = obj->GetJSHClass()->NumberOfProps();
10574514f5e3Sopenharmony_ci        if (i + 1 > PropertyAttributes::MAX_FAST_PROPS_CAPACITY) {
10584514f5e3Sopenharmony_ci            EXPECT_TRUE(propCount == 0);
10594514f5e3Sopenharmony_ci            EXPECT_TRUE(obj->GetJSHClass()->IsDictionaryMode());
10604514f5e3Sopenharmony_ci            JSHandle<NameDictionary> dict(thread_, obj->GetProperties());
10614514f5e3Sopenharmony_ci            EXPECT_TRUE(dict->EntriesCount() == i + 1);
10624514f5e3Sopenharmony_ci        } else {
10634514f5e3Sopenharmony_ci            EXPECT_TRUE(propCount == i + 1);
10644514f5e3Sopenharmony_ci            int32_t in_idx = obj->GetJSHClass()->GetNextInlinedPropsIndex();
10654514f5e3Sopenharmony_ci            int32_t nonin_idx = obj->GetJSHClass()->GetNextNonInlinedPropsIndex();
10664514f5e3Sopenharmony_ci            if (i + 1 < JSHClass::DEFAULT_CAPACITY_OF_IN_OBJECTS) {
10674514f5e3Sopenharmony_ci                EXPECT_TRUE(in_idx == i + 1);
10684514f5e3Sopenharmony_ci                EXPECT_TRUE(nonin_idx == -1);
10694514f5e3Sopenharmony_ci            } else {
10704514f5e3Sopenharmony_ci                EXPECT_TRUE(in_idx == -1);
10714514f5e3Sopenharmony_ci                EXPECT_TRUE(nonin_idx == 0);
10724514f5e3Sopenharmony_ci            }
10734514f5e3Sopenharmony_ci        }
10744514f5e3Sopenharmony_ci    }
10754514f5e3Sopenharmony_ci}
10764514f5e3Sopenharmony_ci
10774514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithNamedPropertieNonPureStringKey)
10784514f5e3Sopenharmony_ci{
10794514f5e3Sopenharmony_ci    LocalScope scope(vm_);
10804514f5e3Sopenharmony_ci    const char *keys[] = {
10814514f5e3Sopenharmony_ci        "1",
10824514f5e3Sopenharmony_ci    };
10834514f5e3Sopenharmony_ci    Local<JSValueRef> values[] = {
10844514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "value1"),
10854514f5e3Sopenharmony_ci    };
10864514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::NewWithNamedProperties(vm_, 2, keys, values);
10874514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(object);
10884514f5e3Sopenharmony_ci    EXPECT_TRUE(obj.GetTaggedValue() == JSTaggedValue::Undefined());
10894514f5e3Sopenharmony_ci    thread_->ClearException();
10904514f5e3Sopenharmony_ci}
10914514f5e3Sopenharmony_ci
10924514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithNamedPropertiesDuplicate)
10934514f5e3Sopenharmony_ci{
10944514f5e3Sopenharmony_ci    LocalScope scope(vm_);
10954514f5e3Sopenharmony_ci    const char *keys[] = {
10964514f5e3Sopenharmony_ci        DUPLICATE_KEY,
10974514f5e3Sopenharmony_ci        SIMPLE_KEY,
10984514f5e3Sopenharmony_ci        DUPLICATE_KEY,
10994514f5e3Sopenharmony_ci    };
11004514f5e3Sopenharmony_ci    Local<JSValueRef> values[] = {
11014514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "value1"),
11024514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "value2"),
11034514f5e3Sopenharmony_ci        StringRef::NewFromUtf8(vm_, "value3"),
11044514f5e3Sopenharmony_ci    };
11054514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::NewWithNamedProperties(vm_, 3, keys, values);
11064514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(object);
11074514f5e3Sopenharmony_ci    EXPECT_TRUE(obj.GetTaggedValue() == JSTaggedValue::Undefined());
11084514f5e3Sopenharmony_ci    thread_->ClearException();
11094514f5e3Sopenharmony_ci}
11104514f5e3Sopenharmony_ci
11114514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetNamedPropertyByPassingUtf8Key)
11124514f5e3Sopenharmony_ci{
11134514f5e3Sopenharmony_ci    LocalScope scope(vm_);
11144514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::New(vm_);
11154514f5e3Sopenharmony_ci    const char* utf8Key = "TestKey";
11164514f5e3Sopenharmony_ci    Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, utf8Key);
11174514f5e3Sopenharmony_ci    Local<JSValueRef> value = ObjectRef::New(vm_);
11184514f5e3Sopenharmony_ci    PropertyAttribute attribute(value, true, true, true);
11194514f5e3Sopenharmony_ci
11204514f5e3Sopenharmony_ci    ASSERT_TRUE(object->DefineProperty(vm_, key, attribute));
11214514f5e3Sopenharmony_ci    Local<JSValueRef> value1 = object->Get(vm_, utf8Key);
11224514f5e3Sopenharmony_ci    ASSERT_TRUE(value->IsStrictEquals(vm_, value1));
11234514f5e3Sopenharmony_ci}
11244514f5e3Sopenharmony_ci
11254514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetNamedPropertyByPassingUtf8Key)
11264514f5e3Sopenharmony_ci{
11274514f5e3Sopenharmony_ci    LocalScope scope(vm_);
11284514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::New(vm_);
11294514f5e3Sopenharmony_ci    const char* utf8Key = "TestKey";
11304514f5e3Sopenharmony_ci    Local<JSValueRef> value = ObjectRef::New(vm_);
11314514f5e3Sopenharmony_ci
11324514f5e3Sopenharmony_ci    ASSERT_TRUE(object->Set(vm_, utf8Key, value));
11334514f5e3Sopenharmony_ci    Local<JSValueRef> value1 = object->Get(vm_, utf8Key);
11344514f5e3Sopenharmony_ci    ASSERT_TRUE(value->IsStrictEquals(vm_, value1));
11354514f5e3Sopenharmony_ci}
11364514f5e3Sopenharmony_ci
11374514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiFastPathGetNamedProperty)
11384514f5e3Sopenharmony_ci{
11394514f5e3Sopenharmony_ci    LocalScope scope(vm_);
11404514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::New(vm_);
11414514f5e3Sopenharmony_ci    const char* utf8Key = "TestKey";
11424514f5e3Sopenharmony_ci    Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, utf8Key);
11434514f5e3Sopenharmony_ci    Local<JSValueRef> value = ObjectRef::New(vm_);
11444514f5e3Sopenharmony_ci    PropertyAttribute attribute(value, true, true, true);
11454514f5e3Sopenharmony_ci
11464514f5e3Sopenharmony_ci    ASSERT_TRUE(object->DefineProperty(vm_, key, attribute));
11474514f5e3Sopenharmony_ci    Local<JSValueRef> value1 = JSNApi::NapiGetNamedProperty(vm_, reinterpret_cast<uintptr_t>(*object), utf8Key);
11484514f5e3Sopenharmony_ci    ASSERT_TRUE(value->IsStrictEquals(vm_, value1));
11494514f5e3Sopenharmony_ci}
11504514f5e3Sopenharmony_ci
11514514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithPropertiesDuplicateWithKeyNotFromStringTable)
11524514f5e3Sopenharmony_ci{
11534514f5e3Sopenharmony_ci    LocalScope scope(vm_);
11544514f5e3Sopenharmony_ci    Local<JSValueRef> keys[] = {
11554514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, DUPLICATE_KEY),
11564514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, SIMPLE_KEY),
11574514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, DUPLICATE_KEY),
11584514f5e3Sopenharmony_ci    };
11594514f5e3Sopenharmony_ci    Local<JSValueRef> values[] = {
11604514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, "value1"),
11614514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, "value2"),
11624514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, "value3"),
11634514f5e3Sopenharmony_ci    };
11644514f5e3Sopenharmony_ci    PropertyAttribute attributes[] = {
11654514f5e3Sopenharmony_ci        PropertyAttribute(values[0], true, true, true),
11664514f5e3Sopenharmony_ci        PropertyAttribute(values[1], true, true, true),
11674514f5e3Sopenharmony_ci        PropertyAttribute(values[2], true, true, true),
11684514f5e3Sopenharmony_ci    };
11694514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::NewWithProperties(vm_, 3, keys, attributes);
11704514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(object);
11714514f5e3Sopenharmony_ci    EXPECT_TRUE(obj.GetTaggedValue() == JSTaggedValue::Undefined());
11724514f5e3Sopenharmony_ci    thread_->ClearException();
11734514f5e3Sopenharmony_ci}
11744514f5e3Sopenharmony_ci
11754514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithPropertiesDuplicateWithKeyNotFromStringTable1)
11764514f5e3Sopenharmony_ci{
11774514f5e3Sopenharmony_ci    LocalScope scope(vm_);
11784514f5e3Sopenharmony_ci    Local<JSValueRef> keys[] = {
11794514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, DUPLICATE_KEY, 0),
11804514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, SIMPLE_KEY, 0),
11814514f5e3Sopenharmony_ci        StringRef::NewFromUtf8WithoutStringTable(vm_, DUPLICATE_KEY, 0),
11824514f5e3Sopenharmony_ci    };
11834514f5e3Sopenharmony_ci    Local<JSValueRef> values[] = {
11844514f5e3Sopenharmony_ci        StringRef::NewFromUtf16WithoutStringTable(vm_, UTF_16, 0),
11854514f5e3Sopenharmony_ci        StringRef::NewFromUtf16WithoutStringTable(vm_, UTF_16, 0),
11864514f5e3Sopenharmony_ci        StringRef::NewFromUtf16WithoutStringTable(vm_, UTF_16, 0),
11874514f5e3Sopenharmony_ci    };
11884514f5e3Sopenharmony_ci    PropertyAttribute attributes[] = {
11894514f5e3Sopenharmony_ci        PropertyAttribute(values[0], true, true, true),
11904514f5e3Sopenharmony_ci        PropertyAttribute(values[1], true, true, true),
11914514f5e3Sopenharmony_ci        PropertyAttribute(values[2], true, true, true),
11924514f5e3Sopenharmony_ci    };
11934514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::NewWithProperties(vm_, 3, keys, attributes);
11944514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(object);
11954514f5e3Sopenharmony_ci    EXPECT_TRUE(obj.GetTaggedValue() == JSTaggedValue::Undefined());
11964514f5e3Sopenharmony_ci    thread_->ClearException();
11974514f5e3Sopenharmony_ci}
11984514f5e3Sopenharmony_ci
11994514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, EcmaObjectToInt)
12004514f5e3Sopenharmony_ci{
12014514f5e3Sopenharmony_ci    LocalScope scope(vm_);
12024514f5e3Sopenharmony_ci    Local<FunctionRef> toPrimitiveFunc = FunctionRef::New(vm_,
12034514f5e3Sopenharmony_ci        [](JsiRuntimeCallInfo *runtimeInfo) -> Local<JSValueRef> {
12044514f5e3Sopenharmony_ci            EcmaVM *vm = runtimeInfo->GetVM();
12054514f5e3Sopenharmony_ci            return JSValueRef::True(vm);
12064514f5e3Sopenharmony_ci        });
12074514f5e3Sopenharmony_ci    Local<ObjectRef> obj = ObjectRef::New(vm_);
12084514f5e3Sopenharmony_ci    PropertyAttribute attribute(toPrimitiveFunc, true, true, true);
12094514f5e3Sopenharmony_ci    Local<JSValueRef> toPrimitiveKey = JSNApiHelper::ToLocal<JSValueRef>(vm_->GetGlobalEnv()->GetToPrimitiveSymbol());
12104514f5e3Sopenharmony_ci    obj->DefineProperty(vm_, toPrimitiveKey, attribute);
12114514f5e3Sopenharmony_ci    {
12124514f5e3Sopenharmony_ci        // Test that Uint32Value and Int32Value should transition to Running if needed.
12134514f5e3Sopenharmony_ci        ThreadNativeScope nativeScope(thread_);
12144514f5e3Sopenharmony_ci        uint32_t res = obj->Uint32Value(vm_);
12154514f5e3Sopenharmony_ci        EXPECT_TRUE(res == 1);
12164514f5e3Sopenharmony_ci        res = obj->Int32Value(vm_);
12174514f5e3Sopenharmony_ci        EXPECT_TRUE(res == 1);
12184514f5e3Sopenharmony_ci    }
12194514f5e3Sopenharmony_ci}
12204514f5e3Sopenharmony_ci
12214514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiTryFastTest)
12224514f5e3Sopenharmony_ci{
12234514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::New(vm_);
12244514f5e3Sopenharmony_ci    JSTaggedValue a(0);
12254514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> handle(thread_, a);
12264514f5e3Sopenharmony_ci    Local<JSValueRef> key = JSNApiHelper::ToLocal<JSValueRef>(handle);
12274514f5e3Sopenharmony_ci    const char* utf8Key = "TestKey";
12284514f5e3Sopenharmony_ci    Local<JSValueRef> key2 = StringRef::NewFromUtf8(vm_, utf8Key);
12294514f5e3Sopenharmony_ci    Local<JSValueRef> value = ObjectRef::New(vm_);
12304514f5e3Sopenharmony_ci    object->Set(vm_, key, value);
12314514f5e3Sopenharmony_ci    object->Set(vm_, key2, value);
12324514f5e3Sopenharmony_ci    Local<JSValueRef> res1 = JSNApi::NapiGetProperty(vm_, reinterpret_cast<uintptr_t>(*object),
12334514f5e3Sopenharmony_ci                                                       reinterpret_cast<uintptr_t>(*key));
12344514f5e3Sopenharmony_ci    ASSERT_TRUE(value->IsStrictEquals(vm_, res1));
12354514f5e3Sopenharmony_ci    Local<JSValueRef> res2 = JSNApi::NapiGetProperty(vm_, reinterpret_cast<uintptr_t>(*object),
12364514f5e3Sopenharmony_ci                                                       reinterpret_cast<uintptr_t>(*key2));
12374514f5e3Sopenharmony_ci    ASSERT_TRUE(value->IsStrictEquals(vm_, res2));
12384514f5e3Sopenharmony_ci
12394514f5e3Sopenharmony_ci    Local<JSValueRef> flag = JSNApi::NapiHasProperty(vm_, reinterpret_cast<uintptr_t>(*object),
12404514f5e3Sopenharmony_ci                                                     reinterpret_cast<uintptr_t>(*key));
12414514f5e3Sopenharmony_ci    ASSERT_TRUE(flag->BooleaValue(vm_));
12424514f5e3Sopenharmony_ci    flag = JSNApi::NapiHasProperty(vm_, reinterpret_cast<uintptr_t>(*object), reinterpret_cast<uintptr_t>(*key2));
12434514f5e3Sopenharmony_ci    ASSERT_TRUE(flag->BooleaValue(vm_));
12444514f5e3Sopenharmony_ci
12454514f5e3Sopenharmony_ci    flag = JSNApi::NapiDeleteProperty(vm_, reinterpret_cast<uintptr_t>(*object), reinterpret_cast<uintptr_t>(*key));
12464514f5e3Sopenharmony_ci    ASSERT_TRUE(flag->BooleaValue(vm_));
12474514f5e3Sopenharmony_ci    flag = JSNApi::NapiDeleteProperty(vm_, reinterpret_cast<uintptr_t>(*object), reinterpret_cast<uintptr_t>(*key2));
12484514f5e3Sopenharmony_ci    ASSERT_TRUE(flag->BooleaValue(vm_));
12494514f5e3Sopenharmony_ci
12504514f5e3Sopenharmony_ci    flag = JSNApi::NapiHasProperty(vm_, reinterpret_cast<uintptr_t>(*object), reinterpret_cast<uintptr_t>(*key));
12514514f5e3Sopenharmony_ci    ASSERT_FALSE(flag->BooleaValue(vm_));
12524514f5e3Sopenharmony_ci    flag = JSNApi::NapiHasProperty(vm_, reinterpret_cast<uintptr_t>(*object), reinterpret_cast<uintptr_t>(*key2));
12534514f5e3Sopenharmony_ci    ASSERT_FALSE(flag->BooleaValue(vm_));
12544514f5e3Sopenharmony_ci}
12554514f5e3Sopenharmony_ci
12564514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiTryFastHasMethodTest)
12574514f5e3Sopenharmony_ci{
12584514f5e3Sopenharmony_ci    LocalScope scope(vm_);
12594514f5e3Sopenharmony_ci    auto array = JSArray::ArrayCreate(thread_, JSTaggedNumber(0));
12604514f5e3Sopenharmony_ci    auto arr = JSNApiHelper::ToLocal<ObjectRef>(array);
12614514f5e3Sopenharmony_ci    const char* utf8Key = "concat";
12624514f5e3Sopenharmony_ci    Local<JSValueRef> key3 = StringRef::NewFromUtf8(vm_, utf8Key);
12634514f5e3Sopenharmony_ci    auto flag = JSNApi::NapiHasProperty(vm_, reinterpret_cast<uintptr_t>(*arr), reinterpret_cast<uintptr_t>(*key3));
12644514f5e3Sopenharmony_ci    ASSERT_TRUE(flag->BooleaValue(vm_));
12654514f5e3Sopenharmony_ci}
12664514f5e3Sopenharmony_ci
12674514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiExternalStringCacheTest001)
12684514f5e3Sopenharmony_ci{
12694514f5e3Sopenharmony_ci    isStringCacheTableCreated_ = ExternalStringCache::RegisterStringCacheTable(vm_, 0);
12704514f5e3Sopenharmony_ci    ASSERT_FALSE(isStringCacheTableCreated_);
12714514f5e3Sopenharmony_ci}
12724514f5e3Sopenharmony_ci
12734514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiExternalStringCacheTest002)
12744514f5e3Sopenharmony_ci{
12754514f5e3Sopenharmony_ci    constexpr uint32_t STRING_CACHE_TABLE_SIZE = 300;
12764514f5e3Sopenharmony_ci    isStringCacheTableCreated_ = ExternalStringCache::RegisterStringCacheTable(vm_, STRING_CACHE_TABLE_SIZE);
12774514f5e3Sopenharmony_ci    ASSERT_FALSE(isStringCacheTableCreated_);
12784514f5e3Sopenharmony_ci}
12794514f5e3Sopenharmony_ci
12804514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiExternalStringCacheTest003)
12814514f5e3Sopenharmony_ci{
12824514f5e3Sopenharmony_ci    constexpr uint32_t STRING_CACHE_TABLE_SIZE = 100;
12834514f5e3Sopenharmony_ci    isStringCacheTableCreated_ = ExternalStringCache::RegisterStringCacheTable(vm_, STRING_CACHE_TABLE_SIZE);
12844514f5e3Sopenharmony_ci    ASSERT_TRUE(isStringCacheTableCreated_);
12854514f5e3Sopenharmony_ci}
12864514f5e3Sopenharmony_ci
12874514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiExternalStringCacheTest004)
12884514f5e3Sopenharmony_ci{
12894514f5e3Sopenharmony_ci    RegisterStringCacheTable();
12904514f5e3Sopenharmony_ci    constexpr uint32_t PROPERTY_INDEX = 101;
12914514f5e3Sopenharmony_ci    constexpr char property[] = "hello";
12924514f5e3Sopenharmony_ci    auto res = ExternalStringCache::SetCachedString(vm_, property, PROPERTY_INDEX);
12934514f5e3Sopenharmony_ci    ASSERT_FALSE(res);
12944514f5e3Sopenharmony_ci}
12954514f5e3Sopenharmony_ci
12964514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiExternalStringCacheTest005)
12974514f5e3Sopenharmony_ci{
12984514f5e3Sopenharmony_ci    RegisterStringCacheTable();
12994514f5e3Sopenharmony_ci    constexpr uint32_t PROPERTY_INDEX = 0;
13004514f5e3Sopenharmony_ci    constexpr char property[] = "hello";
13014514f5e3Sopenharmony_ci    auto res = ExternalStringCache::SetCachedString(vm_, property, PROPERTY_INDEX);
13024514f5e3Sopenharmony_ci    ASSERT_TRUE(res);
13034514f5e3Sopenharmony_ci}
13044514f5e3Sopenharmony_ci
13054514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiExternalStringCacheTest006)
13064514f5e3Sopenharmony_ci{
13074514f5e3Sopenharmony_ci    RegisterStringCacheTable();
13084514f5e3Sopenharmony_ci    constexpr uint32_t PROPERTY_INDEX = 1;
13094514f5e3Sopenharmony_ci    constexpr char property[] = "hello";
13104514f5e3Sopenharmony_ci    auto res = ExternalStringCache::SetCachedString(vm_, property, PROPERTY_INDEX);
13114514f5e3Sopenharmony_ci    ASSERT_TRUE(res);
13124514f5e3Sopenharmony_ci
13134514f5e3Sopenharmony_ci    constexpr uint32_t QUERY_PROPERTY_INDEX = 2;
13144514f5e3Sopenharmony_ci    res = ExternalStringCache::HasCachedString(vm_, QUERY_PROPERTY_INDEX);
13154514f5e3Sopenharmony_ci    ASSERT_FALSE(res);
13164514f5e3Sopenharmony_ci}
13174514f5e3Sopenharmony_ci
13184514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiExternalStringCacheTest007)
13194514f5e3Sopenharmony_ci{
13204514f5e3Sopenharmony_ci    RegisterStringCacheTable();
13214514f5e3Sopenharmony_ci    constexpr uint32_t PROPERTY_INDEX = 2;
13224514f5e3Sopenharmony_ci    constexpr char property[] = "hello";
13234514f5e3Sopenharmony_ci    auto res = ExternalStringCache::SetCachedString(vm_, property, PROPERTY_INDEX);
13244514f5e3Sopenharmony_ci    ASSERT_TRUE(res);
13254514f5e3Sopenharmony_ci
13264514f5e3Sopenharmony_ci    constexpr uint32_t QUERY_PROPERTY_INDEX = 2;
13274514f5e3Sopenharmony_ci    res = ExternalStringCache::HasCachedString(vm_, QUERY_PROPERTY_INDEX);
13284514f5e3Sopenharmony_ci    ASSERT_TRUE(res);
13294514f5e3Sopenharmony_ci}
13304514f5e3Sopenharmony_ci
13314514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NapiExternalStringCacheTest008)
13324514f5e3Sopenharmony_ci{
13334514f5e3Sopenharmony_ci    RegisterStringCacheTable();
13344514f5e3Sopenharmony_ci    constexpr uint32_t PROPERTY_INDEX = 3;
13354514f5e3Sopenharmony_ci    constexpr char property[] = "hello world";
13364514f5e3Sopenharmony_ci    auto res = ExternalStringCache::SetCachedString(vm_, property, PROPERTY_INDEX);
13374514f5e3Sopenharmony_ci    ASSERT_TRUE(res);
13384514f5e3Sopenharmony_ci    Local<StringRef> value = ExternalStringCache::GetCachedString(vm_, PROPERTY_INDEX);
13394514f5e3Sopenharmony_ci    ASSERT_FALSE(value->IsUndefined());
13404514f5e3Sopenharmony_ci    EXPECT_EQ(value->ToString(vm_), property);
13414514f5e3Sopenharmony_ci}
13424514f5e3Sopenharmony_ci
13434514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetExecuteMode)
13444514f5e3Sopenharmony_ci{
13454514f5e3Sopenharmony_ci    ecmascript::ModuleManager *moduleManager = thread_->GetCurrentEcmaContext()->GetModuleManager();
13464514f5e3Sopenharmony_ci    ecmascript::ModuleExecuteMode res1 = moduleManager->GetExecuteMode();
13474514f5e3Sopenharmony_ci    EXPECT_EQ(res1, ecmascript::ModuleExecuteMode::ExecuteZipMode);
13484514f5e3Sopenharmony_ci
13494514f5e3Sopenharmony_ci    JSNApi::SetExecuteBufferMode(vm_);
13504514f5e3Sopenharmony_ci    ecmascript::ModuleExecuteMode res2 = moduleManager->GetExecuteMode();
13514514f5e3Sopenharmony_ci    EXPECT_EQ(res2, ecmascript::ModuleExecuteMode::ExecuteBufferMode);
13524514f5e3Sopenharmony_ci}
13534514f5e3Sopenharmony_ci} // namespace panda::test
1354