14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2023-2024 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_object-inl.h" 374514f5e3Sopenharmony_ci#include "ecmascript/js_primitive_ref.h" 384514f5e3Sopenharmony_ci#include "ecmascript/js_regexp.h" 394514f5e3Sopenharmony_ci#include "ecmascript/js_runtime_options.h" 404514f5e3Sopenharmony_ci#include "ecmascript/js_set.h" 414514f5e3Sopenharmony_ci#include "ecmascript/js_set_iterator.h" 424514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h" 434514f5e3Sopenharmony_ci#include "ecmascript/js_thread.h" 444514f5e3Sopenharmony_ci#include "ecmascript/js_weak_container.h" 454514f5e3Sopenharmony_ci#include "ecmascript/linked_hash_table.h" 464514f5e3Sopenharmony_ci#include "ecmascript/mem/mem_map_allocator.h" 474514f5e3Sopenharmony_ci#include "ecmascript/module/js_module_manager.h" 484514f5e3Sopenharmony_ci#include "ecmascript/module/js_module_source_text.h" 494514f5e3Sopenharmony_ci#include "ecmascript/napi/include/jsnapi.h" 504514f5e3Sopenharmony_ci#include "ecmascript/napi/include/jsnapi_internals.h" 514514f5e3Sopenharmony_ci#include "ecmascript/napi/jsnapi_helper.h" 524514f5e3Sopenharmony_ci#include "ecmascript/object_factory.h" 534514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler.h" 544514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler_decoder.h" 554514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler_encoder.h" 564514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler_manager.h" 574514f5e3Sopenharmony_ci#include "ecmascript/tagged_array.h" 584514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h" 594514f5e3Sopenharmony_ci#include "ecmascript/tagged_tree.h" 604514f5e3Sopenharmony_ci#include "ecmascript/weak_vector.h" 614514f5e3Sopenharmony_ci#include "ecmascript/regexp/regexp_parser.h" 624514f5e3Sopenharmony_ci#include "gtest/gtest.h" 634514f5e3Sopenharmony_ci#include "jsnapi_expo.h" 644514f5e3Sopenharmony_ci 654514f5e3Sopenharmony_ciusing namespace panda; 664514f5e3Sopenharmony_ciusing namespace panda::ecmascript; 674514f5e3Sopenharmony_ciusing namespace panda::ecmascript::kungfu; 684514f5e3Sopenharmony_ci 694514f5e3Sopenharmony_cistatic constexpr char TEST_CHAR_STRING_FLAGS[] = "gimsuy"; 704514f5e3Sopenharmony_cistatic constexpr char TEST_CHAR_STRING_STATE[] = "closed"; 714514f5e3Sopenharmony_ci 724514f5e3Sopenharmony_cinamespace panda::test { 734514f5e3Sopenharmony_ciusing BuiltinsFunction = ecmascript::builtins::BuiltinsFunction; 744514f5e3Sopenharmony_ciusing PGOProfilerManager = panda::ecmascript::pgo::PGOProfilerManager; 754514f5e3Sopenharmony_ciusing FunctionForRef = Local<JSValueRef> (*)(JsiRuntimeCallInfo *); 764514f5e3Sopenharmony_ciclass JSNApiTests : public testing::Test { 774514f5e3Sopenharmony_cipublic: 784514f5e3Sopenharmony_ci static void SetUpTestCase() 794514f5e3Sopenharmony_ci { 804514f5e3Sopenharmony_ci GTEST_LOG_(INFO) << "SetUpTestCase"; 814514f5e3Sopenharmony_ci } 824514f5e3Sopenharmony_ci 834514f5e3Sopenharmony_ci static void TearDownTestCase() 844514f5e3Sopenharmony_ci { 854514f5e3Sopenharmony_ci GTEST_LOG_(INFO) << "TearDownCase"; 864514f5e3Sopenharmony_ci } 874514f5e3Sopenharmony_ci 884514f5e3Sopenharmony_ci void SetUp() override 894514f5e3Sopenharmony_ci { 904514f5e3Sopenharmony_ci RuntimeOption option; 914514f5e3Sopenharmony_ci option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR); 924514f5e3Sopenharmony_ci vm_ = JSNApi::CreateJSVM(option); 934514f5e3Sopenharmony_ci ASSERT_TRUE(vm_ != nullptr) << "Cannot create Runtime"; 944514f5e3Sopenharmony_ci thread_ = vm_->GetJSThread(); 954514f5e3Sopenharmony_ci vm_->SetEnableForceGC(true); 964514f5e3Sopenharmony_ci thread_->ManagedCodeBegin(); 974514f5e3Sopenharmony_ci } 984514f5e3Sopenharmony_ci 994514f5e3Sopenharmony_ci void TearDown() override 1004514f5e3Sopenharmony_ci { 1014514f5e3Sopenharmony_ci thread_->ManagedCodeEnd(); 1024514f5e3Sopenharmony_ci vm_->SetEnableForceGC(false); 1034514f5e3Sopenharmony_ci JSNApi::DestroyJSVM(vm_); 1044514f5e3Sopenharmony_ci } 1054514f5e3Sopenharmony_ci 1064514f5e3Sopenharmony_ci template <typename T> void TestNumberRef(T val, TaggedType expected) 1074514f5e3Sopenharmony_ci { 1084514f5e3Sopenharmony_ci LocalScope scope(vm_); 1094514f5e3Sopenharmony_ci Local<NumberRef> obj = NumberRef::New(vm_, val); 1104514f5e3Sopenharmony_ci ASSERT_TRUE(obj->IsNumber()); 1114514f5e3Sopenharmony_ci JSTaggedType res = JSNApiHelper::ToJSTaggedValue(*obj).GetRawData(); 1124514f5e3Sopenharmony_ci ASSERT_EQ(res, expected); 1134514f5e3Sopenharmony_ci if constexpr (std::is_floating_point_v<T>) { 1144514f5e3Sopenharmony_ci if (std::isnan(val)) { 1154514f5e3Sopenharmony_ci ASSERT_TRUE(std::isnan(obj->Value())); 1164514f5e3Sopenharmony_ci } else { 1174514f5e3Sopenharmony_ci ASSERT_EQ(obj->Value(), val); 1184514f5e3Sopenharmony_ci } 1194514f5e3Sopenharmony_ci } else if constexpr (sizeof(T) >= sizeof(int32_t)) { 1204514f5e3Sopenharmony_ci ASSERT_EQ(obj->IntegerValue(vm_), val); 1214514f5e3Sopenharmony_ci } else if constexpr (std::is_signed_v<T>) { 1224514f5e3Sopenharmony_ci ASSERT_EQ(obj->Int32Value(vm_), val); 1234514f5e3Sopenharmony_ci } else { 1244514f5e3Sopenharmony_ci ASSERT_EQ(obj->Uint32Value(vm_), val); 1254514f5e3Sopenharmony_ci } 1264514f5e3Sopenharmony_ci } 1274514f5e3Sopenharmony_ci 1284514f5e3Sopenharmony_ci TaggedType ConvertDouble(double val) 1294514f5e3Sopenharmony_ci { 1304514f5e3Sopenharmony_ci return base::bit_cast<JSTaggedType>(val) + JSTaggedValue::DOUBLE_ENCODE_OFFSET; 1314514f5e3Sopenharmony_ci } 1324514f5e3Sopenharmony_ci 1334514f5e3Sopenharmony_ciprotected: 1344514f5e3Sopenharmony_ci JSThread *thread_ = nullptr; 1354514f5e3Sopenharmony_ci EcmaVM *vm_ = nullptr; 1364514f5e3Sopenharmony_ci}; 1374514f5e3Sopenharmony_ci 1384514f5e3Sopenharmony_ciLocal<JSValueRef> FunctionCallback(JsiRuntimeCallInfo *info) 1394514f5e3Sopenharmony_ci{ 1404514f5e3Sopenharmony_ci EscapeLocalScope scope(info->GetVM()); 1414514f5e3Sopenharmony_ci return scope.Escape(ArrayRef::New(info->GetVM(), info->GetArgsNumber())); 1424514f5e3Sopenharmony_ci} 1434514f5e3Sopenharmony_ci 1444514f5e3Sopenharmony_civoid WeakRefCallback(EcmaVM *vm) 1454514f5e3Sopenharmony_ci{ 1464514f5e3Sopenharmony_ci LocalScope scope(vm); 1474514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm); 1484514f5e3Sopenharmony_ci Global<ObjectRef> globalObject(vm, object); 1494514f5e3Sopenharmony_ci globalObject.SetWeak(); 1504514f5e3Sopenharmony_ci Local<ObjectRef> object1 = ObjectRef::New(vm); 1514514f5e3Sopenharmony_ci Global<ObjectRef> globalObject1(vm, object1); 1524514f5e3Sopenharmony_ci globalObject1.SetWeak(); 1534514f5e3Sopenharmony_ci vm->CollectGarbage(TriggerGCType::YOUNG_GC); 1544514f5e3Sopenharmony_ci vm->CollectGarbage(TriggerGCType::OLD_GC); 1554514f5e3Sopenharmony_ci globalObject.FreeGlobalHandleAddr(); 1564514f5e3Sopenharmony_ci} 1574514f5e3Sopenharmony_ci 1584514f5e3Sopenharmony_civoid ThreadCheck(const EcmaVM *vm) 1594514f5e3Sopenharmony_ci{ 1604514f5e3Sopenharmony_ci EXPECT_TRUE(vm->GetJSThread()->GetThreadId() != JSThread::GetCurrentThreadId()); 1614514f5e3Sopenharmony_ci} 1624514f5e3Sopenharmony_ci 1634514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetGlobalObject) 1644514f5e3Sopenharmony_ci{ 1654514f5e3Sopenharmony_ci LocalScope scope(vm_); 1664514f5e3Sopenharmony_ci Local<ObjectRef> globalObject = JSNApi::GetGlobalObject(vm_); 1674514f5e3Sopenharmony_ci ASSERT_FALSE(globalObject.IsEmpty()); 1684514f5e3Sopenharmony_ci ASSERT_TRUE(globalObject->IsObject(vm_)); 1694514f5e3Sopenharmony_ci} 1704514f5e3Sopenharmony_ci 1714514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ThreadIdCheck) 1724514f5e3Sopenharmony_ci{ 1734514f5e3Sopenharmony_ci EXPECT_TRUE(vm_->GetJSThread()->GetThreadId() == JSThread::GetCurrentThreadId()); 1744514f5e3Sopenharmony_ci} 1754514f5e3Sopenharmony_ci 1764514f5e3Sopenharmony_ci/** 1774514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_001 1784514f5e3Sopenharmony_ci * @tc.name: RegisterFunction 1794514f5e3Sopenharmony_ci * @tc.desc:Through the FunctionRef:: New method, we can obtain a reference to the function, register and execute it, 1804514f5e3Sopenharmony_ci * confirm that the return value is an array, and the length of the array is the same as the length of 1814514f5e3Sopenharmony_ci * the passed in parameter list. 1824514f5e3Sopenharmony_ci * @tc.type: FUNC 1834514f5e3Sopenharmony_ci * @tc.require: parameter 1844514f5e3Sopenharmony_ci */ 1854514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, RegisterFunction) 1864514f5e3Sopenharmony_ci{ 1874514f5e3Sopenharmony_ci LocalScope scope(vm_); 1884514f5e3Sopenharmony_ci Local<FunctionRef> callback = FunctionRef::New(vm_, FunctionCallback); 1894514f5e3Sopenharmony_ci ASSERT_TRUE(!callback.IsEmpty()); 1904514f5e3Sopenharmony_ci std::vector<Local<JSValueRef>> arguments; 1914514f5e3Sopenharmony_ci arguments.emplace_back(JSValueRef::Undefined(vm_)); 1924514f5e3Sopenharmony_ci Local<JSValueRef> result = callback->Call(vm_, JSValueRef::Undefined(vm_), 1934514f5e3Sopenharmony_ci arguments.data(), arguments.size()); 1944514f5e3Sopenharmony_ci ASSERT_TRUE(result->IsArray(vm_)); 1954514f5e3Sopenharmony_ci Local<ArrayRef> array(result); 1964514f5e3Sopenharmony_ci ASSERT_EQ(static_cast<uint64_t>(array->Length(vm_)), arguments.size()); 1974514f5e3Sopenharmony_ci} 1984514f5e3Sopenharmony_ci 1994514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetProperty) 2004514f5e3Sopenharmony_ci{ 2014514f5e3Sopenharmony_ci LocalScope scope(vm_); 2024514f5e3Sopenharmony_ci Local<ObjectRef> globalObject = JSNApi::GetGlobalObject(vm_); 2034514f5e3Sopenharmony_ci ASSERT_FALSE(globalObject.IsEmpty()); 2044514f5e3Sopenharmony_ci ASSERT_TRUE(globalObject->IsObject(vm_)); 2054514f5e3Sopenharmony_ci 2064514f5e3Sopenharmony_ci Local<ObjectRef> key = StringRef::NewFromUtf8(vm_, "Number"); 2074514f5e3Sopenharmony_ci Local<ObjectRef> property = globalObject->Get(vm_, key); 2084514f5e3Sopenharmony_ci ASSERT_TRUE(property->IsFunction(vm_)); 2094514f5e3Sopenharmony_ci} 2104514f5e3Sopenharmony_ci 2114514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetProperty) 2124514f5e3Sopenharmony_ci{ 2134514f5e3Sopenharmony_ci LocalScope scope(vm_); 2144514f5e3Sopenharmony_ci Local<ObjectRef> globalObject = JSNApi::GetGlobalObject(vm_); 2154514f5e3Sopenharmony_ci ASSERT_FALSE(globalObject.IsEmpty()); 2164514f5e3Sopenharmony_ci ASSERT_TRUE(globalObject->IsObject(vm_)); 2174514f5e3Sopenharmony_ci 2184514f5e3Sopenharmony_ci Local<ArrayRef> property = ArrayRef::New(vm_, 3); // 3 : length 2194514f5e3Sopenharmony_ci ASSERT_TRUE(property->IsArray(vm_)); 2204514f5e3Sopenharmony_ci ASSERT_EQ(property->Length(vm_), 3U); // 3 : test case of input 2214514f5e3Sopenharmony_ci 2224514f5e3Sopenharmony_ci Local<ObjectRef> key = StringRef::NewFromUtf8(vm_, "Test"); 2234514f5e3Sopenharmony_ci bool result = globalObject->Set(vm_, key, property); 2244514f5e3Sopenharmony_ci ASSERT_TRUE(result); 2254514f5e3Sopenharmony_ci 2264514f5e3Sopenharmony_ci Local<ObjectRef> propertyGet = globalObject->Get(vm_, key); 2274514f5e3Sopenharmony_ci ASSERT_TRUE(propertyGet->IsArray(vm_)); 2284514f5e3Sopenharmony_ci ASSERT_EQ(Local<ArrayRef>(propertyGet)->Length(vm_), 3U); // 3 : test case of input 2294514f5e3Sopenharmony_ci} 2304514f5e3Sopenharmony_ci 2314514f5e3Sopenharmony_ci/** 2324514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_002 2334514f5e3Sopenharmony_ci * @tc.name: JsonParser 2344514f5e3Sopenharmony_ci * @tc.desc:Construct a BufferRef function to determine whether it is a Get 2354514f5e3Sopenharmony_ci * @tc.type: FUNC 2364514f5e3Sopenharmony_ci * @tc.require: parameter 2374514f5e3Sopenharmony_ci */ 2384514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JsonParser) 2394514f5e3Sopenharmony_ci{ 2404514f5e3Sopenharmony_ci LocalScope scope(vm_); 2414514f5e3Sopenharmony_ci Local<ObjectRef> globalObject = JSNApi::GetGlobalObject(vm_); 2424514f5e3Sopenharmony_ci ASSERT_FALSE(globalObject.IsEmpty()); 2434514f5e3Sopenharmony_ci ASSERT_TRUE(globalObject->IsObject(vm_)); 2444514f5e3Sopenharmony_ci 2454514f5e3Sopenharmony_ci const char * const test { R"({"orientation": "portrait"})" }; 2464514f5e3Sopenharmony_ci Local<ObjectRef> jsonString = StringRef::NewFromUtf8(vm_, test); 2474514f5e3Sopenharmony_ci 2484514f5e3Sopenharmony_ci Local<JSValueRef> result = JSON::Parse(vm_, jsonString); 2494514f5e3Sopenharmony_ci ASSERT_TRUE(result->IsObject(vm_)); 2504514f5e3Sopenharmony_ci 2514514f5e3Sopenharmony_ci Local<ObjectRef> keyString = StringRef::NewFromUtf8(vm_, "orientation"); 2524514f5e3Sopenharmony_ci Local<JSValueRef> property = Local<ObjectRef>(result)->Get(vm_, keyString); 2534514f5e3Sopenharmony_ci ASSERT_TRUE(property->IsString(vm_)); 2544514f5e3Sopenharmony_ci} 2554514f5e3Sopenharmony_ci 2564514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, StrictEqual) 2574514f5e3Sopenharmony_ci{ 2584514f5e3Sopenharmony_ci LocalScope scope(vm_); 2594514f5e3Sopenharmony_ci Local<StringRef> origin = StringRef::NewFromUtf8(vm_, "1"); 2604514f5e3Sopenharmony_ci Local<StringRef> target1 = StringRef::NewFromUtf8(vm_, "1"); 2614514f5e3Sopenharmony_ci Local<NumberRef> target = NumberRef::New(vm_, 1); 2624514f5e3Sopenharmony_ci 2634514f5e3Sopenharmony_ci ASSERT_FALSE(origin->IsStrictEquals(vm_, target)); 2644514f5e3Sopenharmony_ci ASSERT_TRUE(origin->IsStrictEquals(vm_, target1)); 2654514f5e3Sopenharmony_ci} 2664514f5e3Sopenharmony_ci 2674514f5e3Sopenharmony_ci/** 2684514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_003 2694514f5e3Sopenharmony_ci * @tc.name: InstanceOf 2704514f5e3Sopenharmony_ci * @tc.desc:Verifying whether the InstanceOf method can correctly determine whether an object is an 2714514f5e3Sopenharmony_ci * instance of another object. 2724514f5e3Sopenharmony_ci * @tc.type: FUNC 2734514f5e3Sopenharmony_ci * @tc.require: parameter 2744514f5e3Sopenharmony_ci */ 2754514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, InstanceOf) 2764514f5e3Sopenharmony_ci{ 2774514f5e3Sopenharmony_ci LocalScope scope(vm_); 2784514f5e3Sopenharmony_ci Local<FunctionRef> target = FunctionRef::New(vm_, nullptr); 2794514f5e3Sopenharmony_ci Local<ArrayRef> origin = ArrayRef::New(vm_, 1); 2804514f5e3Sopenharmony_ci 2814514f5e3Sopenharmony_ci ASSERT_FALSE(origin->InstanceOf(vm_, target)); 2824514f5e3Sopenharmony_ci} 2834514f5e3Sopenharmony_ci 2844514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, TypeOf) 2854514f5e3Sopenharmony_ci{ 2864514f5e3Sopenharmony_ci LocalScope scope(vm_); 2874514f5e3Sopenharmony_ci Local<StringRef> origin = StringRef::NewFromUtf8(vm_, "1"); 2884514f5e3Sopenharmony_ci Local<StringRef> typeString = origin->Typeof(vm_); 2894514f5e3Sopenharmony_ci ASSERT_EQ(typeString->ToString(vm_), "string"); 2904514f5e3Sopenharmony_ci 2914514f5e3Sopenharmony_ci Local<NumberRef> target = NumberRef::New(vm_, 1); 2924514f5e3Sopenharmony_ci typeString = target->Typeof(vm_); 2934514f5e3Sopenharmony_ci ASSERT_EQ(typeString->ToString(vm_), "number"); 2944514f5e3Sopenharmony_ci} 2954514f5e3Sopenharmony_ci 2964514f5e3Sopenharmony_ci/** 2974514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_004 2984514f5e3Sopenharmony_ci * @tc.name: Symbol 2994514f5e3Sopenharmony_ci * @tc.desc: Determine if it is a symbol type 3004514f5e3Sopenharmony_ci * @tc.type: FUNC 3014514f5e3Sopenharmony_ci * @tc.require: parameter 3024514f5e3Sopenharmony_ci */ 3034514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Symbol) 3044514f5e3Sopenharmony_ci{ 3054514f5e3Sopenharmony_ci LocalScope scope(vm_); 3064514f5e3Sopenharmony_ci Local<StringRef> description = StringRef::NewFromUtf8(vm_, "test"); 3074514f5e3Sopenharmony_ci Local<SymbolRef> symbol = SymbolRef::New(vm_, description); 3084514f5e3Sopenharmony_ci 3094514f5e3Sopenharmony_ci ASSERT_FALSE(description->IsSymbol(vm_)); 3104514f5e3Sopenharmony_ci ASSERT_TRUE(symbol->IsSymbol(vm_)); 3114514f5e3Sopenharmony_ci} 3124514f5e3Sopenharmony_ci 3134514f5e3Sopenharmony_ci/** 3144514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_005 3154514f5e3Sopenharmony_ci * @tc.name: StringUtf8_001 3164514f5e3Sopenharmony_ci * @tc.desc: 3174514f5e3Sopenharmony_ci * Utf8Length:Read the non Chinese value length of StringRef according to utf8 type 3184514f5e3Sopenharmony_ci * WriteUtf8:Write the non Chinese value of StringRef to the char array buffer 3194514f5e3Sopenharmony_ci * @tc.type: FUNC 3204514f5e3Sopenharmony_ci * @tc.require: parameter 3214514f5e3Sopenharmony_ci */ 3224514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, StringUtf8_001) 3234514f5e3Sopenharmony_ci{ 3244514f5e3Sopenharmony_ci LocalScope scope(vm_); 3254514f5e3Sopenharmony_ci std::string test = "Hello world"; 3264514f5e3Sopenharmony_ci Local<StringRef> testString = StringRef::NewFromUtf8(vm_, test.c_str()); 3274514f5e3Sopenharmony_ci 3284514f5e3Sopenharmony_ci EXPECT_EQ(testString->Utf8Length(vm_), 12); // 12 : length of testString("Hello World") 3294514f5e3Sopenharmony_ci char buffer[12]; // 12 : length of testString 3304514f5e3Sopenharmony_ci EXPECT_EQ(testString->WriteUtf8(vm_, buffer, 12), 12); // 12 : length of testString("Hello World") 3314514f5e3Sopenharmony_ci std::string res(buffer); 3324514f5e3Sopenharmony_ci ASSERT_EQ(res, test); 3334514f5e3Sopenharmony_ci} 3344514f5e3Sopenharmony_ci 3354514f5e3Sopenharmony_ci/** 3364514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_006 3374514f5e3Sopenharmony_ci * @tc.name: StringUtf8_002 3384514f5e3Sopenharmony_ci * @tc.desc: 3394514f5e3Sopenharmony_ci * Utf8Length:Read the non Chinese value length of StringRef according to utf8 type 3404514f5e3Sopenharmony_ci * WriteUtf8:Write the non Chinese value of StringRef to the char array buffer 3414514f5e3Sopenharmony_ci * @tc.type: FUNC 3424514f5e3Sopenharmony_ci * @tc.require: parameter 3434514f5e3Sopenharmony_ci */ 3444514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, StringUtf8_002) 3454514f5e3Sopenharmony_ci{ 3464514f5e3Sopenharmony_ci LocalScope scope(vm_); 3474514f5e3Sopenharmony_ci std::string test = "年"; 3484514f5e3Sopenharmony_ci Local<StringRef> testString = StringRef::NewFromUtf8(vm_, test.c_str()); 3494514f5e3Sopenharmony_ci 3504514f5e3Sopenharmony_ci EXPECT_EQ(testString->Utf8Length(vm_), 4); // 4 : length of testString("年") 3514514f5e3Sopenharmony_ci char buffer[4]; // 4 : length of testString 3524514f5e3Sopenharmony_ci EXPECT_EQ(testString->WriteUtf8(vm_, buffer, 4), 4); // 4 : length of testString("年") 3534514f5e3Sopenharmony_ci std::string res(buffer); 3544514f5e3Sopenharmony_ci ASSERT_EQ(res, test); 3554514f5e3Sopenharmony_ci} 3564514f5e3Sopenharmony_ci 3574514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, StringUtf8_003) 3584514f5e3Sopenharmony_ci{ 3594514f5e3Sopenharmony_ci LocalScope scope(vm_); 3604514f5e3Sopenharmony_ci std::string str1 = "a"; 3614514f5e3Sopenharmony_ci std::string str2 = "b"; 3624514f5e3Sopenharmony_ci std::string test = str1 + '\0' + str2; 3634514f5e3Sopenharmony_ci 3644514f5e3Sopenharmony_ci // isWriteBuffer == false, \u0000 ==> C080 3654514f5e3Sopenharmony_ci Local<StringRef> testString1 = StringRef::NewFromUtf8(vm_, test.c_str(), test.length()); 3664514f5e3Sopenharmony_ci EXPECT_EQ(testString1->Utf8Length(vm_, false), 5); 3674514f5e3Sopenharmony_ci char buffer1[4]; 3684514f5e3Sopenharmony_ci testString1->WriteUtf8(vm_, buffer1, 4, false); 3694514f5e3Sopenharmony_ci EXPECT_EQ(buffer1[0], 'a'); 3704514f5e3Sopenharmony_ci EXPECT_EQ(buffer1[1], '\xC0'); 3714514f5e3Sopenharmony_ci EXPECT_EQ(buffer1[2], '\x80'); 3724514f5e3Sopenharmony_ci EXPECT_EQ(buffer1[3], 'b'); 3734514f5e3Sopenharmony_ci 3744514f5e3Sopenharmony_ci // isWriteBuffer == true, \u0000 ==> 0x00U 3754514f5e3Sopenharmony_ci Local<StringRef> testString2 = StringRef::NewFromUtf8(vm_, test.c_str(), test.length()); 3764514f5e3Sopenharmony_ci EXPECT_EQ(testString2->Utf8Length(vm_, true), 4); 3774514f5e3Sopenharmony_ci char buffer2[4]; 3784514f5e3Sopenharmony_ci testString2->WriteUtf8(vm_, buffer2, 4, true); 3794514f5e3Sopenharmony_ci EXPECT_EQ(buffer2[0], 'a'); 3804514f5e3Sopenharmony_ci EXPECT_EQ(buffer2[1], '\0'); 3814514f5e3Sopenharmony_ci EXPECT_EQ(buffer2[2], 'b'); 3824514f5e3Sopenharmony_ci} 3834514f5e3Sopenharmony_ci 3844514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, StringEncodeIntoUint8_001) { 3854514f5e3Sopenharmony_ci LocalScope scope(vm_); 3864514f5e3Sopenharmony_ci std::string test = ""; 3874514f5e3Sopenharmony_ci 3884514f5e3Sopenharmony_ci Local<StringRef> testString1 = 3894514f5e3Sopenharmony_ci StringRef::NewFromUtf8(vm_, test.c_str(), test.length()); 3904514f5e3Sopenharmony_ci Local<TypedArrayRef> typedArray = testString1->EncodeIntoUint8Array(vm_); 3914514f5e3Sopenharmony_ci EXPECT_TRUE(typedArray->IsUndefined()); 3924514f5e3Sopenharmony_ci} 3934514f5e3Sopenharmony_ci 3944514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, StringEncodeIntoUint8_002) { 3954514f5e3Sopenharmony_ci LocalScope scope(vm_); 3964514f5e3Sopenharmony_ci std::string test = "abc123"; 3974514f5e3Sopenharmony_ci char excepted[7] = {0x61, 0x62, 0x63, 0x31, 0x32, 0x33, 0}; 3984514f5e3Sopenharmony_ci 3994514f5e3Sopenharmony_ci Local<StringRef> testString1 = 4004514f5e3Sopenharmony_ci StringRef::NewFromUtf8(vm_, test.c_str(), test.length()); 4014514f5e3Sopenharmony_ci Local<TypedArrayRef> typedArray = testString1->EncodeIntoUint8Array(vm_); 4024514f5e3Sopenharmony_ci 4034514f5e3Sopenharmony_ci char *res = reinterpret_cast<char *>(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_)); 4044514f5e3Sopenharmony_ci 4054514f5e3Sopenharmony_ci ASSERT_STREQ(res, excepted); 4064514f5e3Sopenharmony_ci} 4074514f5e3Sopenharmony_ci 4084514f5e3Sopenharmony_ci/** 4094514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_007 4104514f5e3Sopenharmony_ci * @tc.name: StringLatin1_001 4114514f5e3Sopenharmony_ci * @tc.desc: 4124514f5e3Sopenharmony_ci * WriteLatin1:Write the Chinese value of StringRef to the char array buffer 4134514f5e3Sopenharmony_ci * Length:Obtain the length of the Chinese value of StringRef 4144514f5e3Sopenharmony_ci * @tc.type: FUNC 4154514f5e3Sopenharmony_ci * @tc.require: parameter 4164514f5e3Sopenharmony_ci */ 4174514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, StringLatin1_001) 4184514f5e3Sopenharmony_ci{ 4194514f5e3Sopenharmony_ci LocalScope scope(vm_); 4204514f5e3Sopenharmony_ci std::string test = "中"; 4214514f5e3Sopenharmony_ci Local<StringRef> testString = StringRef::NewFromUtf8(vm_, test.c_str()); 4224514f5e3Sopenharmony_ci 4234514f5e3Sopenharmony_ci EXPECT_EQ(testString->Length(vm_), 1U); 4244514f5e3Sopenharmony_ci char buffer[1]; 4254514f5e3Sopenharmony_ci EXPECT_EQ(testString->WriteLatin1(vm_, buffer, 1), 1); 4264514f5e3Sopenharmony_ci 4274514f5e3Sopenharmony_ci EXPECT_EQ(buffer[0], '-'); // '-' == 0x2D 4284514f5e3Sopenharmony_ci} 4294514f5e3Sopenharmony_ci 4304514f5e3Sopenharmony_ci/** 4314514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_008 4324514f5e3Sopenharmony_ci * @tc.name: StringLatin1_002 4334514f5e3Sopenharmony_ci * @tc.desc: 4344514f5e3Sopenharmony_ci * WriteLatin1:Write the non Chinese value of StringRef to the char array buffer 4354514f5e3Sopenharmony_ci * Length:Obtain the length of the non Chinese value of StringRef 4364514f5e3Sopenharmony_ci * @tc.type: FUNC 4374514f5e3Sopenharmony_ci * @tc.require: parameter 4384514f5e3Sopenharmony_ci */ 4394514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, StringLatin1_002) 4404514f5e3Sopenharmony_ci{ 4414514f5e3Sopenharmony_ci LocalScope scope(vm_); 4424514f5e3Sopenharmony_ci std::string test = "En123"; 4434514f5e3Sopenharmony_ci Local<StringRef> testString = StringRef::NewFromUtf8(vm_, test.c_str()); 4444514f5e3Sopenharmony_ci 4454514f5e3Sopenharmony_ci EXPECT_EQ(testString->Length(vm_), 5U); 4464514f5e3Sopenharmony_ci char buffer[5]; 4474514f5e3Sopenharmony_ci EXPECT_EQ(testString->WriteLatin1(vm_, buffer, 5), 5); 4484514f5e3Sopenharmony_ci 4494514f5e3Sopenharmony_ci EXPECT_EQ(buffer[0], 'E'); 4504514f5e3Sopenharmony_ci EXPECT_EQ(buffer[1], 'n'); 4514514f5e3Sopenharmony_ci EXPECT_EQ(buffer[2], '1'); 4524514f5e3Sopenharmony_ci EXPECT_EQ(buffer[3], '2'); 4534514f5e3Sopenharmony_ci EXPECT_EQ(buffer[4], '3'); 4544514f5e3Sopenharmony_ci} 4554514f5e3Sopenharmony_ci 4564514f5e3Sopenharmony_ci/** 4574514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_009 4584514f5e3Sopenharmony_ci * @tc.name: ToType 4594514f5e3Sopenharmony_ci * @tc.desc: 4604514f5e3Sopenharmony_ci * ToString:Obtain the length of the non Chinese value of StringRef 4614514f5e3Sopenharmony_ci * @tc.type: FUNC 4624514f5e3Sopenharmony_ci * @tc.require: parameter 4634514f5e3Sopenharmony_ci */ 4644514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ToType) 4654514f5e3Sopenharmony_ci{ 4664514f5e3Sopenharmony_ci LocalScope scope(vm_); 4674514f5e3Sopenharmony_ci Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-123.3"); 4684514f5e3Sopenharmony_ci Local<JSValueRef> toValue(toString); 4694514f5e3Sopenharmony_ci 4704514f5e3Sopenharmony_ci ASSERT_EQ(toString->ToNumber(vm_)->Value(), -123.3); // -123 : test case of input 4714514f5e3Sopenharmony_ci ASSERT_EQ(toString->ToBoolean(vm_)->Value(), true); 4724514f5e3Sopenharmony_ci ASSERT_EQ(toValue->ToString(vm_)->ToString(vm_), "-123.3"); 4734514f5e3Sopenharmony_ci ASSERT_TRUE(toValue->ToObject(vm_)->IsObject(vm_)); 4744514f5e3Sopenharmony_ci} 4754514f5e3Sopenharmony_ci 4764514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, TypeValue) 4774514f5e3Sopenharmony_ci{ 4784514f5e3Sopenharmony_ci LocalScope scope(vm_); 4794514f5e3Sopenharmony_ci Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-123"); 4804514f5e3Sopenharmony_ci Local<JSValueRef> toValue(toString); 4814514f5e3Sopenharmony_ci 4824514f5e3Sopenharmony_ci ASSERT_EQ(toString->Int32Value(vm_), -123); // -123 : test case of input 4834514f5e3Sopenharmony_ci ASSERT_EQ(toString->BooleaValue(vm_), true); 4844514f5e3Sopenharmony_ci ASSERT_EQ(toString->Uint32Value(vm_), 4294967173U); // 4294967173 : test case of input 4854514f5e3Sopenharmony_ci ASSERT_EQ(toString->IntegerValue(vm_), -123); // -123 : test case of input 4864514f5e3Sopenharmony_ci} 4874514f5e3Sopenharmony_ci 4884514f5e3Sopenharmony_civoid *Detach() 4894514f5e3Sopenharmony_ci{ 4904514f5e3Sopenharmony_ci GTEST_LOG_(INFO) << "detach is running"; 4914514f5e3Sopenharmony_ci return nullptr; 4924514f5e3Sopenharmony_ci} 4934514f5e3Sopenharmony_ci 4944514f5e3Sopenharmony_civoid Attach([[maybe_unused]] int *buffer) 4954514f5e3Sopenharmony_ci{ 4964514f5e3Sopenharmony_ci GTEST_LOG_(INFO) << "attach is running"; 4974514f5e3Sopenharmony_ci} 4984514f5e3Sopenharmony_ci 4994514f5e3Sopenharmony_cistatic panda::JSNApi::NativeBindingInfo *CreateNativeBindingInfo(void *attach, void *detach) 5004514f5e3Sopenharmony_ci{ 5014514f5e3Sopenharmony_ci GTEST_LOG_(INFO) << "CreateNativeBindingInfo"; 5024514f5e3Sopenharmony_ci panda::JSNApi::NativeBindingInfo *info = panda::JSNApi::NativeBindingInfo::CreateNewInstance(); 5034514f5e3Sopenharmony_ci info->attachData = attach; 5044514f5e3Sopenharmony_ci info->detachData = detach; 5054514f5e3Sopenharmony_ci return info; 5064514f5e3Sopenharmony_ci} 5074514f5e3Sopenharmony_ci 5084514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, CreateNativeObject) 5094514f5e3Sopenharmony_ci{ 5104514f5e3Sopenharmony_ci LocalScope scope(vm_); 5114514f5e3Sopenharmony_ci auto info = CreateNativeBindingInfo(reinterpret_cast<void *>(Attach), reinterpret_cast<void *>(Detach)); 5124514f5e3Sopenharmony_ci size_t nativeBindingSize = 7 * sizeof(void *); // 7 : params num 5134514f5e3Sopenharmony_ci Local<NativePointerRef> nativeInfo = NativePointerRef::New( 5144514f5e3Sopenharmony_ci vm_, reinterpret_cast<void *>(info), 5154514f5e3Sopenharmony_ci []([[maybe_unused]] void *env, void *data, [[maybe_unused]] void *info) { 5164514f5e3Sopenharmony_ci auto externalInfo = reinterpret_cast<panda::JSNApi::NativeBindingInfo *>(data); 5174514f5e3Sopenharmony_ci delete externalInfo; 5184514f5e3Sopenharmony_ci }, 5194514f5e3Sopenharmony_ci nullptr, nativeBindingSize); 5204514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 5214514f5e3Sopenharmony_ci bool result = object->ConvertToNativeBindingObject(vm_, nativeInfo); 5224514f5e3Sopenharmony_ci ASSERT_TRUE(result); 5234514f5e3Sopenharmony_ci Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey"); 5244514f5e3Sopenharmony_ci Local<JSValueRef> value = ObjectRef::New(vm_); 5254514f5e3Sopenharmony_ci PropertyAttribute attribute(value, true, true, true); 5264514f5e3Sopenharmony_ci 5274514f5e3Sopenharmony_ci ASSERT_TRUE(object->DefineProperty(vm_, key, attribute)); 5284514f5e3Sopenharmony_ci Local<JSValueRef> value1 = object->Get(vm_, key); 5294514f5e3Sopenharmony_ci ASSERT_TRUE(value->IsStrictEquals(vm_, value1)); 5304514f5e3Sopenharmony_ci ASSERT_TRUE(object->Has(vm_, key)); 5314514f5e3Sopenharmony_ci ASSERT_TRUE(object->Delete(vm_, key)); 5324514f5e3Sopenharmony_ci ASSERT_FALSE(object->Has(vm_, key)); 5334514f5e3Sopenharmony_ci} 5344514f5e3Sopenharmony_ci 5354514f5e3Sopenharmony_ci/** 5364514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_010 5374514f5e3Sopenharmony_ci * @tc.name: DefineProperty 5384514f5e3Sopenharmony_ci * @tc.desc: Set Key values and corresponding attribute values 5394514f5e3Sopenharmony_ci * @tc.type: FUNC 5404514f5e3Sopenharmony_ci * @tc.require: parameter 5414514f5e3Sopenharmony_ci */ 5424514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, DefineProperty) 5434514f5e3Sopenharmony_ci{ 5444514f5e3Sopenharmony_ci LocalScope scope(vm_); 5454514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 5464514f5e3Sopenharmony_ci Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey"); 5474514f5e3Sopenharmony_ci Local<JSValueRef> value = ObjectRef::New(vm_); 5484514f5e3Sopenharmony_ci PropertyAttribute attribute(value, true, true, true); 5494514f5e3Sopenharmony_ci 5504514f5e3Sopenharmony_ci ASSERT_TRUE(object->DefineProperty(vm_, key, attribute)); 5514514f5e3Sopenharmony_ci Local<JSValueRef> value1 = object->Get(vm_, key); 5524514f5e3Sopenharmony_ci ASSERT_TRUE(value->IsStrictEquals(vm_, value1)); 5534514f5e3Sopenharmony_ci} 5544514f5e3Sopenharmony_ci 5554514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, HasProperty) 5564514f5e3Sopenharmony_ci{ 5574514f5e3Sopenharmony_ci LocalScope scope(vm_); 5584514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 5594514f5e3Sopenharmony_ci Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey"); 5604514f5e3Sopenharmony_ci Local<JSValueRef> value = ObjectRef::New(vm_); 5614514f5e3Sopenharmony_ci PropertyAttribute attribute(value, true, true, true); 5624514f5e3Sopenharmony_ci 5634514f5e3Sopenharmony_ci ASSERT_TRUE(object->DefineProperty(vm_, key, attribute)); 5644514f5e3Sopenharmony_ci ASSERT_TRUE(object->Has(vm_, key)); 5654514f5e3Sopenharmony_ci} 5664514f5e3Sopenharmony_ci 5674514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, DeleteProperty) 5684514f5e3Sopenharmony_ci{ 5694514f5e3Sopenharmony_ci LocalScope scope(vm_); 5704514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 5714514f5e3Sopenharmony_ci Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey"); 5724514f5e3Sopenharmony_ci Local<JSValueRef> value = ObjectRef::New(vm_); 5734514f5e3Sopenharmony_ci PropertyAttribute attribute(value, true, true, true); 5744514f5e3Sopenharmony_ci 5754514f5e3Sopenharmony_ci ASSERT_TRUE(object->DefineProperty(vm_, key, attribute)); 5764514f5e3Sopenharmony_ci ASSERT_TRUE(object->Delete(vm_, key)); 5774514f5e3Sopenharmony_ci ASSERT_FALSE(object->Has(vm_, key)); 5784514f5e3Sopenharmony_ci} 5794514f5e3Sopenharmony_ci 5804514f5e3Sopenharmony_ci/** 5814514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_011 5824514f5e3Sopenharmony_ci * @tc.name: GetProtoType 5834514f5e3Sopenharmony_ci * @tc.desc:Verify that the GetPrototype method correctly returns the prototype of the function or object, 5844514f5e3Sopenharmony_ci * and verify that the returned prototype is of an object type. 5854514f5e3Sopenharmony_ci * @tc.type: FUNC 5864514f5e3Sopenharmony_ci * @tc.require: parameter 5874514f5e3Sopenharmony_ci */ 5884514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetProtoType) 5894514f5e3Sopenharmony_ci{ 5904514f5e3Sopenharmony_ci LocalScope scope(vm_); 5914514f5e3Sopenharmony_ci Local<FunctionRef> function = FunctionRef::New(vm_, nullptr); 5924514f5e3Sopenharmony_ci Local<JSValueRef> protoType = function->GetPrototype(vm_); 5934514f5e3Sopenharmony_ci ASSERT_TRUE(protoType->IsObject(vm_)); 5944514f5e3Sopenharmony_ci 5954514f5e3Sopenharmony_ci Local<FunctionRef> object = ObjectRef::New(vm_); 5964514f5e3Sopenharmony_ci protoType = object->GetPrototype(vm_); 5974514f5e3Sopenharmony_ci ASSERT_TRUE(protoType->IsObject(vm_)); 5984514f5e3Sopenharmony_ci 5994514f5e3Sopenharmony_ci auto info = CreateNativeBindingInfo(reinterpret_cast<void *>(Attach), reinterpret_cast<void *>(Detach)); 6004514f5e3Sopenharmony_ci size_t nativeBindingSize = 7 * sizeof(void *); // 7 : params num 6014514f5e3Sopenharmony_ci Local<NativePointerRef> nativeInfo = NativePointerRef::New( 6024514f5e3Sopenharmony_ci vm_, reinterpret_cast<void *>(info), 6034514f5e3Sopenharmony_ci []([[maybe_unused]] void *env, void *data, [[maybe_unused]] void *info) { 6044514f5e3Sopenharmony_ci auto externalInfo = reinterpret_cast<panda::JSNApi::NativeBindingInfo *>(data); 6054514f5e3Sopenharmony_ci delete externalInfo; 6064514f5e3Sopenharmony_ci }, 6074514f5e3Sopenharmony_ci nullptr, nativeBindingSize); 6084514f5e3Sopenharmony_ci bool result = object->ConvertToNativeBindingObject(vm_, nativeInfo); 6094514f5e3Sopenharmony_ci ASSERT_TRUE(result); 6104514f5e3Sopenharmony_ci protoType = object->GetPrototype(vm_); 6114514f5e3Sopenharmony_ci ASSERT_TRUE(protoType->IsObject(vm_)); 6124514f5e3Sopenharmony_ci} 6134514f5e3Sopenharmony_ci 6144514f5e3Sopenharmony_ci/* 6154514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_012 6164514f5e3Sopenharmony_ci * @tc.name: CheckReject 6174514f5e3Sopenharmony_ci * @tc.desc: The function of CheckReject is similar to that of CheckResolve, 6184514f5e3Sopenharmony_ci * but it is used to check whether a function call provides the correct cause of the error, 6194514f5e3Sopenharmony_ci * which is achieved through ASSERT_ EQ (Local<StringRef>(reason) ->ToString(vm_), 6204514f5e3Sopenharmony_ci * check if the value of this string is equal to "Reject". 6214514f5e3Sopenharmony_ci * @tc.type: FUNC 6224514f5e3Sopenharmony_ci * @tc.require: parameter info 6234514f5e3Sopenharmony_ci */ 6244514f5e3Sopenharmony_civoid CheckReject(JsiRuntimeCallInfo *info) 6254514f5e3Sopenharmony_ci{ 6264514f5e3Sopenharmony_ci ASSERT_EQ(info->GetArgsNumber(), 1U); 6274514f5e3Sopenharmony_ci Local<JSValueRef> reason = info->GetCallArgRef(0); 6284514f5e3Sopenharmony_ci ASSERT_TRUE(reason->IsString(info->GetVM())); 6294514f5e3Sopenharmony_ci ASSERT_EQ(Local<StringRef>(reason)->ToString(info->GetVM()), "Reject"); 6304514f5e3Sopenharmony_ci} 6314514f5e3Sopenharmony_ci 6324514f5e3Sopenharmony_ciLocal<JSValueRef> RejectCallback(JsiRuntimeCallInfo *info) 6334514f5e3Sopenharmony_ci{ 6344514f5e3Sopenharmony_ci LocalScope scope(info->GetVM()); 6354514f5e3Sopenharmony_ci CheckReject(info); 6364514f5e3Sopenharmony_ci return JSValueRef::Undefined(info->GetVM()); 6374514f5e3Sopenharmony_ci} 6384514f5e3Sopenharmony_ci 6394514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PromiseCatch) 6404514f5e3Sopenharmony_ci{ 6414514f5e3Sopenharmony_ci LocalScope scope(vm_); 6424514f5e3Sopenharmony_ci Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm_); 6434514f5e3Sopenharmony_ci 6444514f5e3Sopenharmony_ci Local<PromiseRef> promise = capability->GetPromise(vm_); 6454514f5e3Sopenharmony_ci Local<FunctionRef> reject = FunctionRef::New(vm_, RejectCallback); 6464514f5e3Sopenharmony_ci Local<PromiseRef> catchPromise = promise->Catch(vm_, reject); 6474514f5e3Sopenharmony_ci ASSERT_TRUE(promise->IsPromise(vm_)); 6484514f5e3Sopenharmony_ci ASSERT_TRUE(catchPromise->IsPromise(vm_)); 6494514f5e3Sopenharmony_ci 6504514f5e3Sopenharmony_ci Local<StringRef> reason = StringRef::NewFromUtf8(vm_, "Reject"); 6514514f5e3Sopenharmony_ci ASSERT_TRUE(capability->Reject(vm_, reason)); 6524514f5e3Sopenharmony_ci 6534514f5e3Sopenharmony_ci vm_->GetJSThread()->GetCurrentEcmaContext()->ExecutePromisePendingJob(); 6544514f5e3Sopenharmony_ci} 6554514f5e3Sopenharmony_ci 6564514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PromiseCatchUintPtr) 6574514f5e3Sopenharmony_ci{ 6584514f5e3Sopenharmony_ci LocalScope scope(vm_); 6594514f5e3Sopenharmony_ci Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm_); 6604514f5e3Sopenharmony_ci 6614514f5e3Sopenharmony_ci Local<PromiseRef> promise = capability->GetPromise(vm_); 6624514f5e3Sopenharmony_ci Local<FunctionRef> reject = FunctionRef::New(vm_, RejectCallback); 6634514f5e3Sopenharmony_ci Local<PromiseRef> catchPromise = promise->Catch(vm_, reject); 6644514f5e3Sopenharmony_ci ASSERT_TRUE(promise->IsPromise(vm_)); 6654514f5e3Sopenharmony_ci ASSERT_TRUE(catchPromise->IsPromise(vm_)); 6664514f5e3Sopenharmony_ci 6674514f5e3Sopenharmony_ci Local<StringRef> reason = StringRef::NewFromUtf8(vm_, "Reject"); 6684514f5e3Sopenharmony_ci ASSERT_TRUE(capability->Reject(vm_, reinterpret_cast<uintptr_t>(*reason))); 6694514f5e3Sopenharmony_ci 6704514f5e3Sopenharmony_ci vm_->GetJSThread()->GetCurrentEcmaContext()->ExecutePromisePendingJob(); 6714514f5e3Sopenharmony_ci} 6724514f5e3Sopenharmony_ci 6734514f5e3Sopenharmony_ci/* 6744514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_013 6754514f5e3Sopenharmony_ci * @tc.name: CheckResolve_New_Reject 6764514f5e3Sopenharmony_ci * @tc.desc: Verify whether a specific function call provided the correct parameters (a number 300.3), 6774514f5e3Sopenharmony_ci * where ASSERT_ TRUE (value ->IsNumber()) Check if this parameter is a number. 6784514f5e3Sopenharmony_ci * New:Used to verify whether the creation of a new PromiseCapabilityRef object was successful. 6794514f5e3Sopenharmony_ci * Reject:Used to verify whether the reason for rejecting the Promise object was successfully obtained. 6804514f5e3Sopenharmony_ci * @tc.type: FUNC 6814514f5e3Sopenharmony_ci * @tc.require: parameter info 6824514f5e3Sopenharmony_ci */ 6834514f5e3Sopenharmony_civoid CheckResolve(JsiRuntimeCallInfo *info) 6844514f5e3Sopenharmony_ci{ 6854514f5e3Sopenharmony_ci ASSERT_EQ(info->GetArgsNumber(), 1U); 6864514f5e3Sopenharmony_ci Local<JSValueRef> value = info->GetCallArgRef(0); 6874514f5e3Sopenharmony_ci ASSERT_TRUE(value->IsNumber()); 6884514f5e3Sopenharmony_ci ASSERT_EQ(Local<NumberRef>(value)->Value(), 300.3); // 300.3 : test case of input 6894514f5e3Sopenharmony_ci} 6904514f5e3Sopenharmony_ci 6914514f5e3Sopenharmony_ciLocal<JSValueRef> ResolvedCallback(JsiRuntimeCallInfo *info) 6924514f5e3Sopenharmony_ci{ 6934514f5e3Sopenharmony_ci LocalScope scope(info->GetVM()); 6944514f5e3Sopenharmony_ci CheckResolve(info); 6954514f5e3Sopenharmony_ci return JSValueRef::Undefined(info->GetVM()); 6964514f5e3Sopenharmony_ci} 6974514f5e3Sopenharmony_ci 6984514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PromiseThen) 6994514f5e3Sopenharmony_ci{ 7004514f5e3Sopenharmony_ci LocalScope scope(vm_); 7014514f5e3Sopenharmony_ci Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm_); 7024514f5e3Sopenharmony_ci 7034514f5e3Sopenharmony_ci Local<PromiseRef> promise = capability->GetPromise(vm_); 7044514f5e3Sopenharmony_ci Local<FunctionRef> resolve = FunctionRef::New(vm_, ResolvedCallback); 7054514f5e3Sopenharmony_ci Local<FunctionRef> reject = FunctionRef::New(vm_, RejectCallback); 7064514f5e3Sopenharmony_ci Local<PromiseRef> thenPromise = promise->Then(vm_, resolve, reject); 7074514f5e3Sopenharmony_ci ASSERT_TRUE(promise->IsPromise(vm_)); 7084514f5e3Sopenharmony_ci ASSERT_TRUE(thenPromise->IsPromise(vm_)); 7094514f5e3Sopenharmony_ci 7104514f5e3Sopenharmony_ci Local<StringRef> value = NumberRef::New(vm_, 300.3); // 300.3 : test case of input 7114514f5e3Sopenharmony_ci ASSERT_TRUE(capability->Resolve(vm_, value)); 7124514f5e3Sopenharmony_ci vm_->GetJSThread()->GetCurrentEcmaContext()->ExecutePromisePendingJob(); 7134514f5e3Sopenharmony_ci} 7144514f5e3Sopenharmony_ci 7154514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PromiseThenUintPtr) 7164514f5e3Sopenharmony_ci{ 7174514f5e3Sopenharmony_ci LocalScope scope(vm_); 7184514f5e3Sopenharmony_ci Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm_); 7194514f5e3Sopenharmony_ci 7204514f5e3Sopenharmony_ci Local<PromiseRef> promise = capability->GetPromise(vm_); 7214514f5e3Sopenharmony_ci Local<FunctionRef> resolve = FunctionRef::New(vm_, ResolvedCallback); 7224514f5e3Sopenharmony_ci Local<FunctionRef> reject = FunctionRef::New(vm_, RejectCallback); 7234514f5e3Sopenharmony_ci Local<PromiseRef> thenPromise = promise->Then(vm_, resolve, reject); 7244514f5e3Sopenharmony_ci ASSERT_TRUE(promise->IsPromise(vm_)); 7254514f5e3Sopenharmony_ci ASSERT_TRUE(thenPromise->IsPromise(vm_)); 7264514f5e3Sopenharmony_ci 7274514f5e3Sopenharmony_ci Local<StringRef> value = NumberRef::New(vm_, 300.3); // 300.3 : test case of input 7284514f5e3Sopenharmony_ci ASSERT_TRUE(capability->Resolve(vm_, reinterpret_cast<uintptr_t>(*value))); 7294514f5e3Sopenharmony_ci vm_->GetJSThread()->GetCurrentEcmaContext()->ExecutePromisePendingJob(); 7304514f5e3Sopenharmony_ci} 7314514f5e3Sopenharmony_ci 7324514f5e3Sopenharmony_ci/** 7334514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_014 7344514f5e3Sopenharmony_ci * @tc.name: Constructor_IsObject 7354514f5e3Sopenharmony_ci * @tc.desc: Used to verify whether the creation of a new PromiseCapabilityRef object was successful. 7364514f5e3Sopenharmony_ci * Used to verify whether obtaining a PromiseRef object was successful. 7374514f5e3Sopenharmony_ci IsObject:Determine if it is an object 7384514f5e3Sopenharmony_ci * @tc.type: FUNC 7394514f5e3Sopenharmony_ci * @tc.require: parameter isobject 7404514f5e3Sopenharmony_ci */ 7414514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Constructor_IsObject) 7424514f5e3Sopenharmony_ci{ 7434514f5e3Sopenharmony_ci LocalScope scope(vm_); 7444514f5e3Sopenharmony_ci Local<ObjectRef> object = JSNApi::GetGlobalObject(vm_); 7454514f5e3Sopenharmony_ci Local<StringRef> key = StringRef::NewFromUtf8(vm_, "Number"); 7464514f5e3Sopenharmony_ci Local<FunctionRef> numberConstructor = object->Get(vm_, key); 7474514f5e3Sopenharmony_ci Local<JSValueRef> argv[1]; 7484514f5e3Sopenharmony_ci argv[0] = NumberRef::New(vm_, 1.3); // 1.3 : test case of input 7494514f5e3Sopenharmony_ci Local<JSValueRef> result = numberConstructor->Constructor(vm_, argv, 1); 7504514f5e3Sopenharmony_ci ASSERT_TRUE(result->IsObject(vm_)); 7514514f5e3Sopenharmony_ci ASSERT_EQ(result->ToNumber(vm_)->Value(), 1.3); // 1.3 : size of arguments 7524514f5e3Sopenharmony_ci} 7534514f5e3Sopenharmony_ci 7544514f5e3Sopenharmony_ci/** 7554514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_015 7564514f5e3Sopenharmony_ci * @tc.name: Constructor_IsBuffer 7574514f5e3Sopenharmony_ci * @tc.desc: Construct a BufferRef function to determine whether it is a Buffer. 7584514f5e3Sopenharmony_ci * The constructor used to verify the success of the FunctionRef class. 7594514f5e3Sopenharmony_ci * @tc.type: FUNC 7604514f5e3Sopenharmony_ci * @tc.require: parameter parameter 7614514f5e3Sopenharmony_ci */ 7624514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ArrayBuffer) 7634514f5e3Sopenharmony_ci{ 7644514f5e3Sopenharmony_ci LocalScope scope(vm_); 7654514f5e3Sopenharmony_ci const int32_t length = 15; 7664514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 7674514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 7684514f5e3Sopenharmony_ci ASSERT_EQ(arrayBuffer->ByteLength(vm_), length); 7694514f5e3Sopenharmony_ci ASSERT_NE(arrayBuffer->GetBuffer(vm_), nullptr); 7704514f5e3Sopenharmony_ci JSNApi::TriggerGC(vm_); 7714514f5e3Sopenharmony_ci} 7724514f5e3Sopenharmony_ci 7734514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ArrayBufferWithBuffer) 7744514f5e3Sopenharmony_ci{ 7754514f5e3Sopenharmony_ci static bool isFree = false; 7764514f5e3Sopenharmony_ci struct Data { 7774514f5e3Sopenharmony_ci int32_t length; 7784514f5e3Sopenharmony_ci }; 7794514f5e3Sopenharmony_ci const int32_t length = 15; 7804514f5e3Sopenharmony_ci Data *data = new Data(); 7814514f5e3Sopenharmony_ci data->length = length; 7824514f5e3Sopenharmony_ci NativePointerCallback deleter = []([[maybe_unused]] void *env, void *buffer, void *data) -> void { 7834514f5e3Sopenharmony_ci delete[] reinterpret_cast<uint8_t *>(buffer); 7844514f5e3Sopenharmony_ci Data *currentData = reinterpret_cast<Data *>(data); 7854514f5e3Sopenharmony_ci ASSERT_EQ(currentData->length, 15); // 5 : size of arguments 7864514f5e3Sopenharmony_ci delete currentData; 7874514f5e3Sopenharmony_ci isFree = true; 7884514f5e3Sopenharmony_ci }; 7894514f5e3Sopenharmony_ci { 7904514f5e3Sopenharmony_ci LocalScope scope(vm_); 7914514f5e3Sopenharmony_ci uint8_t *buffer = new uint8_t[length](); 7924514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, buffer, length, deleter, data); 7934514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 7944514f5e3Sopenharmony_ci ASSERT_EQ(arrayBuffer->ByteLength(vm_), length); 7954514f5e3Sopenharmony_ci ASSERT_EQ(arrayBuffer->GetBuffer(vm_), buffer); 7964514f5e3Sopenharmony_ci } 7974514f5e3Sopenharmony_ci JSNApi::TriggerGC(vm_, JSNApi::TRIGGER_GC_TYPE::FULL_GC); 7984514f5e3Sopenharmony_ci ASSERT_TRUE(isFree); 7994514f5e3Sopenharmony_ci} 8004514f5e3Sopenharmony_ci 8014514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, DataView) 8024514f5e3Sopenharmony_ci{ 8034514f5e3Sopenharmony_ci LocalScope scope(vm_); 8044514f5e3Sopenharmony_ci const int32_t length = 15; 8054514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 8064514f5e3Sopenharmony_ci JSNApi::TriggerGC(vm_); 8074514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 8084514f5e3Sopenharmony_ci 8094514f5e3Sopenharmony_ci // 5 : offset of byte, 7 : length 8104514f5e3Sopenharmony_ci Local<DataViewRef> dataView = DataViewRef::New(vm_, arrayBuffer, 5, 7); 8114514f5e3Sopenharmony_ci ASSERT_TRUE(dataView->IsDataView(vm_)); 8124514f5e3Sopenharmony_ci ASSERT_EQ(dataView->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 8134514f5e3Sopenharmony_ci ASSERT_EQ(dataView->ByteLength(), 7U); // 7 : size of arguments 8144514f5e3Sopenharmony_ci ASSERT_EQ(dataView->ByteOffset(), 5U); // 5 : size of arguments 8154514f5e3Sopenharmony_ci 8164514f5e3Sopenharmony_ci // 5 : offset of byte, 11 : length 8174514f5e3Sopenharmony_ci dataView = DataViewRef::New(vm_, arrayBuffer, 5, 11); 8184514f5e3Sopenharmony_ci ASSERT_TRUE(dataView->IsUndefined()); 8194514f5e3Sopenharmony_ci} 8204514f5e3Sopenharmony_ci 8214514f5e3Sopenharmony_ci/** 8224514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_016 8234514f5e3Sopenharmony_ci * @tc.name: Int8Array_IsUndefined 8244514f5e3Sopenharmony_ci * @tc.desc:Using the functions of Int8Array and verifying if its attribute values are correct. 8254514f5e3Sopenharmony_ci * Used to determine whether a given object represents an undefined value. 8264514f5e3Sopenharmony_ci Determine if it is an int8 array. 8274514f5e3Sopenharmony_ci * @tc.type: FUNC 8284514f5e3Sopenharmony_ci * @tc.require: parameter 8294514f5e3Sopenharmony_ci */ 8304514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Int8Array) 8314514f5e3Sopenharmony_ci{ 8324514f5e3Sopenharmony_ci LocalScope scope(vm_); 8334514f5e3Sopenharmony_ci const int32_t length = 15; 8344514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 8354514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 8364514f5e3Sopenharmony_ci 8374514f5e3Sopenharmony_ci // 5 : offset of byte, 6 : length 8384514f5e3Sopenharmony_ci Local<Int8ArrayRef> typedArray = Int8ArrayRef::New(vm_, arrayBuffer, 5, 6); 8394514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsInt8Array(vm_)); 8404514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 6U); // 6 : length of bytes 8414514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 5U); // 5 : offset of byte 8424514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 8434514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 8444514f5e3Sopenharmony_ci} 8454514f5e3Sopenharmony_ci 8464514f5e3Sopenharmony_ci/** 8474514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_017 8484514f5e3Sopenharmony_ci * @tc.name: Uint8Array_ ByteLength_ByteOffset_ArrayLength_GetArrayBuffer 8494514f5e3Sopenharmony_ci * @tc.desc:Using the functions of Uint8Array and verifying if its attribute values are correct. 8504514f5e3Sopenharmony_ci * Used to verify whether the length, offset, array length, and associated 8514514f5e3Sopenharmony_ci * ArrayBufferRef object of the bytes obtained from the array were successful. 8524514f5e3Sopenharmony_ci * @tc.type: FUNC 8534514f5e3Sopenharmony_ci * @tc.require: parameter 8544514f5e3Sopenharmony_ci */ 8554514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Uint8Array) 8564514f5e3Sopenharmony_ci{ 8574514f5e3Sopenharmony_ci LocalScope scope(vm_); 8584514f5e3Sopenharmony_ci const int32_t length = 15; 8594514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 8604514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 8614514f5e3Sopenharmony_ci 8624514f5e3Sopenharmony_ci // 5 : offset of byte, 6 : length 8634514f5e3Sopenharmony_ci Local<Uint8ArrayRef> typedArray = Uint8ArrayRef::New(vm_, arrayBuffer, 5, 6); 8644514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsUint8Array(vm_)); 8654514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 6U); // 6 : length of bytes 8664514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 5U); // 5 : offset of byte 8674514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 8684514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 8694514f5e3Sopenharmony_ci} 8704514f5e3Sopenharmony_ci 8714514f5e3Sopenharmony_ci/** 8724514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_018 8734514f5e3Sopenharmony_ci * @tc.name: Uint8ClampedArray 8744514f5e3Sopenharmony_ci * @tc.desc:Using the functions of Uint8ClampedArray and verifying if its attribute values are correct. 8754514f5e3Sopenharmony_ci * @tc.type: FUNC 8764514f5e3Sopenharmony_ci * @tc.require: parameter 8774514f5e3Sopenharmony_ci */ 8784514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Uint8ClampedArray) 8794514f5e3Sopenharmony_ci{ 8804514f5e3Sopenharmony_ci LocalScope scope(vm_); 8814514f5e3Sopenharmony_ci const int32_t length = 15; 8824514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 8834514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 8844514f5e3Sopenharmony_ci 8854514f5e3Sopenharmony_ci // 5 : offset of byte, 6 : length 8864514f5e3Sopenharmony_ci Local<Uint8ClampedArrayRef> typedArray = Uint8ClampedArrayRef::New(vm_, arrayBuffer, 5, 6); 8874514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsUint8ClampedArray(vm_)); 8884514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 6U); // 6 : length of bytes 8894514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 5U); // 5 : offset of byte 8904514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 8914514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 8924514f5e3Sopenharmony_ci} 8934514f5e3Sopenharmony_ci 8944514f5e3Sopenharmony_ci/** 8954514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_019 8964514f5e3Sopenharmony_ci * @tc.name: Int16Array 8974514f5e3Sopenharmony_ci * @tc.desc:Using the functions of Int16Array and verifying if its attribute values are correct. 8984514f5e3Sopenharmony_ci * @tc.type: FUNC 8994514f5e3Sopenharmony_ci * @tc.require: parameter 9004514f5e3Sopenharmony_ci */ 9014514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Int16Array) 9024514f5e3Sopenharmony_ci{ 9034514f5e3Sopenharmony_ci LocalScope scope(vm_); 9044514f5e3Sopenharmony_ci const int32_t length = 30; 9054514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 9064514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 9074514f5e3Sopenharmony_ci 9084514f5e3Sopenharmony_ci // 4 : offset of byte, 6 : length 9094514f5e3Sopenharmony_ci Local<Int16ArrayRef> typedArray = Int16ArrayRef::New(vm_, arrayBuffer, 4, 6); 9104514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsInt16Array(vm_)); 9114514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 12U); // 12 : length of bytes 9124514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 4U); // 4 : offset of byte 9134514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 9144514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 9154514f5e3Sopenharmony_ci} 9164514f5e3Sopenharmony_ci 9174514f5e3Sopenharmony_ci/** 9184514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_020 9194514f5e3Sopenharmony_ci * @tc.name: Uint16Array 9204514f5e3Sopenharmony_ci * @tc.desc:Using the functions of Uint16Array and verifying if its attribute values are correct. 9214514f5e3Sopenharmony_ci * @tc.type: FUNC 9224514f5e3Sopenharmony_ci * @tc.require: parameter 9234514f5e3Sopenharmony_ci */ 9244514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Uint16Array) 9254514f5e3Sopenharmony_ci{ 9264514f5e3Sopenharmony_ci LocalScope scope(vm_); 9274514f5e3Sopenharmony_ci const int32_t length = 30; 9284514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 9294514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 9304514f5e3Sopenharmony_ci 9314514f5e3Sopenharmony_ci // 4 : offset of byte, 6 : length 9324514f5e3Sopenharmony_ci Local<Uint16ArrayRef> typedArray = Uint16ArrayRef::New(vm_, arrayBuffer, 4, 6); 9334514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsUint16Array(vm_)); 9344514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 12U); // 12 : length of bytes 9354514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 4U); // 4 : offset of byte 9364514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 9374514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 9384514f5e3Sopenharmony_ci} 9394514f5e3Sopenharmony_ci 9404514f5e3Sopenharmony_ci/* 9414514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_021 9424514f5e3Sopenharmony_ci * @tc.name: Uint32Array 9434514f5e3Sopenharmony_ci * @tc.desc: Verify that the Uint32Array method correctly created a Uint32Array with the specified length and offset, 9444514f5e3Sopenharmony_ci * and verify that its attribute values match expectations. 9454514f5e3Sopenharmony_ci * @tc.type: FUNC 9464514f5e3Sopenharmony_ci * @tc.require: parameter 9474514f5e3Sopenharmony_ci */ 9484514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Uint32Array) 9494514f5e3Sopenharmony_ci{ 9504514f5e3Sopenharmony_ci LocalScope scope(vm_); 9514514f5e3Sopenharmony_ci const int32_t length = 30; 9524514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 9534514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 9544514f5e3Sopenharmony_ci 9554514f5e3Sopenharmony_ci // 4 : offset of byte, 6 : length 9564514f5e3Sopenharmony_ci Local<Uint32ArrayRef> typedArray = Uint32ArrayRef::New(vm_, arrayBuffer, 4, 6); 9574514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsUint32Array(vm_)); 9584514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 24U); // 24 : length of bytes 9594514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 4U); // 4 : offset of byte 9604514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 9614514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 9624514f5e3Sopenharmony_ci} 9634514f5e3Sopenharmony_ci 9644514f5e3Sopenharmony_ci/** 9654514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_022 9664514f5e3Sopenharmony_ci * @tc.name: Int32Array 9674514f5e3Sopenharmony_ci * @tc.desc:Using the functions of Int32Array and verifying if its attribute values are correct. 9684514f5e3Sopenharmony_ci * @tc.type: FUNC 9694514f5e3Sopenharmony_ci * @tc.require: parameter 9704514f5e3Sopenharmony_ci */ 9714514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Int32Array) 9724514f5e3Sopenharmony_ci{ 9734514f5e3Sopenharmony_ci LocalScope scope(vm_); 9744514f5e3Sopenharmony_ci const int32_t length = 30; 9754514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 9764514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 9774514f5e3Sopenharmony_ci 9784514f5e3Sopenharmony_ci // 4 : offset of byte, 6 : length 9794514f5e3Sopenharmony_ci Local<Int32ArrayRef> typedArray = Int32ArrayRef::New(vm_, arrayBuffer, 4, 6); 9804514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsInt32Array(vm_)); 9814514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 24U); // 24 : length of bytes 9824514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 4U); // 4 : offset of byte 9834514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 9844514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 9854514f5e3Sopenharmony_ci} 9864514f5e3Sopenharmony_ci 9874514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Float32Array) 9884514f5e3Sopenharmony_ci{ 9894514f5e3Sopenharmony_ci LocalScope scope(vm_); 9904514f5e3Sopenharmony_ci const int32_t length = 30; 9914514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 9924514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 9934514f5e3Sopenharmony_ci 9944514f5e3Sopenharmony_ci // 4 : offset of byte, 6 : length 9954514f5e3Sopenharmony_ci Local<Float32ArrayRef> typedArray = Float32ArrayRef::New(vm_, arrayBuffer, 4, 6); 9964514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsFloat32Array(vm_)); 9974514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 24U); // 24 : length of bytes 9984514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 4U); // 4 : offset of byte 9994514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 10004514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 10014514f5e3Sopenharmony_ci} 10024514f5e3Sopenharmony_ci 10034514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Float64Array) 10044514f5e3Sopenharmony_ci{ 10054514f5e3Sopenharmony_ci LocalScope scope(vm_); 10064514f5e3Sopenharmony_ci const int32_t length = 57; 10074514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 10084514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 10094514f5e3Sopenharmony_ci 10104514f5e3Sopenharmony_ci // 8 : offset of byte, 6 : length 10114514f5e3Sopenharmony_ci Local<Float64ArrayRef> typedArray = Float64ArrayRef::New(vm_, arrayBuffer, 8, 6); 10124514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsFloat64Array(vm_)); 10134514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 48U); // 48 : length of bytes 10144514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 8U); // 8 : offset of byte 10154514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 10164514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 10174514f5e3Sopenharmony_ci} 10184514f5e3Sopenharmony_ci 10194514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BigInt64Array) 10204514f5e3Sopenharmony_ci{ 10214514f5e3Sopenharmony_ci LocalScope scope(vm_); 10224514f5e3Sopenharmony_ci const int32_t length = 57; 10234514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 10244514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 10254514f5e3Sopenharmony_ci 10264514f5e3Sopenharmony_ci // 8 : offset of byte, 6 : length 10274514f5e3Sopenharmony_ci Local<BigInt64ArrayRef> typedArray = BigInt64ArrayRef::New(vm_, arrayBuffer, 8, 6); 10284514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsBigInt64Array(vm_)); 10294514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 48U); // 48 : length of bytes 10304514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 8U); // 8 : offset of byte 10314514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 10324514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 10334514f5e3Sopenharmony_ci} 10344514f5e3Sopenharmony_ci 10354514f5e3Sopenharmony_ci/** 10364514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_023 10374514f5e3Sopenharmony_ci * @tc.name: IsBigInt64Array 10384514f5e3Sopenharmony_ci * @tc.desc: Used to determine whether a given object is a BigInt64Array. 10394514f5e3Sopenharmony_ci * @tc.type: FUNC 10404514f5e3Sopenharmony_ci * @tc.require: parameter 10414514f5e3Sopenharmony_ci */ 10424514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BigUint64Array) 10434514f5e3Sopenharmony_ci{ 10444514f5e3Sopenharmony_ci LocalScope scope(vm_); 10454514f5e3Sopenharmony_ci const int32_t length = 57; 10464514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 10474514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 10484514f5e3Sopenharmony_ci 10494514f5e3Sopenharmony_ci // 8 : offset of byte, 6 : length 10504514f5e3Sopenharmony_ci Local<BigUint64ArrayRef> typedArray = BigUint64ArrayRef::New(vm_, arrayBuffer, 8, 6); 10514514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsBigUint64Array(vm_)); 10524514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteLength(vm_), 48U); // 48 : length of bytes 10534514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ByteOffset(vm_), 8U); // 8 : offset of byte 10544514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->ArrayLength(vm_), 6U); // 6 : length of array 10554514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 10564514f5e3Sopenharmony_ci} 10574514f5e3Sopenharmony_ci 10584514f5e3Sopenharmony_ci/** 10594514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_024 10604514f5e3Sopenharmony_ci * @tc.name: Error_ThrowException_HasPendingException 10614514f5e3Sopenharmony_ci * @tc.desc: 10624514f5e3Sopenharmony_ci * Error:Build error message 10634514f5e3Sopenharmony_ci * ThrowException:Throw an exception, error is the exception information 10644514f5e3Sopenharmony_ci * HasPendingException:Determine if there are any uncaught exceptions 10654514f5e3Sopenharmony_ci * @tc.type: FUNC 10664514f5e3Sopenharmony_ci * @tc.require: parameter 10674514f5e3Sopenharmony_ci */ 10684514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Error_ThrowException_HasPendingException) 10694514f5e3Sopenharmony_ci{ 10704514f5e3Sopenharmony_ci LocalScope scope(vm_); 10714514f5e3Sopenharmony_ci Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest"); 10724514f5e3Sopenharmony_ci Local<JSValueRef> error = Exception::Error(vm_, message); 10734514f5e3Sopenharmony_ci ASSERT_TRUE(error->IsError(vm_)); 10744514f5e3Sopenharmony_ci 10754514f5e3Sopenharmony_ci JSNApi::ThrowException(vm_, error); 10764514f5e3Sopenharmony_ci ASSERT_TRUE(thread_->HasPendingException()); 10774514f5e3Sopenharmony_ci} 10784514f5e3Sopenharmony_ci 10794514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, RangeError) 10804514f5e3Sopenharmony_ci{ 10814514f5e3Sopenharmony_ci LocalScope scope(vm_); 10824514f5e3Sopenharmony_ci Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest"); 10834514f5e3Sopenharmony_ci Local<JSValueRef> error = Exception::RangeError(vm_, message); 10844514f5e3Sopenharmony_ci ASSERT_TRUE(error->IsError(vm_)); 10854514f5e3Sopenharmony_ci 10864514f5e3Sopenharmony_ci JSNApi::ThrowException(vm_, error); 10874514f5e3Sopenharmony_ci ASSERT_TRUE(thread_->HasPendingException()); 10884514f5e3Sopenharmony_ci} 10894514f5e3Sopenharmony_ci 10904514f5e3Sopenharmony_ci/** 10914514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_025 10924514f5e3Sopenharmony_ci * @tc.name: TypeError 10934514f5e3Sopenharmony_ci * @tc.desc:Tested the ability to create and throw a type error exception, and verified whether the exception 10944514f5e3Sopenharmony_ci * was correctly recognized and handled. 10954514f5e3Sopenharmony_ci * @tc.type: FUNC 10964514f5e3Sopenharmony_ci * @tc.require: parameter 10974514f5e3Sopenharmony_ci */ 10984514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, TypeError) 10994514f5e3Sopenharmony_ci{ 11004514f5e3Sopenharmony_ci LocalScope scope(vm_); 11014514f5e3Sopenharmony_ci Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest"); 11024514f5e3Sopenharmony_ci Local<JSValueRef> error = Exception::TypeError(vm_, message); 11034514f5e3Sopenharmony_ci ASSERT_TRUE(error->IsError(vm_)); 11044514f5e3Sopenharmony_ci 11054514f5e3Sopenharmony_ci JSNApi::ThrowException(vm_, error); 11064514f5e3Sopenharmony_ci ASSERT_TRUE(thread_->HasPendingException()); 11074514f5e3Sopenharmony_ci} 11084514f5e3Sopenharmony_ci 11094514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ReferenceError) 11104514f5e3Sopenharmony_ci{ 11114514f5e3Sopenharmony_ci LocalScope scope(vm_); 11124514f5e3Sopenharmony_ci Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest"); 11134514f5e3Sopenharmony_ci Local<JSValueRef> error = Exception::ReferenceError(vm_, message); 11144514f5e3Sopenharmony_ci ASSERT_TRUE(error->IsError(vm_)); 11154514f5e3Sopenharmony_ci 11164514f5e3Sopenharmony_ci JSNApi::ThrowException(vm_, error); 11174514f5e3Sopenharmony_ci ASSERT_TRUE(thread_->HasPendingException()); 11184514f5e3Sopenharmony_ci} 11194514f5e3Sopenharmony_ci 11204514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SyntaxError) 11214514f5e3Sopenharmony_ci{ 11224514f5e3Sopenharmony_ci LocalScope scope(vm_); 11234514f5e3Sopenharmony_ci Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest"); 11244514f5e3Sopenharmony_ci Local<JSValueRef> error = Exception::SyntaxError(vm_, message); 11254514f5e3Sopenharmony_ci ASSERT_TRUE(error->IsError(vm_)); 11264514f5e3Sopenharmony_ci 11274514f5e3Sopenharmony_ci JSNApi::ThrowException(vm_, error); 11284514f5e3Sopenharmony_ci ASSERT_TRUE(thread_->HasPendingException()); 11294514f5e3Sopenharmony_ci} 11304514f5e3Sopenharmony_ci 11314514f5e3Sopenharmony_ci/** 11324514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_026 11334514f5e3Sopenharmony_ci * @tc.name: OOMError 11344514f5e3Sopenharmony_ci * @tc.desc:Create and throw a memory overflow error exception function, and verify 11354514f5e3Sopenharmony_ci * whether the exception is correctly recognized and handled. 11364514f5e3Sopenharmony_ci * @tc.type: FUNC 11374514f5e3Sopenharmony_ci * @tc.require: parameter 11384514f5e3Sopenharmony_ci */ 11394514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, OOMError) 11404514f5e3Sopenharmony_ci{ 11414514f5e3Sopenharmony_ci LocalScope scope(vm_); 11424514f5e3Sopenharmony_ci Local<StringRef> message = StringRef::NewFromUtf8(vm_, "ErrorTest"); 11434514f5e3Sopenharmony_ci Local<JSValueRef> error = Exception::OOMError(vm_, message); 11444514f5e3Sopenharmony_ci ASSERT_TRUE(error->IsError(vm_)); 11454514f5e3Sopenharmony_ci 11464514f5e3Sopenharmony_ci JSNApi::ThrowException(vm_, error); 11474514f5e3Sopenharmony_ci ASSERT_TRUE(thread_->HasPendingException()); 11484514f5e3Sopenharmony_ci} 11494514f5e3Sopenharmony_ci 11504514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, InheritPrototype_001) 11514514f5e3Sopenharmony_ci{ 11524514f5e3Sopenharmony_ci ecmascript::ThreadManagedScope managedScope(vm_->GetJSThread()); 11534514f5e3Sopenharmony_ci LocalScope scope(vm_); 11544514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = vm_->GetGlobalEnv(); 11554514f5e3Sopenharmony_ci // new with Builtins::Set Prototype 11564514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> set = env->GetBuiltinsSetFunction(); 11574514f5e3Sopenharmony_ci Local<FunctionRef> setLocal = JSNApiHelper::ToLocal<FunctionRef>(set); 11584514f5e3Sopenharmony_ci // new with Builtins::Map Prototype 11594514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> map = env->GetBuiltinsMapFunction(); 11604514f5e3Sopenharmony_ci Local<FunctionRef> mapLocal = JSNApiHelper::ToLocal<FunctionRef>(map); 11614514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> setPrototype(thread_, JSHandle<JSFunction>::Cast(set)->GetFunctionPrototype()); 11624514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> mapPrototype(thread_, JSHandle<JSFunction>::Cast(map)->GetFunctionPrototype()); 11634514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> mapPrototypeProto(thread_, JSTaggedValue::GetPrototype(thread_, mapPrototype)); 11644514f5e3Sopenharmony_ci bool same = JSTaggedValue::SameValue(setPrototype, mapPrototypeProto); 11654514f5e3Sopenharmony_ci // before inherit, map.Prototype.__proto__ should be different from set.Prototype 11664514f5e3Sopenharmony_ci ASSERT_FALSE(same); 11674514f5e3Sopenharmony_ci // before inherit, map.__proto__ should be different from set 11684514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> mapProto(thread_, JSTaggedValue::GetPrototype(thread_, map)); 11694514f5e3Sopenharmony_ci bool same1 = JSTaggedValue::SameValue(set, mapProto); 11704514f5e3Sopenharmony_ci ASSERT_FALSE(same1); 11714514f5e3Sopenharmony_ci 11724514f5e3Sopenharmony_ci // Set property to Set Function 11734514f5e3Sopenharmony_ci auto factory = vm_->GetFactory(); 11744514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> defaultString = thread_->GlobalConstants()->GetHandledDefaultString(); 11754514f5e3Sopenharmony_ci PropertyDescriptor desc = PropertyDescriptor(thread_, defaultString); 11764514f5e3Sopenharmony_ci bool success = JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(set), defaultString, desc); 11774514f5e3Sopenharmony_ci ASSERT_TRUE(success); 11784514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> property1String(thread_, factory->NewFromASCII("property1").GetTaggedValue()); 11794514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> func = env->GetTypedArrayFunction(); 11804514f5e3Sopenharmony_ci PropertyDescriptor desc1 = PropertyDescriptor(thread_, func); 11814514f5e3Sopenharmony_ci bool success1 = JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(set), property1String, desc1); 11824514f5e3Sopenharmony_ci ASSERT_TRUE(success1); 11834514f5e3Sopenharmony_ci 11844514f5e3Sopenharmony_ci mapLocal->Inherit(vm_, setLocal); 11854514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonHandle = JSNApiHelper::ToJSHandle(mapLocal); 11864514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonPrototype(thread_, JSHandle<JSFunction>::Cast(sonHandle)->GetFunctionPrototype()); 11874514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonPrototypeProto(thread_, JSTaggedValue::GetPrototype(thread_, sonPrototype)); 11884514f5e3Sopenharmony_ci bool same2 = JSTaggedValue::SameValue(setPrototype, sonPrototypeProto); 11894514f5e3Sopenharmony_ci ASSERT_TRUE(same2); 11904514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonProto(thread_, JSTaggedValue::GetPrototype(thread_, map)); 11914514f5e3Sopenharmony_ci bool same3 = JSTaggedValue::SameValue(set, sonProto); 11924514f5e3Sopenharmony_ci ASSERT_TRUE(same3); 11934514f5e3Sopenharmony_ci 11944514f5e3Sopenharmony_ci // son = new Son(), Son() inherit from Parent(), Test whether son.InstanceOf(Parent) is true 11954514f5e3Sopenharmony_ci JSHandle<JSObject> sonObj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>::Cast(sonHandle), sonHandle); 11964514f5e3Sopenharmony_ci bool isInstance = JSObject::InstanceOf(thread_, JSHandle<JSTaggedValue>::Cast(sonObj), set); 11974514f5e3Sopenharmony_ci ASSERT_TRUE(isInstance); 11984514f5e3Sopenharmony_ci 11994514f5e3Sopenharmony_ci // Test whether son Function can access to property of parent Function 12004514f5e3Sopenharmony_ci OperationResult res = JSObject::GetProperty(thread_, JSHandle<JSObject>::Cast(sonHandle), defaultString); 12014514f5e3Sopenharmony_ci bool same4 = JSTaggedValue::SameValue(defaultString, res.GetValue()); 12024514f5e3Sopenharmony_ci ASSERT_TRUE(same4); 12034514f5e3Sopenharmony_ci OperationResult res1 = JSObject::GetProperty(thread_, JSHandle<JSObject>::Cast(sonHandle), property1String); 12044514f5e3Sopenharmony_ci bool same5 = JSTaggedValue::SameValue(func, res1.GetValue()); 12054514f5e3Sopenharmony_ci ASSERT_TRUE(same5); 12064514f5e3Sopenharmony_ci 12074514f5e3Sopenharmony_ci // new with empty Function Constructor 12084514f5e3Sopenharmony_ci Local<FunctionRef> son1 = FunctionRef::New(vm_, FunctionCallback, nullptr); 12094514f5e3Sopenharmony_ci son1->Inherit(vm_, mapLocal); 12104514f5e3Sopenharmony_ci JSHandle<JSFunction> son1Handle = JSHandle<JSFunction>::Cast(JSNApiHelper::ToJSHandle(son1)); 12114514f5e3Sopenharmony_ci ASSERT_TRUE(son1Handle->HasFunctionPrototype()); 12124514f5e3Sopenharmony_ci} 12134514f5e3Sopenharmony_ci 12144514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, InheritPrototype_002) 12154514f5e3Sopenharmony_ci{ 12164514f5e3Sopenharmony_ci ecmascript::ThreadManagedScope managedScope(vm_->GetJSThread()); 12174514f5e3Sopenharmony_ci LocalScope scope(vm_); 12184514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = vm_->GetGlobalEnv(); 12194514f5e3Sopenharmony_ci // new with Builtins::weakSet Prototype 12204514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> weakSet = env->GetBuiltinsWeakSetFunction(); 12214514f5e3Sopenharmony_ci Local<FunctionRef> weakSetLocal = JSNApiHelper::ToLocal<FunctionRef>(weakSet); 12224514f5e3Sopenharmony_ci // new with Builtins::weakMap Prototype 12234514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> weakMap = env->GetBuiltinsWeakMapFunction(); 12244514f5e3Sopenharmony_ci Local<FunctionRef> weakMapLocal = JSNApiHelper::ToLocal<FunctionRef>(weakMap); 12254514f5e3Sopenharmony_ci 12264514f5e3Sopenharmony_ci weakMapLocal->Inherit(vm_, weakSetLocal); 12274514f5e3Sopenharmony_ci 12284514f5e3Sopenharmony_ci auto factory = vm_->GetFactory(); 12294514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> property1String(thread_, factory->NewFromASCII("property1").GetTaggedValue()); 12304514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> func = env->GetArrayFunction(); 12314514f5e3Sopenharmony_ci PropertyDescriptor desc1 = PropertyDescriptor(thread_, func); 12324514f5e3Sopenharmony_ci bool success1 = JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(weakMap), property1String, desc1); 12334514f5e3Sopenharmony_ci ASSERT_TRUE(success1); 12344514f5e3Sopenharmony_ci 12354514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonHandle = JSNApiHelper::ToJSHandle(weakMapLocal); 12364514f5e3Sopenharmony_ci JSHandle<JSObject> sonObj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>::Cast(sonHandle), sonHandle); 12374514f5e3Sopenharmony_ci 12384514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> fatherHandle = JSNApiHelper::ToJSHandle(weakSetLocal); 12394514f5e3Sopenharmony_ci JSHandle<JSObject> fatherObj = 12404514f5e3Sopenharmony_ci factory->NewJSObjectByConstructor(JSHandle<JSFunction>::Cast(fatherHandle), fatherHandle); 12414514f5e3Sopenharmony_ci 12424514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonMethod = JSObject::GetMethod(thread_, JSHandle<JSTaggedValue>(sonObj), property1String); 12434514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> fatherMethod = 12444514f5e3Sopenharmony_ci JSObject::GetMethod(thread_, JSHandle<JSTaggedValue>(fatherObj), property1String); 12454514f5e3Sopenharmony_ci bool same = JSTaggedValue::SameValue(sonMethod, fatherMethod); 12464514f5e3Sopenharmony_ci ASSERT_TRUE(same); 12474514f5e3Sopenharmony_ci} 12484514f5e3Sopenharmony_ci 12494514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, InheritPrototype_003) 12504514f5e3Sopenharmony_ci{ 12514514f5e3Sopenharmony_ci ecmascript::ThreadManagedScope managedScope(vm_->GetJSThread()); 12524514f5e3Sopenharmony_ci LocalScope scope(vm_); 12534514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = vm_->GetGlobalEnv(); 12544514f5e3Sopenharmony_ci auto factory = vm_->GetFactory(); 12554514f5e3Sopenharmony_ci 12564514f5e3Sopenharmony_ci JSHandle<Method> invokeSelf = 12574514f5e3Sopenharmony_ci factory->NewMethodForNativeFunction(reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf)); 12584514f5e3Sopenharmony_ci // father type 12594514f5e3Sopenharmony_ci JSHandle<JSHClass> protoClass = JSHandle<JSHClass>::Cast(env->GetFunctionClassWithProto()); 12604514f5e3Sopenharmony_ci JSHandle<JSFunction> protoFunc = factory->NewJSFunctionByHClass(invokeSelf, protoClass); 12614514f5e3Sopenharmony_ci Local<FunctionRef> protoLocal = JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(protoFunc)); 12624514f5e3Sopenharmony_ci // son type 12634514f5e3Sopenharmony_ci JSHandle<JSHClass> noProtoClass = JSHandle<JSHClass>::Cast(env->GetFunctionClassWithoutProto()); 12644514f5e3Sopenharmony_ci JSHandle<JSFunction> noProtoFunc = factory->NewJSFunctionByHClass(invokeSelf, noProtoClass); 12654514f5e3Sopenharmony_ci Local<FunctionRef> noProtoLocal = JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(noProtoFunc)); 12664514f5e3Sopenharmony_ci 12674514f5e3Sopenharmony_ci JSHandle<JSFunction> sonHandle = JSHandle<JSFunction>::Cast(JSNApiHelper::ToJSHandle(noProtoLocal)); 12684514f5e3Sopenharmony_ci EXPECT_FALSE(sonHandle->HasFunctionPrototype()); 12694514f5e3Sopenharmony_ci 12704514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> defaultString = thread_->GlobalConstants()->GetHandledDefaultString(); 12714514f5e3Sopenharmony_ci PropertyDescriptor desc = PropertyDescriptor(thread_, defaultString); 12724514f5e3Sopenharmony_ci JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(protoFunc), defaultString, desc); 12734514f5e3Sopenharmony_ci 12744514f5e3Sopenharmony_ci noProtoLocal->Inherit(vm_, protoLocal); 12754514f5e3Sopenharmony_ci JSHandle<JSFunction> son1Handle = JSHandle<JSFunction>::Cast(JSNApiHelper::ToJSHandle(noProtoLocal)); 12764514f5e3Sopenharmony_ci EXPECT_TRUE(son1Handle->HasFunctionPrototype()); 12774514f5e3Sopenharmony_ci 12784514f5e3Sopenharmony_ci OperationResult res = JSObject::GetProperty(thread_, JSHandle<JSObject>::Cast(son1Handle), defaultString); 12794514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(defaultString, res.GetValue()), true); 12804514f5e3Sopenharmony_ci 12814514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> propertyString(thread_, factory->NewFromASCII("property").GetTaggedValue()); 12824514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> func = env->GetArrayFunction(); 12834514f5e3Sopenharmony_ci PropertyDescriptor desc1 = PropertyDescriptor(thread_, func); 12844514f5e3Sopenharmony_ci JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(protoFunc), propertyString, desc1); 12854514f5e3Sopenharmony_ci OperationResult res1 = JSObject::GetProperty(thread_, JSHandle<JSObject>::Cast(son1Handle), propertyString); 12864514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(func, res1.GetValue()), true); 12874514f5e3Sopenharmony_ci} 12884514f5e3Sopenharmony_ci 12894514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, InheritPrototype_004) 12904514f5e3Sopenharmony_ci{ 12914514f5e3Sopenharmony_ci ecmascript::ThreadManagedScope managedScope(vm_->GetJSThread()); 12924514f5e3Sopenharmony_ci LocalScope scope(vm_); 12934514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = vm_->GetGlobalEnv(); 12944514f5e3Sopenharmony_ci auto factory = vm_->GetFactory(); 12954514f5e3Sopenharmony_ci 12964514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> weakSet = env->GetBuiltinsWeakSetFunction(); 12974514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> deleteString(factory->NewFromASCII("delete")); 12984514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> addString(factory->NewFromASCII("add")); 12994514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> defaultString = thread_->GlobalConstants()->GetHandledDefaultString(); 13004514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> deleteMethod = JSObject::GetMethod(thread_, weakSet, deleteString); 13014514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> addMethod = JSObject::GetMethod(thread_, weakSet, addString); 13024514f5e3Sopenharmony_ci 13034514f5e3Sopenharmony_ci JSHandle<Method> invokeSelf = 13044514f5e3Sopenharmony_ci factory->NewMethodForNativeFunction(reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf)); 13054514f5e3Sopenharmony_ci JSHandle<Method> ctor = 13064514f5e3Sopenharmony_ci factory->NewMethodForNativeFunction(reinterpret_cast<void *>(BuiltinsFunction::FunctionConstructor)); 13074514f5e3Sopenharmony_ci 13084514f5e3Sopenharmony_ci JSHandle<JSHClass> protoClass = JSHandle<JSHClass>::Cast(env->GetFunctionClassWithProto()); 13094514f5e3Sopenharmony_ci JSHandle<JSFunction> funcFuncPrototype = factory->NewJSFunctionByHClass(invokeSelf, protoClass); 13104514f5e3Sopenharmony_ci // add method in funcPrototype 13114514f5e3Sopenharmony_ci PropertyDescriptor desc = PropertyDescriptor(thread_, deleteMethod); 13124514f5e3Sopenharmony_ci JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(funcFuncPrototype), deleteString, desc); 13134514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> funcFuncPrototypeValue(funcFuncPrototype); 13144514f5e3Sopenharmony_ci 13154514f5e3Sopenharmony_ci JSHandle<JSHClass> funcFuncProtoIntanceClass = 13164514f5e3Sopenharmony_ci factory->NewEcmaHClass(JSFunction::SIZE, JSType::JS_FUNCTION, funcFuncPrototypeValue); 13174514f5e3Sopenharmony_ci // new with NewJSFunctionByHClass::function Class 13184514f5e3Sopenharmony_ci JSHandle<JSFunction> protoFunc = factory->NewJSFunctionByHClass(ctor, funcFuncProtoIntanceClass); 13194514f5e3Sopenharmony_ci EXPECT_TRUE(*protoFunc != nullptr); 13204514f5e3Sopenharmony_ci // add method in funcnction 13214514f5e3Sopenharmony_ci PropertyDescriptor desc1 = PropertyDescriptor(thread_, addMethod); 13224514f5e3Sopenharmony_ci JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(protoFunc), addString, desc1); 13234514f5e3Sopenharmony_ci JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(protoFunc), deleteString, desc); 13244514f5e3Sopenharmony_ci // father type 13254514f5e3Sopenharmony_ci Local<FunctionRef> protoLocal = JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(protoFunc)); 13264514f5e3Sopenharmony_ci 13274514f5e3Sopenharmony_ci JSHandle<JSHClass> noProtoClass = JSHandle<JSHClass>::Cast(env->GetFunctionClassWithoutProto()); 13284514f5e3Sopenharmony_ci JSHandle<JSFunction> funcFuncNoProtoPrototype = factory->NewJSFunctionByHClass(invokeSelf, noProtoClass); 13294514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> funcFuncNoProtoPrototypeValue(funcFuncNoProtoPrototype); 13304514f5e3Sopenharmony_ci 13314514f5e3Sopenharmony_ci JSHandle<JSHClass> funcFuncNoProtoProtoIntanceClass = 13324514f5e3Sopenharmony_ci factory->NewEcmaHClass(JSFunction::SIZE, JSType::JS_FUNCTION, funcFuncNoProtoPrototypeValue); 13334514f5e3Sopenharmony_ci // new with NewJSFunctionByHClass::function Class 13344514f5e3Sopenharmony_ci JSHandle<JSFunction> noProtoFunc = factory->NewJSFunctionByHClass(ctor, funcFuncNoProtoProtoIntanceClass); 13354514f5e3Sopenharmony_ci EXPECT_TRUE(*noProtoFunc != nullptr); 13364514f5e3Sopenharmony_ci // set property that has same key with fater type 13374514f5e3Sopenharmony_ci PropertyDescriptor desc2 = PropertyDescriptor(thread_, defaultString); 13384514f5e3Sopenharmony_ci JSObject::DefineOwnProperty(thread_, JSHandle<JSObject>::Cast(noProtoFunc), addString, desc2); 13394514f5e3Sopenharmony_ci // son type 13404514f5e3Sopenharmony_ci Local<FunctionRef> noProtoLocal = JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(noProtoFunc)); 13414514f5e3Sopenharmony_ci 13424514f5e3Sopenharmony_ci noProtoLocal->Inherit(vm_, protoLocal); 13434514f5e3Sopenharmony_ci 13444514f5e3Sopenharmony_ci JSHandle<JSFunction> sonHandle = JSHandle<JSFunction>::Cast(JSNApiHelper::ToJSHandle(noProtoLocal)); 13454514f5e3Sopenharmony_ci OperationResult res = JSObject::GetProperty(thread_, JSHandle<JSObject>::Cast(sonHandle), deleteString); 13464514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(deleteMethod, res.GetValue()), true); 13474514f5e3Sopenharmony_ci // test if the property value changed after inherit 13484514f5e3Sopenharmony_ci OperationResult res1 = JSObject::GetProperty(thread_, JSHandle<JSObject>::Cast(sonHandle), addString); 13494514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(defaultString, res1.GetValue()), true); 13504514f5e3Sopenharmony_ci} 13514514f5e3Sopenharmony_ci 13524514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ClassFunction) 13534514f5e3Sopenharmony_ci{ 13544514f5e3Sopenharmony_ci LocalScope scope(vm_); 13554514f5e3Sopenharmony_ci Local<FunctionRef> cls = FunctionRef::NewClassFunction(vm_, FunctionCallback, nullptr, nullptr); 13564514f5e3Sopenharmony_ci 13574514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> clsObj = JSNApiHelper::ToJSHandle(Local<JSValueRef>(cls)); 13584514f5e3Sopenharmony_ci ASSERT_TRUE(clsObj->IsClassConstructor()); 13594514f5e3Sopenharmony_ci 13604514f5e3Sopenharmony_ci JSTaggedValue accessor = 13614514f5e3Sopenharmony_ci JSHandle<JSFunction>(clsObj)->GetPropertyInlinedProps(JSFunction::CLASS_PROTOTYPE_INLINE_PROPERTY_INDEX); 13624514f5e3Sopenharmony_ci ASSERT_TRUE(accessor.IsInternalAccessor()); 13634514f5e3Sopenharmony_ci 13644514f5e3Sopenharmony_ci accessor = JSHandle<JSFunction>(clsObj)->GetPropertyInlinedProps(JSFunction::LENGTH_INLINE_PROPERTY_INDEX); 13654514f5e3Sopenharmony_ci ASSERT_TRUE(!accessor.IsUndefinedOrNull()); 13664514f5e3Sopenharmony_ci} 13674514f5e3Sopenharmony_ci 13684514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, WeakRefSecondPassCallback) 13694514f5e3Sopenharmony_ci{ 13704514f5e3Sopenharmony_ci ecmascript::ThreadManagedScope managedScope(vm_->GetJSThread()); 13714514f5e3Sopenharmony_ci LocalScope scope(vm_); 13724514f5e3Sopenharmony_ci Local<ObjectRef> object1 = ObjectRef::New(vm_); 13734514f5e3Sopenharmony_ci Global<ObjectRef> globalObject1(vm_, object1); 13744514f5e3Sopenharmony_ci globalObject1.SetWeak(); 13754514f5e3Sopenharmony_ci NativeReferenceHelper *temp = nullptr; 13764514f5e3Sopenharmony_ci { 13774514f5e3Sopenharmony_ci LocalScope scope1(vm_); 13784514f5e3Sopenharmony_ci Local<ObjectRef> object2 = ObjectRef::New(vm_); 13794514f5e3Sopenharmony_ci Global<ObjectRef> globalObject2(vm_, object2); 13804514f5e3Sopenharmony_ci NativeReferenceHelper *ref1 = new NativeReferenceHelper(vm_, globalObject2, WeakRefCallback); 13814514f5e3Sopenharmony_ci ref1->SetWeakCallback(); 13824514f5e3Sopenharmony_ci temp = ref1; 13834514f5e3Sopenharmony_ci } 13844514f5e3Sopenharmony_ci { 13854514f5e3Sopenharmony_ci LocalScope scope1(vm_); 13864514f5e3Sopenharmony_ci Local<ObjectRef> object3 = ObjectRef::New(vm_); 13874514f5e3Sopenharmony_ci Global<ObjectRef> globalObject3(vm_, object3); 13884514f5e3Sopenharmony_ci globalObject3.SetWeak(); 13894514f5e3Sopenharmony_ci } 13904514f5e3Sopenharmony_ci Local<ObjectRef> object4 = ObjectRef::New(vm_); 13914514f5e3Sopenharmony_ci Global<ObjectRef> globalObject4(vm_, object4); 13924514f5e3Sopenharmony_ci NativeReferenceHelper *ref2 = new NativeReferenceHelper(vm_, globalObject4, WeakRefCallback); 13934514f5e3Sopenharmony_ci ref2->SetWeakCallback(); 13944514f5e3Sopenharmony_ci vm_->CollectGarbage(TriggerGCType::OLD_GC); 13954514f5e3Sopenharmony_ci delete temp; 13964514f5e3Sopenharmony_ci delete ref2; 13974514f5e3Sopenharmony_ci} 13984514f5e3Sopenharmony_ci 13994514f5e3Sopenharmony_ci/** 14004514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_027 14014514f5e3Sopenharmony_ci * @tc.name: TriggerGC_OLD_GC 14024514f5e3Sopenharmony_ci * @tc.desc: GC trigger, gcType is the trigger type 14034514f5e3Sopenharmony_ci * @tc.type: FUNC 14044514f5e3Sopenharmony_ci * @tc.require: parameter 14054514f5e3Sopenharmony_ci */ 14064514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, TriggerGC_OLD_GC) 14074514f5e3Sopenharmony_ci{ 14084514f5e3Sopenharmony_ci ecmascript::ThreadManagedScope managedScope(vm_->GetJSThread()); 14094514f5e3Sopenharmony_ci vm_->SetEnableForceGC(false); 14104514f5e3Sopenharmony_ci auto globalEnv = vm_->GetGlobalEnv(); 14114514f5e3Sopenharmony_ci auto factory = vm_->GetFactory(); 14124514f5e3Sopenharmony_ci 14134514f5e3Sopenharmony_ci Local<StringRef> origin = StringRef::NewFromUtf8(vm_, "1"); 14144514f5e3Sopenharmony_ci ASSERT_EQ("1", origin->ToString(vm_)); 14154514f5e3Sopenharmony_ci 14164514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> jsFunc = globalEnv->GetArrayFunction(); 14174514f5e3Sopenharmony_ci JSHandle<JSObject> objVal1 = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(jsFunc), jsFunc); 14184514f5e3Sopenharmony_ci JSHandle<JSObject> objVal2 = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(jsFunc), jsFunc); 14194514f5e3Sopenharmony_ci JSObject *newObj2 = *objVal2; 14204514f5e3Sopenharmony_ci JSTaggedValue canBeGcValue(newObj2); 14214514f5e3Sopenharmony_ci 14224514f5e3Sopenharmony_ci uint32_t arrayLength = 2; 14234514f5e3Sopenharmony_ci JSHandle<TaggedArray> taggedArray = factory->NewTaggedArray(arrayLength); 14244514f5e3Sopenharmony_ci taggedArray->Set(thread_, 0, objVal1); 14254514f5e3Sopenharmony_ci taggedArray->Set(thread_, 1, canBeGcValue); 14264514f5e3Sopenharmony_ci EXPECT_EQ(taggedArray->GetIdx(objVal1.GetTaggedValue()), 0U); 14274514f5e3Sopenharmony_ci EXPECT_EQ(taggedArray->GetIdx(canBeGcValue), 1U); 14284514f5e3Sopenharmony_ci 14294514f5e3Sopenharmony_ci // trigger gc 14304514f5e3Sopenharmony_ci JSNApi::TRIGGER_GC_TYPE gcType = JSNApi::TRIGGER_GC_TYPE::OLD_GC; 14314514f5e3Sopenharmony_ci JSNApi::TriggerGC(vm_, gcType); 14324514f5e3Sopenharmony_ci gcType = JSNApi::TRIGGER_GC_TYPE::SHARED_GC; 14334514f5e3Sopenharmony_ci JSNApi::TriggerGC(vm_, gcType); 14344514f5e3Sopenharmony_ci gcType = JSNApi::TRIGGER_GC_TYPE::SHARED_FULL_GC; 14354514f5e3Sopenharmony_ci JSNApi::TriggerGC(vm_, gcType); 14364514f5e3Sopenharmony_ci 14374514f5e3Sopenharmony_ci EXPECT_EQ(taggedArray->GetIdx(objVal1.GetTaggedValue()), 0U); 14384514f5e3Sopenharmony_ci EXPECT_EQ(taggedArray->GetIdx(canBeGcValue), TaggedArray::MAX_ARRAY_INDEX); 14394514f5e3Sopenharmony_ci ASSERT_EQ("1", origin->ToString(vm_)); 14404514f5e3Sopenharmony_ci 14414514f5e3Sopenharmony_ci vm_->SetEnableForceGC(true); 14424514f5e3Sopenharmony_ci} 14434514f5e3Sopenharmony_ci 14444514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, Hint_GC) 14454514f5e3Sopenharmony_ci{ 14464514f5e3Sopenharmony_ci ecmascript::ThreadManagedScope managedScope(thread_); 14474514f5e3Sopenharmony_ci vm_->SetEnableForceGC(false); 14484514f5e3Sopenharmony_ci [[maybe_unused]] auto heap = const_cast<Heap *>(thread_->GetEcmaVM()->GetHeap()); 14494514f5e3Sopenharmony_ci 14504514f5e3Sopenharmony_ci#ifdef NDEBUG 14514514f5e3Sopenharmony_ci heap->CollectGarbage(TriggerGCType::OLD_GC); 14524514f5e3Sopenharmony_ci { 14534514f5e3Sopenharmony_ci [[maybe_unused]] ecmascript::EcmaHandleScope baseScope(thread_); 14544514f5e3Sopenharmony_ci for (int i = 0; i < 2049; i++) { 14554514f5e3Sopenharmony_ci [[maybe_unused]] JSHandle<TaggedArray> array = thread_->GetEcmaVM()->GetFactory()->NewTaggedArray( 14564514f5e3Sopenharmony_ci 1024, JSTaggedValue::Hole(), MemSpaceType::SEMI_SPACE); 14574514f5e3Sopenharmony_ci } 14584514f5e3Sopenharmony_ci } 14594514f5e3Sopenharmony_ci size_t beforeSize = heap->GetHeapObjectSize(); 14604514f5e3Sopenharmony_ci#endif 14614514f5e3Sopenharmony_ci 14624514f5e3Sopenharmony_ci Local<StringRef> origin = StringRef::NewFromUtf8(vm_, "1"); 14634514f5e3Sopenharmony_ci ASSERT_EQ("1", origin->ToString(vm_)); 14644514f5e3Sopenharmony_ci 14654514f5e3Sopenharmony_ci // trigger gc 14664514f5e3Sopenharmony_ci JSNApi::MemoryReduceDegree degree = JSNApi::MemoryReduceDegree::LOW; 14674514f5e3Sopenharmony_ci JSNApi::HintGC(vm_, degree, GCReason::HINT_GC); 14684514f5e3Sopenharmony_ci degree = JSNApi::MemoryReduceDegree::MIDDLE; 14694514f5e3Sopenharmony_ci JSNApi::HintGC(vm_, degree, GCReason::HINT_GC); 14704514f5e3Sopenharmony_ci degree = JSNApi::MemoryReduceDegree::HIGH; 14714514f5e3Sopenharmony_ci JSNApi::HintGC(vm_, degree, GCReason::HINT_GC); 14724514f5e3Sopenharmony_ci 14734514f5e3Sopenharmony_ci ASSERT_EQ("1", origin->ToString(vm_)); 14744514f5e3Sopenharmony_ci#ifdef NDEBUG 14754514f5e3Sopenharmony_ci size_t afterSize = heap->GetHeapObjectSize(); 14764514f5e3Sopenharmony_ci EXPECT_TRUE(afterSize < beforeSize); 14774514f5e3Sopenharmony_ci#endif 14784514f5e3Sopenharmony_ci vm_->SetEnableForceGC(true); 14794514f5e3Sopenharmony_ci} 14804514f5e3Sopenharmony_ci 14814514f5e3Sopenharmony_ci/* @tc.number: ffi_interface_api_028 14824514f5e3Sopenharmony_ci * @tc.name: addWorker_DeleteWorker 14834514f5e3Sopenharmony_ci * @tc.desc: 14844514f5e3Sopenharmony_ci * addWorker:Using a WorkerVm as a parameter to modify the workInfo of the current vm 14854514f5e3Sopenharmony_ci * DeleteWorker:Delete WorkerVm 14864514f5e3Sopenharmony_ci * @tc.type: FUNC 14874514f5e3Sopenharmony_ci * @tc.require: parameter 14884514f5e3Sopenharmony_ci */ 14894514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, addWorker_DeleteWorker) 14904514f5e3Sopenharmony_ci{ 14914514f5e3Sopenharmony_ci std::thread t1([&]() { 14924514f5e3Sopenharmony_ci JSRuntimeOptions option; 14934514f5e3Sopenharmony_ci EcmaVM *workerVm = JSNApi::CreateEcmaVM(option); 14944514f5e3Sopenharmony_ci JSNApi::AddWorker(vm_, workerVm); 14954514f5e3Sopenharmony_ci bool hasDeleted = JSNApi::DeleteWorker(vm_, workerVm); 14964514f5e3Sopenharmony_ci JSNApi::DestroyJSVM(workerVm); 14974514f5e3Sopenharmony_ci EXPECT_TRUE(hasDeleted); 14984514f5e3Sopenharmony_ci }); 14994514f5e3Sopenharmony_ci { 15004514f5e3Sopenharmony_ci ThreadSuspensionScope suspensionScope(thread_); 15014514f5e3Sopenharmony_ci t1.join(); 15024514f5e3Sopenharmony_ci } 15034514f5e3Sopenharmony_ci 15044514f5e3Sopenharmony_ci bool hasDeleted = JSNApi::DeleteWorker(vm_, nullptr); 15054514f5e3Sopenharmony_ci EXPECT_FALSE(hasDeleted); 15064514f5e3Sopenharmony_ci} 15074514f5e3Sopenharmony_ci 15084514f5e3Sopenharmony_ci/** 15094514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_029 15104514f5e3Sopenharmony_ci * @tc.name: PrimitiveRef_GetValue 15114514f5e3Sopenharmony_ci * @tc.desc:Create an IntegerRef object with an initial value of 0 15124514f5e3Sopenharmony_ci * and test whether the GetValue method can correctly return the associated JSValueRef object. 15134514f5e3Sopenharmony_ci * @tc.type: FUNC 15144514f5e3Sopenharmony_ci * @tc.require: parameter 15154514f5e3Sopenharmony_ci */ 15164514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PrimitiveRef_GetValue) 15174514f5e3Sopenharmony_ci{ 15184514f5e3Sopenharmony_ci auto factory = vm_->GetFactory(); 15194514f5e3Sopenharmony_ci Local<IntegerRef> intValue = IntegerRef::New(vm_, 0); 15204514f5e3Sopenharmony_ci EXPECT_EQ(intValue->Value(), 0); 15214514f5e3Sopenharmony_ci 15224514f5e3Sopenharmony_ci Local<JSValueRef> jsValue = intValue->GetValue(vm_); 15234514f5e3Sopenharmony_ci EXPECT_TRUE(*jsValue == nullptr); 15244514f5e3Sopenharmony_ci 15254514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> nullHandle(thread_, JSTaggedValue::Null()); 15264514f5e3Sopenharmony_ci JSHandle<JSHClass> jsClassHandle = factory->NewEcmaHClass(JSObject::SIZE, JSType::JS_PRIMITIVE_REF, nullHandle); 15274514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> jsTaggedValue(factory->NewJSObjectWithInit(jsClassHandle)); 15284514f5e3Sopenharmony_ci Local<PrimitiveRef> jsValueRef = JSNApiHelper::ToLocal<JSPrimitiveRef>(jsTaggedValue); 15294514f5e3Sopenharmony_ci EXPECT_TRUE(*(jsValueRef->GetValue(vm_)) != nullptr); 15304514f5e3Sopenharmony_ci} 15314514f5e3Sopenharmony_ci 15324514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BigIntRef_New_Uint64) 15334514f5e3Sopenharmony_ci{ 15344514f5e3Sopenharmony_ci uint64_t maxUint64 = std::numeric_limits<uint64_t>::max(); 15354514f5e3Sopenharmony_ci Local<BigIntRef> maxBigintUint64 = BigIntRef::New(vm_, maxUint64); 15364514f5e3Sopenharmony_ci EXPECT_TRUE(maxBigintUint64->IsBigInt(vm_)); 15374514f5e3Sopenharmony_ci 15384514f5e3Sopenharmony_ci JSHandle<BigInt> maxBigintUint64Val(thread_, JSNApiHelper::ToJSTaggedValue(*maxBigintUint64)); 15394514f5e3Sopenharmony_ci EXPECT_EQ(maxBigintUint64Val->GetDigit(0), static_cast<uint32_t>(maxUint64 & 0xffffffff)); 15404514f5e3Sopenharmony_ci EXPECT_EQ(maxBigintUint64Val->GetDigit(1), static_cast<uint32_t>((maxUint64 >> BigInt::DATEBITS) & 0xffffffff)); 15414514f5e3Sopenharmony_ci 15424514f5e3Sopenharmony_ci uint64_t minUint64 = std::numeric_limits<uint64_t>::min(); 15434514f5e3Sopenharmony_ci Local<BigIntRef> minBigintUint64 = BigIntRef::New(vm_, minUint64); 15444514f5e3Sopenharmony_ci EXPECT_TRUE(minBigintUint64->IsBigInt(vm_)); 15454514f5e3Sopenharmony_ci 15464514f5e3Sopenharmony_ci JSHandle<BigInt> minBigintUint64Val(thread_, JSNApiHelper::ToJSTaggedValue(*minBigintUint64)); 15474514f5e3Sopenharmony_ci EXPECT_EQ(minBigintUint64Val->GetDigit(0), static_cast<uint32_t>(minUint64 & 0xffffffff)); 15484514f5e3Sopenharmony_ci EXPECT_EQ(minBigintUint64Val->GetLength(), 1U); 15494514f5e3Sopenharmony_ci} 15504514f5e3Sopenharmony_ci 15514514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BigIntRef_New_Int64) 15524514f5e3Sopenharmony_ci{ 15534514f5e3Sopenharmony_ci int64_t maxInt64 = std::numeric_limits<int64_t>::max(); 15544514f5e3Sopenharmony_ci Local<BigIntRef> maxBigintInt64 = BigIntRef::New(vm_, maxInt64); 15554514f5e3Sopenharmony_ci EXPECT_TRUE(maxBigintInt64->IsBigInt(vm_)); 15564514f5e3Sopenharmony_ci 15574514f5e3Sopenharmony_ci JSHandle<BigInt> maxBigintInt64Val(thread_, JSNApiHelper::ToJSTaggedValue(*maxBigintInt64)); 15584514f5e3Sopenharmony_ci EXPECT_EQ(maxBigintInt64Val->GetDigit(0), static_cast<uint32_t>(maxInt64 & 0xffffffff)); 15594514f5e3Sopenharmony_ci EXPECT_EQ(maxBigintInt64Val->GetDigit(1), static_cast<uint32_t>((maxInt64 >> BigInt::DATEBITS) & 0xffffffff)); 15604514f5e3Sopenharmony_ci 15614514f5e3Sopenharmony_ci int64_t minInt64 = std::numeric_limits<int64_t>::min(); 15624514f5e3Sopenharmony_ci Local<BigIntRef> minBigintInt64 = BigIntRef::New(vm_, minInt64); 15634514f5e3Sopenharmony_ci EXPECT_TRUE(minBigintInt64->IsBigInt(vm_)); 15644514f5e3Sopenharmony_ci 15654514f5e3Sopenharmony_ci JSHandle<BigInt> minBigintInt64Val(thread_, JSNApiHelper::ToJSTaggedValue(*minBigintInt64)); 15664514f5e3Sopenharmony_ci EXPECT_EQ(minBigintInt64Val->GetSign(), true); 15674514f5e3Sopenharmony_ci EXPECT_EQ(minBigintInt64Val->GetDigit(0), static_cast<uint32_t>((-minInt64) & 0xffffffff)); 15684514f5e3Sopenharmony_ci EXPECT_EQ(minBigintInt64Val->GetDigit(1), static_cast<uint32_t>(((-minInt64) >> BigInt::DATEBITS) & 0xffffffff)); 15694514f5e3Sopenharmony_ci} 15704514f5e3Sopenharmony_ci 15714514f5e3Sopenharmony_ci/** 15724514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_030 15734514f5e3Sopenharmony_ci * @tc.name: BigIntRef_CreateBigWords_GetWordsArray_GetWordsArraySize 15744514f5e3Sopenharmony_ci * @tc.desc: 15754514f5e3Sopenharmony_ci * IsBigInt:Determine if it is bigint 15764514f5e3Sopenharmony_ci * @tc.type: FUNC 15774514f5e3Sopenharmony_ci * @tc.require: parameter 15784514f5e3Sopenharmony_ci */ 15794514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BigIntRef_CreateBigWords_GetWordsArray_GetWordsArraySize) 15804514f5e3Sopenharmony_ci{ 15814514f5e3Sopenharmony_ci bool sign = false; 15824514f5e3Sopenharmony_ci uint32_t size = 3; 15834514f5e3Sopenharmony_ci const uint32_t MULTIPLE = 2; 15844514f5e3Sopenharmony_ci const uint64_t words[3] = { 15854514f5e3Sopenharmony_ci std::numeric_limits<uint64_t>::min() - 1, 15864514f5e3Sopenharmony_ci std::numeric_limits<uint64_t>::min(), 15874514f5e3Sopenharmony_ci std::numeric_limits<uint64_t>::max(), 15884514f5e3Sopenharmony_ci }; 15894514f5e3Sopenharmony_ci Local<JSValueRef> bigWords = BigIntRef::CreateBigWords(vm_, sign, size, words); 15904514f5e3Sopenharmony_ci EXPECT_TRUE(bigWords->IsBigInt(vm_)); 15914514f5e3Sopenharmony_ci 15924514f5e3Sopenharmony_ci Local<BigIntRef> bigWordsRef(bigWords); 15934514f5e3Sopenharmony_ci EXPECT_EQ(bigWordsRef->GetWordsArraySize(vm_), size); 15944514f5e3Sopenharmony_ci 15954514f5e3Sopenharmony_ci JSHandle<BigInt> bigintUint64Val(thread_, JSNApiHelper::ToJSTaggedValue(*bigWords)); 15964514f5e3Sopenharmony_ci EXPECT_EQ(bigintUint64Val->GetSign(), false); 15974514f5e3Sopenharmony_ci EXPECT_EQ(bigintUint64Val->GetLength(), size * MULTIPLE); 15984514f5e3Sopenharmony_ci 15994514f5e3Sopenharmony_ci bool resultSignBit = true; 16004514f5e3Sopenharmony_ci uint64_t *resultWords = new uint64_t[3](); // 3 : length of words array 16014514f5e3Sopenharmony_ci bigWordsRef->GetWordsArray(vm_, &resultSignBit, size, resultWords); 16024514f5e3Sopenharmony_ci EXPECT_EQ(resultSignBit, false); 16034514f5e3Sopenharmony_ci EXPECT_EQ(resultWords[0], words[0]); 16044514f5e3Sopenharmony_ci EXPECT_EQ(resultWords[1], words[1]); 16054514f5e3Sopenharmony_ci EXPECT_EQ(resultWords[2], words[2]); 16064514f5e3Sopenharmony_ci delete[] resultWords; 16074514f5e3Sopenharmony_ci} 16084514f5e3Sopenharmony_ci 16094514f5e3Sopenharmony_ci/** 16104514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_031 16114514f5e3Sopenharmony_ci * @tc.name: DateRef_New_ToString_GetTime_BigIntRef_CreateBigWords_GetWordsArray 16124514f5e3Sopenharmony_ci * @tc.desc:The purpose of testing is to verify whether the DateRef method correctly converts time to Date type 16134514f5e3Sopenharmony_ci * and converts Date type to string type, while also verifying whether its operation to obtain time is correct. 16144514f5e3Sopenharmony_ci * Used to verify the success of creating a BigIntRef object and obtaining a 16154514f5e3Sopenharmony_ci * word array of large integer objects. 16164514f5e3Sopenharmony_ci * @tc.type: FUNC 16174514f5e3Sopenharmony_ci * @tc.require: parameter 16184514f5e3Sopenharmony_ci */ 16194514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, DateRef_New_ToString_GetTime) 16204514f5e3Sopenharmony_ci{ 16214514f5e3Sopenharmony_ci double time = 1.1; 16224514f5e3Sopenharmony_ci Local<DateRef> data = DateRef::New(vm_, time); 16234514f5e3Sopenharmony_ci EXPECT_TRUE(data->IsDate(vm_)); 16244514f5e3Sopenharmony_ci 16254514f5e3Sopenharmony_ci Local<StringRef> tostring = data->ToString(vm_); 16264514f5e3Sopenharmony_ci Local<JSValueRef> toValue(tostring); 16274514f5e3Sopenharmony_ci EXPECT_TRUE(tostring->IsString(vm_)); 16284514f5e3Sopenharmony_ci double dou = data->GetTime(vm_); 16294514f5e3Sopenharmony_ci EXPECT_EQ(dou, 1.1); 16304514f5e3Sopenharmony_ci} 16314514f5e3Sopenharmony_ci 16324514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PromiseRef_Finally) 16334514f5e3Sopenharmony_ci{ 16344514f5e3Sopenharmony_ci LocalScope scope(vm_); 16354514f5e3Sopenharmony_ci Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm_); 16364514f5e3Sopenharmony_ci 16374514f5e3Sopenharmony_ci Local<PromiseRef> promise = capability->GetPromise(vm_); 16384514f5e3Sopenharmony_ci Local<FunctionRef> reject = FunctionRef::New(vm_, RejectCallback); 16394514f5e3Sopenharmony_ci Local<PromiseRef> catchPromise = promise->Finally(vm_, reject); 16404514f5e3Sopenharmony_ci ASSERT_TRUE(promise->IsPromise(vm_)); 16414514f5e3Sopenharmony_ci ASSERT_TRUE(catchPromise->IsPromise(vm_)); 16424514f5e3Sopenharmony_ci Local<PromiseRef> catchPromise1 = promise->Then(vm_, reject, reject); 16434514f5e3Sopenharmony_ci ASSERT_TRUE(catchPromise1->IsPromise(vm_)); 16444514f5e3Sopenharmony_ci Local<FunctionRef> callback = FunctionRef::New(vm_, FunctionCallback); 16454514f5e3Sopenharmony_ci ASSERT_TRUE(!callback.IsEmpty()); 16464514f5e3Sopenharmony_ci Local<PromiseRef> catchPromise2 = promise->Then(vm_, callback); 16474514f5e3Sopenharmony_ci ASSERT_TRUE(catchPromise2->IsPromise(vm_)); 16484514f5e3Sopenharmony_ci} 16494514f5e3Sopenharmony_ci 16504514f5e3Sopenharmony_ci/* 16514514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_032 16524514f5e3Sopenharmony_ci * @tc.name: JSNApi_SerializeValue 16534514f5e3Sopenharmony_ci * @tc.desc: The main function of Undefined is to initialize some variables for subsequent testing, 16544514f5e3Sopenharmony_ci * testing the correctness and reliability of the JSNApi:: SerializeValue function, 16554514f5e3Sopenharmony_ci * and ensuring that it can serialize values correctly. 16564514f5e3Sopenharmony_ci * @tc.type: FUNC 16574514f5e3Sopenharmony_ci * @tc.require: parameter 16584514f5e3Sopenharmony_ci */ 16594514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApi_SerializeValue) 16604514f5e3Sopenharmony_ci{ 16614514f5e3Sopenharmony_ci LocalScope scope(vm_); 16624514f5e3Sopenharmony_ci Local<FunctionRef> callback = FunctionRef::New(vm_, FunctionCallback); 16634514f5e3Sopenharmony_ci ASSERT_TRUE(!callback.IsEmpty()); 16644514f5e3Sopenharmony_ci std::vector<Local<JSValueRef>> arguments; 16654514f5e3Sopenharmony_ci arguments.emplace_back(JSValueRef::Undefined(vm_)); 16664514f5e3Sopenharmony_ci Local<JSValueRef> result = callback->Call(vm_, JSValueRef::Undefined(vm_), arguments.data(), arguments.size()); 16674514f5e3Sopenharmony_ci ASSERT_TRUE(result->IsArray(vm_)); 16684514f5e3Sopenharmony_ci Local<ArrayRef> array(result); 16694514f5e3Sopenharmony_ci ASSERT_EQ(static_cast<uint64_t>(array->Length(vm_)), arguments.size()); 16704514f5e3Sopenharmony_ci void *res = nullptr; 16714514f5e3Sopenharmony_ci res = JSNApi::SerializeValue(vm_, result, JSValueRef::Undefined(vm_), JSValueRef::Undefined(vm_), true); 16724514f5e3Sopenharmony_ci EXPECT_TRUE(res); 16734514f5e3Sopenharmony_ci} 16744514f5e3Sopenharmony_ci 16754514f5e3Sopenharmony_ci/* 16764514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_033 16774514f5e3Sopenharmony_ci * @tc.name: JSNApi_SetHostPromiseRejectionTracker_Call 16784514f5e3Sopenharmony_ci * @tc.desc: Can the host Promise reject callback function of the JavaScript virtual machine be set correctly. 16794514f5e3Sopenharmony_ci * @ Using the functions of Uint8Array and verifying if its attribute values are correct. 16804514f5e3Sopenharmony_ci * @tc.type: FUNC 16814514f5e3Sopenharmony_ci * @tc.require: parameter 16824514f5e3Sopenharmony_ci */ 16834514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApi_SetHostPromiseRejectionTracker) 16844514f5e3Sopenharmony_ci{ 16854514f5e3Sopenharmony_ci void *data = reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf); 16864514f5e3Sopenharmony_ci // 设置 JavaScript 虚拟机的宿主 Promise 拒绝回调函数为 data 所指向的函数。 16874514f5e3Sopenharmony_ci JSNApi::SetHostPromiseRejectionTracker(vm_, data, data); 16884514f5e3Sopenharmony_ci // 首先获取GetJS虚拟机中的当前线程->GetCurrentEcmaContext获取当前上下文->从上下文中获取Promise拒绝回调函数 16894514f5e3Sopenharmony_ci PromiseRejectCallback res = vm_->GetJSThread()->GetCurrentEcmaContext()->GetPromiseRejectCallback(); 16904514f5e3Sopenharmony_ci // 检查回调函数的地址是否等于我们之前设置的 data 的地址 16914514f5e3Sopenharmony_ci ASSERT_EQ(res, reinterpret_cast<ecmascript::PromiseRejectCallback>(data)); 16924514f5e3Sopenharmony_ci} 16934514f5e3Sopenharmony_ci 16944514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApi_SetNativePtrGetter_SetHostEnqueueJob) 16954514f5e3Sopenharmony_ci{ 16964514f5e3Sopenharmony_ci void *cb = reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf); 16974514f5e3Sopenharmony_ci JSNApi::SetNativePtrGetter(vm_, cb); 16984514f5e3Sopenharmony_ci NativePtrGetter res = vm_->GetNativePtrGetter(); 16994514f5e3Sopenharmony_ci ASSERT_EQ(res, reinterpret_cast<ecmascript::NativePtrGetter>(cb)); 17004514f5e3Sopenharmony_ci} 17014514f5e3Sopenharmony_ci 17024514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NumberRef_New) 17034514f5e3Sopenharmony_ci{ 17044514f5e3Sopenharmony_ci uint32_t input = 32; 17054514f5e3Sopenharmony_ci int64_t input1 = 1; 17064514f5e3Sopenharmony_ci Local<NumberRef> res = NumberRef::New(vm_, input); 17074514f5e3Sopenharmony_ci Local<NumberRef> res1 = NumberRef::New(vm_, input1); 17084514f5e3Sopenharmony_ci ASSERT_TRUE(res->IsNumber()); 17094514f5e3Sopenharmony_ci ASSERT_TRUE(res1->IsNumber()); 17104514f5e3Sopenharmony_ci} 17114514f5e3Sopenharmony_ci 17124514f5e3Sopenharmony_ci/** 17134514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_034 17144514f5e3Sopenharmony_ci * @tc.name: ObjectRef_GetOwnEnumerablePropertyNames 17154514f5e3Sopenharmony_ci * @tc.desc:Use the GetOwnEnumerablePropertyNames method to obtain all enumerable property names of the object 17164514f5e3Sopenharmony_ci * and return an ArrayRef object. 17174514f5e3Sopenharmony_ci * @tc.type: FUNC 17184514f5e3Sopenharmony_ci * @tc.require: parameter 17194514f5e3Sopenharmony_ci */ 17204514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ObjectRef_GetOwnEnumerablePropertyNames) 17214514f5e3Sopenharmony_ci{ 17224514f5e3Sopenharmony_ci LocalScope scope(vm_); 17234514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 17244514f5e3Sopenharmony_ci Local<ArrayRef> res = object->GetOwnEnumerablePropertyNames(vm_); 17254514f5e3Sopenharmony_ci ASSERT_TRUE(res->IsArray(vm_)); 17264514f5e3Sopenharmony_ci} 17274514f5e3Sopenharmony_ci 17284514f5e3Sopenharmony_ci/** 17294514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_035 17304514f5e3Sopenharmony_ci * @tc.name: ObjectRef_SetNativePointerFieldCount_GetNativePointerFieldCount 17314514f5e3Sopenharmony_ci * @tc.desc: 17324514f5e3Sopenharmony_ci * SetNativePointerFieldCount:Set the count value of the local pointer field to count 17334514f5e3Sopenharmony_ci * GetNativePointerField:Get native pointer object 17344514f5e3Sopenharmony_ci * SetNativePointerField:Set native pointer properties, including pointers, callback methods, 17354514f5e3Sopenharmony_ci * data, and number of bindings 17364514f5e3Sopenharmony_ci * @tc.type: FUNC 17374514f5e3Sopenharmony_ci * @tc.require: parameter 17384514f5e3Sopenharmony_ci */ 17394514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ObjectRef_SetNativePointerFieldCount_GetNativePointerFieldCount) 17404514f5e3Sopenharmony_ci{ 17414514f5e3Sopenharmony_ci LocalScope scope(vm_); 17424514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 17434514f5e3Sopenharmony_ci int32_t input = 34; 17444514f5e3Sopenharmony_ci object->SetNativePointerFieldCount(vm_, input); 17454514f5e3Sopenharmony_ci int32_t res = object->GetNativePointerFieldCount(vm_); 17464514f5e3Sopenharmony_ci ASSERT_EQ(res, input); 17474514f5e3Sopenharmony_ci NativePointerCallback callBack = nullptr; 17484514f5e3Sopenharmony_ci void *vp1 = static_cast<void *>(new std::string("test")); 17494514f5e3Sopenharmony_ci void *vp2 = static_cast<void *>(new std::string("test")); 17504514f5e3Sopenharmony_ci std::string *sp1 = static_cast<std::string *>(vp1); 17514514f5e3Sopenharmony_ci object->SetNativePointerField(vm_, 33, vp1, callBack, vp2); 17524514f5e3Sopenharmony_ci void *res1 = object->GetNativePointerField(vm_, 33); 17534514f5e3Sopenharmony_ci std::string *sp2 = static_cast<std::string *>(res1); 17544514f5e3Sopenharmony_ci ASSERT_EQ(sp1, sp2); 17554514f5e3Sopenharmony_ci} 17564514f5e3Sopenharmony_ci 17574514f5e3Sopenharmony_ci/** 17584514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_036 17594514f5e3Sopenharmony_ci * @tc.name: FunctionRef_GetFunctionPrototype_SetName_GetName 17604514f5e3Sopenharmony_ci * @tc.desc:Mainly used to verify the correctness of methods such as creating, obtaining prototypes, 17614514f5e3Sopenharmony_ci * setting names, and obtaining FunctionRef objects. 17624514f5e3Sopenharmony_ci * @tc.type: FUNC 17634514f5e3Sopenharmony_ci * @tc.require: parameter 17644514f5e3Sopenharmony_ci */ 17654514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, FunctionRef_GetFunctionPrototype_SetName_GetName) 17664514f5e3Sopenharmony_ci{ 17674514f5e3Sopenharmony_ci LocalScope scope(vm_); 17684514f5e3Sopenharmony_ci NativePointerCallback deleter = nullptr; 17694514f5e3Sopenharmony_ci void *cb = reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf); 17704514f5e3Sopenharmony_ci bool callNative = true; 17714514f5e3Sopenharmony_ci size_t nativeBindingsize = 15; 17724514f5e3Sopenharmony_ci Local<FunctionRef> res = 17734514f5e3Sopenharmony_ci FunctionRef::NewClassFunction(vm_, FunctionCallback, deleter, cb, callNative, nativeBindingsize); 17744514f5e3Sopenharmony_ci ASSERT_TRUE(res->IsFunction(vm_)); 17754514f5e3Sopenharmony_ci Local<JSValueRef> res1 = res->GetFunctionPrototype(vm_); 17764514f5e3Sopenharmony_ci ASSERT_TRUE(res->IsFunction(vm_)); 17774514f5e3Sopenharmony_ci ASSERT_TRUE(!res1->IsArray(vm_)); 17784514f5e3Sopenharmony_ci Local<StringRef> origin = StringRef::NewFromUtf8(vm_, "1"); 17794514f5e3Sopenharmony_ci res->SetName(vm_, origin); 17804514f5e3Sopenharmony_ci Local<StringRef> s = res->GetName(vm_); 17814514f5e3Sopenharmony_ci std::string str = s->ToString(vm_); 17824514f5e3Sopenharmony_ci ASSERT_EQ("1", str); 17834514f5e3Sopenharmony_ci} 17844514f5e3Sopenharmony_ci 17854514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApi_SetAssetPath_GetAssetPath) 17864514f5e3Sopenharmony_ci{ 17874514f5e3Sopenharmony_ci LocalScope scope(vm_); 17884514f5e3Sopenharmony_ci std::string str = "/data/storage/el1/bundle/moduleName/ets/modules.abc"; 17894514f5e3Sopenharmony_ci JSNApi::SetAssetPath(vm_, str); 17904514f5e3Sopenharmony_ci std::string res = JSNApi::GetAssetPath(vm_); 17914514f5e3Sopenharmony_ci ASSERT_EQ(str, res); 17924514f5e3Sopenharmony_ci void *data = reinterpret_cast<void *>(BuiltinsFunction::FunctionPrototypeInvokeSelf); 17934514f5e3Sopenharmony_ci JSNApi::SetLoop(vm_, data); 17944514f5e3Sopenharmony_ci void *res1 = vm_->GetLoop(); 17954514f5e3Sopenharmony_ci ASSERT_EQ(res1, data); 17964514f5e3Sopenharmony_ci} 17974514f5e3Sopenharmony_ci 17984514f5e3Sopenharmony_ci/** 17994514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_037 18004514f5e3Sopenharmony_ci * @tc.name: SetAssetPath 18014514f5e3Sopenharmony_ci * @tc.desc:The resource file path used to verify the success of the setup program. 18024514f5e3Sopenharmony_ci * @tc.type: FUNC 18034514f5e3Sopenharmony_ci * @tc.require: parameter 18044514f5e3Sopenharmony_ci */ 18054514f5e3Sopenharmony_ci 18064514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSValueRef_ToNativePointer) 18074514f5e3Sopenharmony_ci{ 18084514f5e3Sopenharmony_ci LocalScope scope(vm_); 18094514f5e3Sopenharmony_ci Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-123.3"); 18104514f5e3Sopenharmony_ci Local<JSValueRef> toValue(toString); 18114514f5e3Sopenharmony_ci ASSERT_EQ(toString->ToNumber(vm_)->Value(), -123.3); // -123 : test case of input 18124514f5e3Sopenharmony_ci ASSERT_EQ(toString->ToBoolean(vm_)->Value(), true); 18134514f5e3Sopenharmony_ci ASSERT_EQ(toValue->ToString(vm_)->ToString(vm_), "-123.3"); 18144514f5e3Sopenharmony_ci ASSERT_TRUE(toValue->ToObject(vm_)->IsObject(vm_)); 18154514f5e3Sopenharmony_ci Local<NativePointerRef> res = toValue->ToNativePointer(vm_); 18164514f5e3Sopenharmony_ci ASSERT_TRUE(res->IsString(vm_)); 18174514f5e3Sopenharmony_ci} 18184514f5e3Sopenharmony_ci 18194514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GeneratorObjectRef_IsGenerator) 18204514f5e3Sopenharmony_ci{ 18214514f5e3Sopenharmony_ci ObjectFactory *factory = vm_->GetFactory(); 18224514f5e3Sopenharmony_ci auto env = vm_->GetGlobalEnv(); 18234514f5e3Sopenharmony_ci 18244514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> genFunc = env->GetGeneratorFunctionFunction(); 18254514f5e3Sopenharmony_ci JSHandle<JSGeneratorObject> genObjHandleVal = factory->NewJSGeneratorObject(genFunc); 18264514f5e3Sopenharmony_ci 18274514f5e3Sopenharmony_ci JSHandle<JSHClass> hclass = JSHandle<JSHClass>::Cast(env->GetGeneratorFunctionClass()); 18284514f5e3Sopenharmony_ci JSHandle<JSFunction> generatorFunc = JSHandle<JSFunction>::Cast(factory->NewJSObject(hclass)); 18294514f5e3Sopenharmony_ci JSFunction::InitializeJSFunction(thread_, generatorFunc, FunctionKind::GENERATOR_FUNCTION); 18304514f5e3Sopenharmony_ci 18314514f5e3Sopenharmony_ci JSHandle<GeneratorContext> generatorContext = factory->NewGeneratorContext(); 18324514f5e3Sopenharmony_ci generatorContext->SetMethod(thread_, generatorFunc.GetTaggedValue()); 18334514f5e3Sopenharmony_ci 18344514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> generatorContextVal = JSHandle<JSTaggedValue>::Cast(generatorContext); 18354514f5e3Sopenharmony_ci genObjHandleVal->SetGeneratorContext(thread_, generatorContextVal.GetTaggedValue()); 18364514f5e3Sopenharmony_ci 18374514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> genObjTagHandleVal = JSHandle<JSTaggedValue>::Cast(genObjHandleVal); 18384514f5e3Sopenharmony_ci Local<GeneratorObjectRef> genObjectRef = JSNApiHelper::ToLocal<GeneratorObjectRef>(genObjTagHandleVal); 18394514f5e3Sopenharmony_ci Local<JSValueRef> res = genObjectRef->GetGeneratorFunction(vm_); 18404514f5e3Sopenharmony_ci ASSERT_TRUE(res->IsGeneratorFunction(vm_)); 18414514f5e3Sopenharmony_ci} 18424514f5e3Sopenharmony_ci 18434514f5e3Sopenharmony_ci/** 18444514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_038 18454514f5e3Sopenharmony_ci * @tc.name: BigIntToInt64 18464514f5e3Sopenharmony_ci * @tc.desc:Is the method of converting BigInt objects to 64 bit signed integers correct, and is it able to 18474514f5e3Sopenharmony_ci * handle lossless conversions correctly. 18484514f5e3Sopenharmony_ci * @tc.type: FUNC 18494514f5e3Sopenharmony_ci * @tc.require: parameter 18504514f5e3Sopenharmony_ci */ 18514514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BigIntToInt64) 18524514f5e3Sopenharmony_ci{ 18534514f5e3Sopenharmony_ci LocalScope scope(vm_); 18544514f5e3Sopenharmony_ci uint64_t maxUint64 = std::numeric_limits<uint64_t>::max(); 18554514f5e3Sopenharmony_ci Local<BigIntRef> maxBigintUint64 = BigIntRef::New(vm_, maxUint64); 18564514f5e3Sopenharmony_ci EXPECT_TRUE(maxBigintUint64->IsBigInt(vm_)); 18574514f5e3Sopenharmony_ci int64_t num = -11; 18584514f5e3Sopenharmony_ci int64_t num1 = num; 18594514f5e3Sopenharmony_ci bool lossless = true; 18604514f5e3Sopenharmony_ci maxBigintUint64->BigIntToInt64(vm_, &num, &lossless); 18614514f5e3Sopenharmony_ci EXPECT_TRUE(num != num1); 18624514f5e3Sopenharmony_ci} 18634514f5e3Sopenharmony_ci 18644514f5e3Sopenharmony_ci/** 18654514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_039 18664514f5e3Sopenharmony_ci * @tc.name: BigIntToUint64 18674514f5e3Sopenharmony_ci * @tc.desc:Is the method for converting BigInt objects to 64 bit unsigned integers correct and can lossless 18684514f5e3Sopenharmony_ci * conversions be handled correctly. 18694514f5e3Sopenharmony_ci * @tc.type: FUNC 18704514f5e3Sopenharmony_ci * @tc.require: parameter 18714514f5e3Sopenharmony_ci */ 18724514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BigIntToUint64) 18734514f5e3Sopenharmony_ci{ 18744514f5e3Sopenharmony_ci LocalScope scope(vm_); 18754514f5e3Sopenharmony_ci uint64_t maxUint64 = std::numeric_limits<uint64_t>::max(); 18764514f5e3Sopenharmony_ci Local<BigIntRef> maxBigintUint64 = BigIntRef::New(vm_, maxUint64); 18774514f5e3Sopenharmony_ci EXPECT_TRUE(maxBigintUint64->IsBigInt(vm_)); 18784514f5e3Sopenharmony_ci uint64_t num = -11; 18794514f5e3Sopenharmony_ci uint64_t num1 = num; 18804514f5e3Sopenharmony_ci bool lossless = true; 18814514f5e3Sopenharmony_ci maxBigintUint64->BigIntToUint64(vm_, &num, &lossless); 18824514f5e3Sopenharmony_ci EXPECT_TRUE(num != num1); 18834514f5e3Sopenharmony_ci} 18844514f5e3Sopenharmony_ci 18854514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, BooleanRef_New) 18864514f5e3Sopenharmony_ci{ 18874514f5e3Sopenharmony_ci LocalScope scope(vm_); 18884514f5e3Sopenharmony_ci bool input = true; 18894514f5e3Sopenharmony_ci Local<BooleanRef> res = BooleanRef::New(vm_, input); 18904514f5e3Sopenharmony_ci EXPECT_TRUE(res->IsBoolean()); 18914514f5e3Sopenharmony_ci EXPECT_TRUE(res->BooleaValue(vm_)); 18924514f5e3Sopenharmony_ci} 18934514f5e3Sopenharmony_ci 18944514f5e3Sopenharmony_ci/** 18954514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_040 18964514f5e3Sopenharmony_ci * @tc.name: NewFromUnsigned 18974514f5e3Sopenharmony_ci * @tc.desc:Verify that the NewFromUnsigned method of IntegerRef can correctly create an IntegerRef object 18984514f5e3Sopenharmony_ci * representing unsigned integers, and that the value of the object is correct. 18994514f5e3Sopenharmony_ci * Value () method to obtain the value of this object, and then assert that this value is equal to 19004514f5e3Sopenharmony_ci * the input unsigned integer 1. 19014514f5e3Sopenharmony_ci * @tc.type: FUNC 19024514f5e3Sopenharmony_ci * @tc.require: parameter 19034514f5e3Sopenharmony_ci */ 19044514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewFromUnsigned) 19054514f5e3Sopenharmony_ci{ 19064514f5e3Sopenharmony_ci LocalScope scope(vm_); 19074514f5e3Sopenharmony_ci unsigned int input = 1; 19084514f5e3Sopenharmony_ci [[maybe_unused]] Local<IntegerRef> res = IntegerRef::NewFromUnsigned(vm_, input); 19094514f5e3Sopenharmony_ci EXPECT_TRUE(res->IntegerValue(vm_) == 1); 19104514f5e3Sopenharmony_ci EXPECT_TRUE(res->Value() == 1); 19114514f5e3Sopenharmony_ci} 19124514f5e3Sopenharmony_ci 19134514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetBundleName_GetBundleName) 19144514f5e3Sopenharmony_ci{ 19154514f5e3Sopenharmony_ci LocalScope scope(vm_); 19164514f5e3Sopenharmony_ci std::string str = "11"; 19174514f5e3Sopenharmony_ci JSNApi::SetBundleName(vm_, str); 19184514f5e3Sopenharmony_ci std::string res = JSNApi::GetBundleName(vm_); 19194514f5e3Sopenharmony_ci ASSERT_EQ(str, res); 19204514f5e3Sopenharmony_ci} 19214514f5e3Sopenharmony_ci 19224514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SetModuleName_GetModuleName) 19234514f5e3Sopenharmony_ci{ 19244514f5e3Sopenharmony_ci LocalScope scope(vm_); 19254514f5e3Sopenharmony_ci std::string str = "11"; 19264514f5e3Sopenharmony_ci JSNApi::SetModuleName(vm_, str); 19274514f5e3Sopenharmony_ci std::string res = JSNApi::GetModuleName(vm_); 19284514f5e3Sopenharmony_ci ASSERT_EQ(str, res); 19294514f5e3Sopenharmony_ci} 19304514f5e3Sopenharmony_ci 19314514f5e3Sopenharmony_ci/** 19324514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_041 19334514f5e3Sopenharmony_ci * @tc.name: IsBundle 19344514f5e3Sopenharmony_ci * @tc.desc: Determine if it is a type of Bundle 19354514f5e3Sopenharmony_ci * @tc.type: FUNC 19364514f5e3Sopenharmony_ci * @tc.require: parameter 19374514f5e3Sopenharmony_ci */ 19384514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsBundle) 19394514f5e3Sopenharmony_ci{ 19404514f5e3Sopenharmony_ci LocalScope scope(vm_); 19414514f5e3Sopenharmony_ci bool res = JSNApi::IsBundle(vm_); 19424514f5e3Sopenharmony_ci ASSERT_EQ(res, true); 19434514f5e3Sopenharmony_ci} 19444514f5e3Sopenharmony_ci 19454514f5e3Sopenharmony_ci/** 19464514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_042 19474514f5e3Sopenharmony_ci * @tc.name: ObjectRef_Delete 19484514f5e3Sopenharmony_ci * @tc.desc:MapRef_GetSize_GetTotalElements_Get_GetKey_GetValue_New_Set 19494514f5e3Sopenharmony_ci * @tc.type: FUNC 19504514f5e3Sopenharmony_ci * @tc.require: parameter 19514514f5e3Sopenharmony_ci */ 19524514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, MapRef_GetSize_GetTotalElements_Get_GetKey_GetValue_New_Set) 19534514f5e3Sopenharmony_ci{ 19544514f5e3Sopenharmony_ci LocalScope scope(vm_); 19554514f5e3Sopenharmony_ci Local<MapRef> map = MapRef::New(vm_); 19564514f5e3Sopenharmony_ci Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey"); 19574514f5e3Sopenharmony_ci Local<JSValueRef> value = StringRef::NewFromUtf8(vm_, "TestValue"); 19584514f5e3Sopenharmony_ci map->Set(vm_, key, value); 19594514f5e3Sopenharmony_ci Local<JSValueRef> res = map->Get(vm_, key); 19604514f5e3Sopenharmony_ci ASSERT_EQ(res->ToString(vm_)->ToString(vm_), value->ToString(vm_)->ToString(vm_)); 19614514f5e3Sopenharmony_ci int32_t num = map->GetSize(vm_); 19624514f5e3Sopenharmony_ci int32_t num1 = map->GetTotalElements(vm_); 19634514f5e3Sopenharmony_ci ASSERT_EQ(num, 1); 19644514f5e3Sopenharmony_ci ASSERT_EQ(num1, 1); 19654514f5e3Sopenharmony_ci Local<JSValueRef> res1 = map->GetKey(vm_, 0); 19664514f5e3Sopenharmony_ci ASSERT_EQ(res1->ToString(vm_)->ToString(vm_), key->ToString(vm_)->ToString(vm_)); 19674514f5e3Sopenharmony_ci Local<JSValueRef> res2 = map->GetValue(vm_, 0); 19684514f5e3Sopenharmony_ci ASSERT_EQ(res2->ToString(vm_)->ToString(vm_), value->ToString(vm_)->ToString(vm_)); 19694514f5e3Sopenharmony_ci} 19704514f5e3Sopenharmony_ci 19714514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetSourceCode) 19724514f5e3Sopenharmony_ci{ 19734514f5e3Sopenharmony_ci LocalScope scope(vm_); 19744514f5e3Sopenharmony_ci Local<FunctionRef> callback = FunctionRef::New(vm_, FunctionCallback); 19754514f5e3Sopenharmony_ci bool res = callback->IsNative(vm_); 19764514f5e3Sopenharmony_ci EXPECT_TRUE(res); 19774514f5e3Sopenharmony_ci} 19784514f5e3Sopenharmony_ci 19794514f5e3Sopenharmony_ci/** 19804514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_043 19814514f5e3Sopenharmony_ci * @tc.name: ObjectRef_Delete_GetSourceCode 19824514f5e3Sopenharmony_ci * @tc.desc:Verify that the Delete method of the Object Ref object correctly deletes a property and that 19834514f5e3Sopenharmony_ci * the object no longer contains the property. 19844514f5e3Sopenharmony_ci * Using the functions of getsourcecode and verifying if its attribute values are correct. 19854514f5e3Sopenharmony_ci * @tc.type: FUNC 19864514f5e3Sopenharmony_ci * @tc.require: parameter 19874514f5e3Sopenharmony_ci */ 19884514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ObjectRef_Delete) 19894514f5e3Sopenharmony_ci{ 19904514f5e3Sopenharmony_ci LocalScope scope(vm_); 19914514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 19924514f5e3Sopenharmony_ci Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey"); 19934514f5e3Sopenharmony_ci Local<JSValueRef> value = ObjectRef::New(vm_); 19944514f5e3Sopenharmony_ci PropertyAttribute attribute(value, true, true, true); 19954514f5e3Sopenharmony_ci ASSERT_TRUE(object->DefineProperty(vm_, key, attribute)); 19964514f5e3Sopenharmony_ci ASSERT_TRUE(object->Delete(vm_, key)); 19974514f5e3Sopenharmony_ci ASSERT_FALSE(object->Has(vm_, key)); 19984514f5e3Sopenharmony_ci} 19994514f5e3Sopenharmony_ci 20004514f5e3Sopenharmony_ci 20014514f5e3Sopenharmony_ci/** 20024514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_044 20034514f5e3Sopenharmony_ci * @tc.name: Has 20044514f5e3Sopenharmony_ci * @tc.desc: Used to verify whether a given check object has the specified properties. 20054514f5e3Sopenharmony_ci * @tc.type: FUNC 20064514f5e3Sopenharmony_ci * @tc.require: parameter 20074514f5e3Sopenharmony_ci */ 20084514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ObjectRef_Set1) 20094514f5e3Sopenharmony_ci{ 20104514f5e3Sopenharmony_ci LocalScope scope(vm_); 20114514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 20124514f5e3Sopenharmony_ci Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-123.3"); 20134514f5e3Sopenharmony_ci Local<JSValueRef> toValue(toString); 20144514f5e3Sopenharmony_ci bool res = object->Set(vm_, 12, toValue); 20154514f5e3Sopenharmony_ci ASSERT_TRUE(res); 20164514f5e3Sopenharmony_ci Local<JSValueRef> res1 = object->Get(vm_, 12); 20174514f5e3Sopenharmony_ci ASSERT_EQ(res1->ToString(vm_)->ToString(vm_), toValue->ToString(vm_)->ToString(vm_)); 20184514f5e3Sopenharmony_ci} 20194514f5e3Sopenharmony_ci 20204514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NativePointerRef_New) 20214514f5e3Sopenharmony_ci{ 20224514f5e3Sopenharmony_ci LocalScope scope(vm_); 20234514f5e3Sopenharmony_ci NativePointerCallback callBack = nullptr; 20244514f5e3Sopenharmony_ci void *vp1 = static_cast<void *>(new std::string("test")); 20254514f5e3Sopenharmony_ci void *vp2 = static_cast<void *>(new std::string("test")); 20264514f5e3Sopenharmony_ci Local<NativePointerRef> res = NativePointerRef::New(vm_, vp1, callBack, vp2, 0); 20274514f5e3Sopenharmony_ci ASSERT_EQ(res->Value(), vp1); 20284514f5e3Sopenharmony_ci} 20294514f5e3Sopenharmony_ci 20304514f5e3Sopenharmony_ci 20314514f5e3Sopenharmony_ci/** 20324514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_045 20334514f5e3Sopenharmony_ci * @tc.name: PromiseRejectInfo_GetData 20344514f5e3Sopenharmony_ci * @tc.desc:Construct a BufferRef function to determine whether it is a ObjectRef_Has_Delete 20354514f5e3Sopenharmony_ci * @tc.type: FUNC 20364514f5e3Sopenharmony_ci * @tc.require: parameter 20374514f5e3Sopenharmony_ci */ 20384514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ObjectRef_Has_Delete) 20394514f5e3Sopenharmony_ci{ 20404514f5e3Sopenharmony_ci LocalScope scope(vm_); 20414514f5e3Sopenharmony_ci Local<ObjectRef> object = ObjectRef::New(vm_); 20424514f5e3Sopenharmony_ci uint32_t num = 10; 20434514f5e3Sopenharmony_ci Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-123.3"); 20444514f5e3Sopenharmony_ci Local<JSValueRef> toValue(toString); 20454514f5e3Sopenharmony_ci bool res = object->Set(vm_, num, toValue); 20464514f5e3Sopenharmony_ci ASSERT_TRUE(res); 20474514f5e3Sopenharmony_ci bool res1 = object->Has(vm_, num); 20484514f5e3Sopenharmony_ci ASSERT_TRUE(res1); 20494514f5e3Sopenharmony_ci bool res2 = object->Delete(vm_, num); 20504514f5e3Sopenharmony_ci ASSERT_TRUE(res2); 20514514f5e3Sopenharmony_ci bool res3 = object->Has(vm_, num); 20524514f5e3Sopenharmony_ci ASSERT_FALSE(res3); 20534514f5e3Sopenharmony_ci} 20544514f5e3Sopenharmony_ci 20554514f5e3Sopenharmony_ci/** 20564514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_046 20574514f5e3Sopenharmony_ci * @tc.name: PromiseRejectInfo_GetData 20584514f5e3Sopenharmony_ci * @tc.desc:Mainly tested whether the GetData method of the PromiseRejectInfo object can correctly return 20594514f5e3Sopenharmony_ci * the incoming data, and whether the GetPromise and GetReason methods can correctly return Promise and the 20604514f5e3Sopenharmony_ci * reason for rejection. 20614514f5e3Sopenharmony_ci * @tc.type: FUNC 20624514f5e3Sopenharmony_ci * @tc.require: parameter 20634514f5e3Sopenharmony_ci */ 20644514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PromiseRejectInfo_GetData) 20654514f5e3Sopenharmony_ci{ 20664514f5e3Sopenharmony_ci LocalScope scope(vm_); 20674514f5e3Sopenharmony_ci Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-123.3"); 20684514f5e3Sopenharmony_ci Local<JSValueRef> promise(toString); 20694514f5e3Sopenharmony_ci Local<StringRef> toString1 = StringRef::NewFromUtf8(vm_, "123.3"); 20704514f5e3Sopenharmony_ci Local<JSValueRef> reason(toString1); 20714514f5e3Sopenharmony_ci void *data = static_cast<void *>(new std::string("test")); 20724514f5e3Sopenharmony_ci // 创建一个PromiseRejectInfo对象,并传入被拒绝的Promise,拒绝的原因,拒绝事件类型以及自定义数据 20734514f5e3Sopenharmony_ci PromiseRejectInfo promisereject(promise, reason, PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, data); 20744514f5e3Sopenharmony_ci // 从上一步创建的PromiseRejectInfo对象中获取被拒绝的Promise,并在下面断言被拒绝的Promise与原始Promise相同 20754514f5e3Sopenharmony_ci Local<JSValueRef> promise_res = promisereject.GetPromise(); 20764514f5e3Sopenharmony_ci // 获取拒绝的原因,并在下面断言拒绝原因与原始拒绝原因相同 20774514f5e3Sopenharmony_ci Local<JSValueRef> reason_res = promisereject.GetReason(); 20784514f5e3Sopenharmony_ci ASSERT_EQ(promise_res->ToString(vm_)->ToString(vm_), promise->ToString(vm_)->ToString(vm_)); 20794514f5e3Sopenharmony_ci ASSERT_EQ(reason_res->ToString(vm_)->ToString(vm_), reason->ToString(vm_)->ToString(vm_)); 20804514f5e3Sopenharmony_ci // 获取自定义数据,并在下面断言自定义数据与传入的数据相同 20814514f5e3Sopenharmony_ci void *dataRes = promisereject.GetData(); 20824514f5e3Sopenharmony_ci ASSERT_EQ(dataRes, data); 20834514f5e3Sopenharmony_ci} 20844514f5e3Sopenharmony_ci 20854514f5e3Sopenharmony_ci/** 20864514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_047 20874514f5e3Sopenharmony_ci * @tc.name: FunctionCallScope 20884514f5e3Sopenharmony_ci * @tc.desc:Create and use the function call scope function, and verify whether the depth of function calls is 20894514f5e3Sopenharmony_ci * correct when entering and exiting the scope. 20904514f5e3Sopenharmony_ci * @tc.type: FUNC 20914514f5e3Sopenharmony_ci * @tc.require: parameter 20924514f5e3Sopenharmony_ci */ 20934514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, FunctionCallScope) 20944514f5e3Sopenharmony_ci{ 20954514f5e3Sopenharmony_ci { 20964514f5e3Sopenharmony_ci FunctionCallScope callScope(vm_); 20974514f5e3Sopenharmony_ci ASSERT_FALSE(vm_->IsTopLevelCallDepth()); 20984514f5e3Sopenharmony_ci } 20994514f5e3Sopenharmony_ci ASSERT_TRUE(vm_->IsTopLevelCallDepth()); 21004514f5e3Sopenharmony_ci} 21014514f5e3Sopenharmony_ci 21024514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, AotTrigger) 21034514f5e3Sopenharmony_ci{ 21044514f5e3Sopenharmony_ci std::string bundle; 21054514f5e3Sopenharmony_ci std::string module; 21064514f5e3Sopenharmony_ci int32_t trigger = -1; 21074514f5e3Sopenharmony_ci JSNApi::SetRequestAotCallback(vm_, 21084514f5e3Sopenharmony_ci [&](const std::string &bundleName, const std::string &moduleName, int32_t triggerMode) -> bool { 21094514f5e3Sopenharmony_ci bundle = bundleName; 21104514f5e3Sopenharmony_ci module = moduleName; 21114514f5e3Sopenharmony_ci trigger = triggerMode; 21124514f5e3Sopenharmony_ci return 100; 21134514f5e3Sopenharmony_ci }); 21144514f5e3Sopenharmony_ci ASSERT_FALSE(ecmascript::pgo::PGOProfilerManager::GetInstance()->RequestAot("com.test.test", "requestAot", 21154514f5e3Sopenharmony_ci RequestAotMode::RE_COMPILE_ON_IDLE)); 21164514f5e3Sopenharmony_ci ASSERT_EQ(bundle, "com.test.test"); 21174514f5e3Sopenharmony_ci ASSERT_EQ(module, "requestAot"); 21184514f5e3Sopenharmony_ci ASSERT_EQ(trigger, 0); 21194514f5e3Sopenharmony_ci} 21204514f5e3Sopenharmony_ci 21214514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApiInternalsTest) 21224514f5e3Sopenharmony_ci{ 21234514f5e3Sopenharmony_ci#define CHECK_VALUE(VAL) ASSERT_EQ(JSValueRefInternals::VAL, JSTaggedValue::VAL) 21244514f5e3Sopenharmony_ci CHECK_VALUE(BIT_PER_BYTE); 21254514f5e3Sopenharmony_ci CHECK_VALUE(TAG_BITS_SIZE); 21264514f5e3Sopenharmony_ci CHECK_VALUE(TAG_BITS_SHIFT); 21274514f5e3Sopenharmony_ci CHECK_VALUE(TAG_MARK); 21284514f5e3Sopenharmony_ci CHECK_VALUE(TAG_INT); 21294514f5e3Sopenharmony_ci CHECK_VALUE(TAG_INT32_INC_MAX); 21304514f5e3Sopenharmony_ci CHECK_VALUE(TAG_INT32_DEC_MIN); 21314514f5e3Sopenharmony_ci CHECK_VALUE(TAG_OBJECT); 21324514f5e3Sopenharmony_ci CHECK_VALUE(TAG_WEAK); 21334514f5e3Sopenharmony_ci CHECK_VALUE(TAG_NULL); 21344514f5e3Sopenharmony_ci CHECK_VALUE(TAG_SPECIAL); 21354514f5e3Sopenharmony_ci CHECK_VALUE(TAG_BOOLEAN); 21364514f5e3Sopenharmony_ci CHECK_VALUE(TAG_EXCEPTION); 21374514f5e3Sopenharmony_ci CHECK_VALUE(TAG_OPTIMIZED_OUT); 21384514f5e3Sopenharmony_ci CHECK_VALUE(TAG_SPECIAL_MASK); 21394514f5e3Sopenharmony_ci CHECK_VALUE(TAG_BOOLEAN_MASK); 21404514f5e3Sopenharmony_ci CHECK_VALUE(TAG_HEAPOBJECT_MASK); 21414514f5e3Sopenharmony_ci CHECK_VALUE(TAG_WEAK_MASK); 21424514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_HOLE); 21434514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_NULL); 21444514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_FALSE); 21454514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_TRUE); 21464514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_UNDEFINED); 21474514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_EXCEPTION); 21484514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_ZERO); 21494514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_OPTIMIZED_OUT); 21504514f5e3Sopenharmony_ci CHECK_VALUE(INT_SIGN_BIT_OFFSET); 21514514f5e3Sopenharmony_ci CHECK_VALUE(DOUBLE_ENCODE_OFFSET_BIT); 21524514f5e3Sopenharmony_ci CHECK_VALUE(DOUBLE_ENCODE_OFFSET); 21534514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_POSITIVE_ZERO); 21544514f5e3Sopenharmony_ci CHECK_VALUE(VALUE_NEGATIVE_ZERO); 21554514f5e3Sopenharmony_ci#undef CHECK_VALUE 21564514f5e3Sopenharmony_ci} 21574514f5e3Sopenharmony_ci 21584514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApiInternalsTestNumberRef) 21594514f5e3Sopenharmony_ci{ 21604514f5e3Sopenharmony_ci // double 21614514f5e3Sopenharmony_ci TestNumberRef(0., JSTaggedValue::DOUBLE_ENCODE_OFFSET); 21624514f5e3Sopenharmony_ci TestNumberRef(NAN, base::bit_cast<TaggedType>(ecmascript::base::NAN_VALUE) + JSTaggedValue::DOUBLE_ENCODE_OFFSET); 21634514f5e3Sopenharmony_ci 21644514f5e3Sopenharmony_ci // int32_t 21654514f5e3Sopenharmony_ci TestNumberRef(static_cast<int32_t>(0), JSTaggedValue::TAG_INT); 21664514f5e3Sopenharmony_ci TestNumberRef(INT32_MIN, static_cast<JSTaggedType>(INT32_MIN) | JSTaggedValue::TAG_INT); 21674514f5e3Sopenharmony_ci TestNumberRef(INT32_MAX, static_cast<JSTaggedType>(INT32_MAX) | JSTaggedValue::TAG_INT); 21684514f5e3Sopenharmony_ci 21694514f5e3Sopenharmony_ci // uint32_t 21704514f5e3Sopenharmony_ci TestNumberRef(static_cast<uint32_t>(0), JSTaggedValue::TAG_INT); 21714514f5e3Sopenharmony_ci TestNumberRef(static_cast<uint32_t>(INT32_MAX), static_cast<uint32_t>(INT32_MAX) | JSTaggedValue::TAG_INT); 21724514f5e3Sopenharmony_ci auto val = static_cast<uint32_t>(INT32_MAX + 1UL); 21734514f5e3Sopenharmony_ci TestNumberRef(val, ConvertDouble(static_cast<double>(val))); 21744514f5e3Sopenharmony_ci TestNumberRef(UINT32_MAX, ConvertDouble(static_cast<double>(UINT32_MAX))); 21754514f5e3Sopenharmony_ci 21764514f5e3Sopenharmony_ci // int64_t 21774514f5e3Sopenharmony_ci TestNumberRef(static_cast<int64_t>(INT32_MIN), static_cast<JSTaggedType>(INT32_MIN) | JSTaggedValue::TAG_INT); 21784514f5e3Sopenharmony_ci TestNumberRef(static_cast<int64_t>(INT32_MAX), static_cast<JSTaggedType>(INT32_MAX) | JSTaggedValue::TAG_INT); 21794514f5e3Sopenharmony_ci TestNumberRef(INT64_MIN, ConvertDouble(static_cast<double>(INT64_MIN))); 21804514f5e3Sopenharmony_ci TestNumberRef(INT64_MAX, ConvertDouble(static_cast<double>(INT64_MAX))); 21814514f5e3Sopenharmony_ci} 21824514f5e3Sopenharmony_ci 21834514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApiInternalsTestBooleanRef) 21844514f5e3Sopenharmony_ci{ 21854514f5e3Sopenharmony_ci LocalScope scope(vm_); 21864514f5e3Sopenharmony_ci bool input = true; 21874514f5e3Sopenharmony_ci Local<BooleanRef> res = BooleanRef::New(vm_, input); 21884514f5e3Sopenharmony_ci EXPECT_TRUE(res->IsBoolean()); 21894514f5e3Sopenharmony_ci EXPECT_TRUE(res->BooleaValue(vm_)); 21904514f5e3Sopenharmony_ci ASSERT_EQ(JSNApiHelper::ToJSTaggedValue(*res).GetRawData(), JSTaggedValue::VALUE_TRUE); 21914514f5e3Sopenharmony_ci 21924514f5e3Sopenharmony_ci input = false; 21934514f5e3Sopenharmony_ci res = BooleanRef::New(vm_, input); 21944514f5e3Sopenharmony_ci EXPECT_TRUE(res->IsBoolean()); 21954514f5e3Sopenharmony_ci EXPECT_FALSE(res->BooleaValue(vm_)); 21964514f5e3Sopenharmony_ci ASSERT_EQ(JSNApiHelper::ToJSTaggedValue(*res).GetRawData(), JSTaggedValue::VALUE_FALSE); 21974514f5e3Sopenharmony_ci} 21984514f5e3Sopenharmony_ci 21994514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, JSNApiInternalsTestNullUndefined) 22004514f5e3Sopenharmony_ci{ 22014514f5e3Sopenharmony_ci LocalScope scope(vm_); 22024514f5e3Sopenharmony_ci Local<JSValueRef> null = JSValueRef::Null(vm_); 22034514f5e3Sopenharmony_ci ASSERT_TRUE(null->IsNull()); 22044514f5e3Sopenharmony_ci ASSERT_EQ(JSNApiHelper::ToJSTaggedValue(*null).GetRawData(), JSTaggedValue::VALUE_NULL); 22054514f5e3Sopenharmony_ci 22064514f5e3Sopenharmony_ci Local<JSValueRef> undefined = JSValueRef::Undefined(vm_); 22074514f5e3Sopenharmony_ci ASSERT_TRUE(undefined->IsUndefined()); 22084514f5e3Sopenharmony_ci ASSERT_EQ(JSNApiHelper::ToJSTaggedValue(*undefined).GetRawData(), JSTaggedValue::VALUE_UNDEFINED); 22094514f5e3Sopenharmony_ci} 22104514f5e3Sopenharmony_ci 22114514f5e3Sopenharmony_ci/** 22124514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_048 22134514f5e3Sopenharmony_ci * @tc.name: FunctionRef_New_GetFunctionPrototype 22144514f5e3Sopenharmony_ci * @tc.desc:The Inheritance Characteristics of Function References and the Function of Obtaining Function Headers 22154514f5e3Sopenharmony_ci * @tc.type: FUNC 22164514f5e3Sopenharmony_ci * @tc.require: parameter 22174514f5e3Sopenharmony_ci */ 22184514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, FunctionRef_New_GetFunctionPrototype) 22194514f5e3Sopenharmony_ci{ 22204514f5e3Sopenharmony_ci LocalScope scope(vm_); 22214514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = vm_->GetGlobalEnv(); 22224514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> set = env->GetBuiltinsSetFunction(); 22234514f5e3Sopenharmony_ci Local<FunctionRef> setLocal = JSNApiHelper::ToLocal<FunctionRef>(set); 22244514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> map = env->GetBuiltinsMapFunction(); 22254514f5e3Sopenharmony_ci Local<FunctionRef> mapLocal = JSNApiHelper::ToLocal<FunctionRef>(map); 22264514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> setPrototype(thread_, JSHandle<JSFunction>::Cast(set)->GetFunctionPrototype()); 22274514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> mapPrototype(thread_, JSHandle<JSFunction>::Cast(map)->GetFunctionPrototype()); 22284514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> mapPrototypeProto(thread_, JSTaggedValue::GetPrototype(thread_, mapPrototype)); 22294514f5e3Sopenharmony_ci bool same = JSTaggedValue::SameValue(setPrototype, mapPrototypeProto); 22304514f5e3Sopenharmony_ci ASSERT_FALSE(same); 22314514f5e3Sopenharmony_ci mapLocal->Inherit(vm_, setLocal); 22324514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonHandle = JSNApiHelper::ToJSHandle(mapLocal); 22334514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonPrototype(thread_, JSHandle<JSFunction>::Cast(sonHandle)->GetFunctionPrototype()); 22344514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> sonPrototypeProto(thread_, JSTaggedValue::GetPrototype(thread_, sonPrototype)); 22354514f5e3Sopenharmony_ci bool same2 = JSTaggedValue::SameValue(setPrototype, sonPrototypeProto); 22364514f5e3Sopenharmony_ci ASSERT_TRUE(same2); 22374514f5e3Sopenharmony_ci Local<FunctionRef> son1 = FunctionRef::New(vm_, FunctionCallback, nullptr); 22384514f5e3Sopenharmony_ci son1->Inherit(vm_, mapLocal); 22394514f5e3Sopenharmony_ci JSHandle<JSFunction> son1Handle = JSHandle<JSFunction>::Cast(JSNApiHelper::ToJSHandle(son1)); 22404514f5e3Sopenharmony_ci ASSERT_TRUE(son1Handle->HasFunctionPrototype()); 22414514f5e3Sopenharmony_ci} 22424514f5e3Sopenharmony_ci 22434514f5e3Sopenharmony_ci/* 22444514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_049 22454514f5e3Sopenharmony_ci * @tc.name: PrintExceptionInfo 22464514f5e3Sopenharmony_ci * @tc.desc: Obtain and print abnormal information correctly. 22474514f5e3Sopenharmony_ci * @tc.type: FUNC 22484514f5e3Sopenharmony_ci * @tc.require: parameter 22494514f5e3Sopenharmony_ci */ 22504514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, PrintExceptionInfo) 22514514f5e3Sopenharmony_ci{ 22524514f5e3Sopenharmony_ci LocalScope scope(vm_); 22534514f5e3Sopenharmony_ci std::thread t1([&](){ 22544514f5e3Sopenharmony_ci RuntimeOption option; 22554514f5e3Sopenharmony_ci option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR); 22564514f5e3Sopenharmony_ci auto *vm = JSNApi::CreateJSVM(option); 22574514f5e3Sopenharmony_ci ASSERT_TRUE(vm != nullptr) << "Cannot create Runtime"; 22584514f5e3Sopenharmony_ci JSNApi::PrintExceptionInfo(vm); 22594514f5e3Sopenharmony_ci JSNApi::DestroyJSVM(vm); 22604514f5e3Sopenharmony_ci }); 22614514f5e3Sopenharmony_ci { 22624514f5e3Sopenharmony_ci ThreadSuspensionScope suspensionScope(thread_); 22634514f5e3Sopenharmony_ci t1.join(); 22644514f5e3Sopenharmony_ci } 22654514f5e3Sopenharmony_ci} 22664514f5e3Sopenharmony_ci 22674514f5e3Sopenharmony_ci/* 22684514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_050 22694514f5e3Sopenharmony_ci * @tc.name: IsNull 22704514f5e3Sopenharmony_ci * @tc.desc: Verify that localnull correctly represents a null value, ensuring that the JavaScript virtual machine 22714514f5e3Sopenharmony_ci * can handle null values correctly. 22724514f5e3Sopenharmony_ci * @tc.type: FUNC 22734514f5e3Sopenharmony_ci * @tc.require: parameter 22744514f5e3Sopenharmony_ci */ 22754514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsNull) 22764514f5e3Sopenharmony_ci{ 22774514f5e3Sopenharmony_ci LocalScope scope(vm_); 22784514f5e3Sopenharmony_ci Local<JSValueRef> localNull = JSValueRef::Null(vm_); 22794514f5e3Sopenharmony_ci ASSERT_TRUE(localNull->IsNull()); 22804514f5e3Sopenharmony_ci} 22814514f5e3Sopenharmony_ci 22824514f5e3Sopenharmony_ci/* 22834514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_051 22844514f5e3Sopenharmony_ci * @tc.name: IsNativePointer 22854514f5e3Sopenharmony_ci * @tc.desc: Verify that a NativePointerRef object created with a local pointer is correctly 22864514f5e3Sopenharmony_ci * recognized as a local pointer. 22874514f5e3Sopenharmony_ci * @tc.type: FUNC 22884514f5e3Sopenharmony_ci * @tc.require: parameter 22894514f5e3Sopenharmony_ci */ 22904514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsNativePointer) 22914514f5e3Sopenharmony_ci{ 22924514f5e3Sopenharmony_ci LocalScope scope(vm_); 22934514f5e3Sopenharmony_ci NativePointerCallback callBack = nullptr; 22944514f5e3Sopenharmony_ci void *vp1 = static_cast<void *>(new std::string("test")); 22954514f5e3Sopenharmony_ci void *vp2 = static_cast<void *>(new std::string("test")); 22964514f5e3Sopenharmony_ci Local<NativePointerRef> res = NativePointerRef::New(vm_, vp1, callBack, vp2, 0); 22974514f5e3Sopenharmony_ci ASSERT_TRUE(res->IsNativePointer(vm_)); 22984514f5e3Sopenharmony_ci} 22994514f5e3Sopenharmony_ci 23004514f5e3Sopenharmony_ci/* 23014514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_052 23024514f5e3Sopenharmony_ci * @tc.name: ToType_ToBoolean_ToString_ToObject 23034514f5e3Sopenharmony_ci * @tc.desc: Verify whether the ToType method of the JavaScript virtual machine can correctly convert string types to 23044514f5e3Sopenharmony_ci * the corresponding JavaScript data types. 23054514f5e3Sopenharmony_ci * Among them, there is the result of checking the string "-1.3" when it is converted to a Boolean value. 23064514f5e3Sopenharmony_ci * Check if the string wrapped in JSValueRef yields a result of "-1.3" when converted to a string. 23074514f5e3Sopenharmony_ci * Check if the string wrapped in JSValueRef actually becomes an object when converted to an object. 23084514f5e3Sopenharmony_ci * @tc.type: FUNC 23094514f5e3Sopenharmony_ci * @tc.require: parameter 23104514f5e3Sopenharmony_ci */ 23114514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, ToType_ToBoolean_ToString_ToObject) 23124514f5e3Sopenharmony_ci{ 23134514f5e3Sopenharmony_ci LocalScope scope(vm_); 23144514f5e3Sopenharmony_ci Local<StringRef> toString = StringRef::NewFromUtf8(vm_, "-1.3"); 23154514f5e3Sopenharmony_ci Local<JSValueRef> toValue(toString); 23164514f5e3Sopenharmony_ci 23174514f5e3Sopenharmony_ci ASSERT_EQ(toString->ToNumber(vm_)->Value(), -1.3); 23184514f5e3Sopenharmony_ci ASSERT_EQ(toString->ToBoolean(vm_)->Value(), true); 23194514f5e3Sopenharmony_ci ASSERT_EQ(toValue->ToString(vm_)->ToString(vm_), "-1.3"); 23204514f5e3Sopenharmony_ci ASSERT_TRUE(toValue->ToObject(vm_)->IsObject(vm_)); 23214514f5e3Sopenharmony_ci} 23224514f5e3Sopenharmony_ci 23234514f5e3Sopenharmony_ci/** 23244514f5e3Sopenharmony_ci * @tc.number: ffi_interface_api_053 23254514f5e3Sopenharmony_ci * @tc.name: IsTypedArray 23264514f5e3Sopenharmony_ci * @tc.desc:Verify that the TypedArray method correctly created a Uint32Array containing the specified 23274514f5e3Sopenharmony_ci * offset and length, and verify that its property values match expectations. 23284514f5e3Sopenharmony_ci * @tc.type: FUNC 23294514f5e3Sopenharmony_ci * @tc.require: parameter 23304514f5e3Sopenharmony_ci */ 23314514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, IsTypedArray) 23324514f5e3Sopenharmony_ci{ 23334514f5e3Sopenharmony_ci LocalScope scope(vm_); 23344514f5e3Sopenharmony_ci std::string test = "abc"; 23354514f5e3Sopenharmony_ci char buffer[4]; 23364514f5e3Sopenharmony_ci memset_s(buffer, sizeof(buffer), 0, sizeof(buffer)); 23374514f5e3Sopenharmony_ci Local<StringRef> testString = StringRef::NewFromUtf8(vm_, test.c_str()); 23384514f5e3Sopenharmony_ci EXPECT_EQ(testString->WriteUtf8(vm_, buffer, 4), 4); 23394514f5e3Sopenharmony_ci // testString 是一个字符串,而不是类型化数组 23404514f5e3Sopenharmony_ci ASSERT_FALSE(testString->IsTypedArray(vm_)); 23414514f5e3Sopenharmony_ci const int32_t length = 30; 23424514f5e3Sopenharmony_ci Local<ArrayBufferRef> arrayBuffer = ArrayBufferRef::New(vm_, length); 23434514f5e3Sopenharmony_ci ASSERT_TRUE(arrayBuffer->IsArrayBuffer(vm_)); 23444514f5e3Sopenharmony_ci Local<Uint32ArrayRef> typedArray = Uint32ArrayRef::New(vm_, arrayBuffer, 4, 6); 23454514f5e3Sopenharmony_ci // 是否是类型化数组 23464514f5e3Sopenharmony_ci ASSERT_TRUE(typedArray->IsTypedArray(vm_)); 23474514f5e3Sopenharmony_ci ASSERT_FALSE(typedArray->IsUndefined()); 23484514f5e3Sopenharmony_ci ASSERT_EQ(typedArray->GetArrayBuffer(vm_)->GetBuffer(vm_), arrayBuffer->GetBuffer(vm_)); 23494514f5e3Sopenharmony_ci} 23504514f5e3Sopenharmony_ci 23514514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetOriginalSource) 23524514f5e3Sopenharmony_ci{ 23534514f5e3Sopenharmony_ci LocalScope scope(vm_); 23544514f5e3Sopenharmony_ci JSThread *thread = vm_->GetJSThread(); 23554514f5e3Sopenharmony_ci ObjectFactory *factory = vm_->GetFactory(); 23564514f5e3Sopenharmony_ci auto globalEnv = thread->GetEcmaVM()->GetGlobalEnv(); 23574514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> regExpFunc = globalEnv->GetRegExpFunction(); 23584514f5e3Sopenharmony_ci JSHandle<JSRegExp> jSRegExp = 23594514f5e3Sopenharmony_ci JSHandle<JSRegExp>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(regExpFunc), regExpFunc)); 23604514f5e3Sopenharmony_ci jSRegExp->SetOriginalSource(thread, JSTaggedValue::Undefined()); 23614514f5e3Sopenharmony_ci Local<RegExpRef> object = JSNApiHelper::ToLocal<RegExpRef>(JSHandle<JSTaggedValue>::Cast(jSRegExp)); 23624514f5e3Sopenharmony_ci ASSERT_EQ(object->GetOriginalSource(vm_)->ToString(vm_), ""); 23634514f5e3Sopenharmony_ci} 23644514f5e3Sopenharmony_ci 23654514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetOriginalFlags) 23664514f5e3Sopenharmony_ci{ 23674514f5e3Sopenharmony_ci LocalScope scope(vm_); 23684514f5e3Sopenharmony_ci JSThread *thread = vm_->GetJSThread(); 23694514f5e3Sopenharmony_ci ObjectFactory *factory = vm_->GetFactory(); 23704514f5e3Sopenharmony_ci auto globalEnv = thread->GetEcmaVM()->GetGlobalEnv(); 23714514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> regExpFunc = globalEnv->GetRegExpFunction(); 23724514f5e3Sopenharmony_ci JSHandle<JSRegExp> jSRegExp = 23734514f5e3Sopenharmony_ci JSHandle<JSRegExp>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(regExpFunc), regExpFunc)); 23744514f5e3Sopenharmony_ci jSRegExp->SetOriginalFlags(thread, JSTaggedValue(RegExpParser::FLAG_GLOBAL | RegExpParser::FLAG_IGNORECASE | 23754514f5e3Sopenharmony_ci RegExpParser::FLAG_MULTILINE | RegExpParser::FLAG_DOTALL | 23764514f5e3Sopenharmony_ci RegExpParser::FLAG_UTF16 | RegExpParser::FLAG_STICKY)); 23774514f5e3Sopenharmony_ci Local<RegExpRef> object = JSNApiHelper::ToLocal<RegExpRef>(JSHandle<JSTaggedValue>::Cast(jSRegExp)); 23784514f5e3Sopenharmony_ci ASSERT_EQ(object->GetOriginalFlags(vm_), TEST_CHAR_STRING_FLAGS); 23794514f5e3Sopenharmony_ci} 23804514f5e3Sopenharmony_ci 23814514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, GetGeneratorState) 23824514f5e3Sopenharmony_ci{ 23834514f5e3Sopenharmony_ci LocalScope scope(vm_); 23844514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = thread_->GetEcmaVM()->GetGlobalEnv(); 23854514f5e3Sopenharmony_ci ObjectFactory *factory = thread_->GetEcmaVM()->GetFactory(); 23864514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> genFunc = env->GetGeneratorFunctionFunction(); 23874514f5e3Sopenharmony_ci JSHandle<JSGeneratorObject> genObjHandleVal = factory->NewJSGeneratorObject(genFunc); 23884514f5e3Sopenharmony_ci genObjHandleVal->SetGeneratorState(JSGeneratorState::COMPLETED); 23894514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> genObjTagHandleVal = JSHandle<JSTaggedValue>::Cast(genObjHandleVal); 23904514f5e3Sopenharmony_ci Local<GeneratorObjectRef> object = JSNApiHelper::ToLocal<GeneratorObjectRef>(genObjTagHandleVal); 23914514f5e3Sopenharmony_ci 23924514f5e3Sopenharmony_ci ASSERT_EQ(object->GetGeneratorState(vm_)->ToString(vm_)->ToString(vm_), TEST_CHAR_STRING_STATE); 23934514f5e3Sopenharmony_ci} 23944514f5e3Sopenharmony_ci} // namespace panda::test 2395