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