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