14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 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 "ecmascript/napi/jsnapi_helper.h"
174514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h"
184514f5e3Sopenharmony_ci#include "gtest/gtest.h"
194514f5e3Sopenharmony_ci
204514f5e3Sopenharmony_ciusing namespace panda::ecmascript;
214514f5e3Sopenharmony_ci
224514f5e3Sopenharmony_cinamespace panda::test {
234514f5e3Sopenharmony_ciclass JSNApiTests : public testing::Test {
244514f5e3Sopenharmony_cipublic:
254514f5e3Sopenharmony_ci    static void SetUpTestCase()
264514f5e3Sopenharmony_ci    {
274514f5e3Sopenharmony_ci        GTEST_LOG_(INFO) << "SetUpTestCase";
284514f5e3Sopenharmony_ci    }
294514f5e3Sopenharmony_ci
304514f5e3Sopenharmony_ci    static void TearDownTestCase()
314514f5e3Sopenharmony_ci    {
324514f5e3Sopenharmony_ci        GTEST_LOG_(INFO) << "TearDownCase";
334514f5e3Sopenharmony_ci    }
344514f5e3Sopenharmony_ci
354514f5e3Sopenharmony_ci    void SetUp() override
364514f5e3Sopenharmony_ci    {
374514f5e3Sopenharmony_ci        RuntimeOption option;
384514f5e3Sopenharmony_ci        option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR);
394514f5e3Sopenharmony_ci        vm_ = JSNApi::CreateJSVM(option);
404514f5e3Sopenharmony_ci        ASSERT_TRUE(vm_ != nullptr) << "Cannot create Runtime";
414514f5e3Sopenharmony_ci        thread_ = vm_->GetJSThread();
424514f5e3Sopenharmony_ci        vm_->SetEnableForceGC(true);
434514f5e3Sopenharmony_ci        thread_->ManagedCodeBegin();
444514f5e3Sopenharmony_ci        staticKey = StringRef::NewFromUtf8(vm_, "static");
454514f5e3Sopenharmony_ci        nonStaticKey = StringRef::NewFromUtf8(vm_, "nonStatic");
464514f5e3Sopenharmony_ci        instanceKey = StringRef::NewFromUtf8(vm_, "instance");
474514f5e3Sopenharmony_ci        getterSetterKey = StringRef::NewFromUtf8(vm_, "getterSetter");
484514f5e3Sopenharmony_ci        invalidKey = StringRef::NewFromUtf8(vm_, "invalid");
494514f5e3Sopenharmony_ci    }
504514f5e3Sopenharmony_ci
514514f5e3Sopenharmony_ci    void TearDown() override
524514f5e3Sopenharmony_ci    {
534514f5e3Sopenharmony_ci        thread_->ManagedCodeEnd();
544514f5e3Sopenharmony_ci        vm_->SetEnableForceGC(false);
554514f5e3Sopenharmony_ci        JSNApi::DestroyJSVM(vm_);
564514f5e3Sopenharmony_ci    }
574514f5e3Sopenharmony_ci
584514f5e3Sopenharmony_ci    template <typename T>
594514f5e3Sopenharmony_ci    void TestNumberRef(T val, TaggedType expected)
604514f5e3Sopenharmony_ci    {
614514f5e3Sopenharmony_ci        LocalScope scope(vm_);
624514f5e3Sopenharmony_ci        Local<NumberRef> obj = NumberRef::New(vm_, val);
634514f5e3Sopenharmony_ci        ASSERT_TRUE(obj->IsNumber());
644514f5e3Sopenharmony_ci        JSTaggedType res = JSNApiHelper::ToJSTaggedValue(*obj).GetRawData();
654514f5e3Sopenharmony_ci        ASSERT_EQ(res, expected);
664514f5e3Sopenharmony_ci        if constexpr (std::is_floating_point_v<T>) {
674514f5e3Sopenharmony_ci            if (std::isnan(val)) {
684514f5e3Sopenharmony_ci                ASSERT_TRUE(std::isnan(obj->Value()));
694514f5e3Sopenharmony_ci            } else {
704514f5e3Sopenharmony_ci                ASSERT_EQ(obj->Value(), val);
714514f5e3Sopenharmony_ci            }
724514f5e3Sopenharmony_ci        } else if constexpr (sizeof(T) >= sizeof(int32_t)) {
734514f5e3Sopenharmony_ci            ASSERT_EQ(obj->IntegerValue(vm_), val);
744514f5e3Sopenharmony_ci        } else if constexpr (std::is_signed_v<T>) {
754514f5e3Sopenharmony_ci            ASSERT_EQ(obj->Int32Value(vm_), val);
764514f5e3Sopenharmony_ci        } else {
774514f5e3Sopenharmony_ci            ASSERT_EQ(obj->Uint32Value(vm_), val);
784514f5e3Sopenharmony_ci        }
794514f5e3Sopenharmony_ci    }
804514f5e3Sopenharmony_ci
814514f5e3Sopenharmony_ci    TaggedType ConvertDouble(double val)
824514f5e3Sopenharmony_ci    {
834514f5e3Sopenharmony_ci        return base::bit_cast<JSTaggedType>(val) + JSTaggedValue::DOUBLE_ENCODE_OFFSET;
844514f5e3Sopenharmony_ci    }
854514f5e3Sopenharmony_ci
864514f5e3Sopenharmony_ciprotected:
874514f5e3Sopenharmony_ci    JSThread *thread_ = nullptr;
884514f5e3Sopenharmony_ci    EcmaVM *vm_ = nullptr;
894514f5e3Sopenharmony_ci    Local<StringRef> staticKey;
904514f5e3Sopenharmony_ci    Local<StringRef> nonStaticKey;
914514f5e3Sopenharmony_ci    Local<StringRef> instanceKey;
924514f5e3Sopenharmony_ci    Local<StringRef> getterSetterKey;
934514f5e3Sopenharmony_ci    Local<StringRef> invalidKey;
944514f5e3Sopenharmony_ci};
954514f5e3Sopenharmony_ci
964514f5e3Sopenharmony_cipanda::JSValueRef FunctionCallback(JsiRuntimeCallInfo *info)
974514f5e3Sopenharmony_ci{
984514f5e3Sopenharmony_ci    EcmaVM *vm = info->GetVM();
994514f5e3Sopenharmony_ci    Local<JSValueRef> jsThisRef = info->GetThisRef();
1004514f5e3Sopenharmony_ci    Local<ObjectRef> thisRef = jsThisRef->ToObject(vm);
1014514f5e3Sopenharmony_ci    return **thisRef;
1024514f5e3Sopenharmony_ci}
1034514f5e3Sopenharmony_ci
1044514f5e3Sopenharmony_ciLocal<FunctionRef> GetNewSendableClassFunction(
1054514f5e3Sopenharmony_ci    EcmaVM *vm, Local<FunctionRef> parent, bool isDict = false, bool duplicated = false, bool isParent = false)
1064514f5e3Sopenharmony_ci{
1074514f5e3Sopenharmony_ci    FunctionRef::SendablePropertiesInfos infos;
1084514f5e3Sopenharmony_ci
1094514f5e3Sopenharmony_ci    if (isDict) {
1104514f5e3Sopenharmony_ci        uint32_t maxInline = std::max(JSSharedFunction::MAX_INLINE, JSSharedObject::MAX_INLINE);
1114514f5e3Sopenharmony_ci        for (uint32_t i = 0; i < maxInline; ++i) {
1124514f5e3Sopenharmony_ci            Local<StringRef> tempStr = StringRef::NewFromUtf8(vm, std::to_string(i).c_str());
1134514f5e3Sopenharmony_ci            infos.instancePropertiesInfo.keys.push_back(tempStr);
1144514f5e3Sopenharmony_ci            infos.instancePropertiesInfo.types.push_back(FunctionRef::SendableType::NONE);
1154514f5e3Sopenharmony_ci            infos.instancePropertiesInfo.attributes.push_back(PropertyAttribute(tempStr, true, true, true));
1164514f5e3Sopenharmony_ci            infos.staticPropertiesInfo.keys.push_back(tempStr);
1174514f5e3Sopenharmony_ci            infos.staticPropertiesInfo.types.push_back(FunctionRef::SendableType::NONE);
1184514f5e3Sopenharmony_ci            infos.staticPropertiesInfo.attributes.push_back(PropertyAttribute(tempStr, true, true, true));
1194514f5e3Sopenharmony_ci            infos.nonStaticPropertiesInfo.keys.push_back(tempStr);
1204514f5e3Sopenharmony_ci            infos.nonStaticPropertiesInfo.types.push_back(FunctionRef::SendableType::NONE);
1214514f5e3Sopenharmony_ci            infos.nonStaticPropertiesInfo.attributes.push_back(PropertyAttribute(tempStr, true, true, true));
1224514f5e3Sopenharmony_ci        }
1234514f5e3Sopenharmony_ci    }
1244514f5e3Sopenharmony_ci
1254514f5e3Sopenharmony_ci    std::string instanceKey = "instance";
1264514f5e3Sopenharmony_ci    std::string staticKey = "static";
1274514f5e3Sopenharmony_ci    std::string nonStaticKey = "nonStatic";
1284514f5e3Sopenharmony_ci
1294514f5e3Sopenharmony_ci    if (isParent) {
1304514f5e3Sopenharmony_ci        instanceKey = "parentInstance";
1314514f5e3Sopenharmony_ci        staticKey = "parentStatic";
1324514f5e3Sopenharmony_ci        nonStaticKey = "parentNonStatic";
1334514f5e3Sopenharmony_ci    }
1344514f5e3Sopenharmony_ci
1354514f5e3Sopenharmony_ci    Local<StringRef> instanceStr = StringRef::NewFromUtf8(vm, instanceKey.c_str());
1364514f5e3Sopenharmony_ci    infos.instancePropertiesInfo.keys.push_back(instanceStr);
1374514f5e3Sopenharmony_ci    infos.instancePropertiesInfo.types.push_back(FunctionRef::SendableType::NONE);
1384514f5e3Sopenharmony_ci    infos.instancePropertiesInfo.attributes.push_back(PropertyAttribute(instanceStr, true, true, true));
1394514f5e3Sopenharmony_ci
1404514f5e3Sopenharmony_ci    Local<StringRef> staticStr = StringRef::NewFromUtf8(vm, staticKey.c_str());
1414514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.keys.push_back(staticStr);
1424514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.types.push_back(FunctionRef::SendableType::NONE);
1434514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.attributes.push_back(PropertyAttribute(staticStr, true, true, true));
1444514f5e3Sopenharmony_ci
1454514f5e3Sopenharmony_ci    Local<StringRef> nonStaticStr = StringRef::NewFromUtf8(vm, nonStaticKey.c_str());
1464514f5e3Sopenharmony_ci    infos.nonStaticPropertiesInfo.keys.push_back(nonStaticStr);
1474514f5e3Sopenharmony_ci    infos.nonStaticPropertiesInfo.types.push_back(FunctionRef::SendableType::NONE);
1484514f5e3Sopenharmony_ci    infos.nonStaticPropertiesInfo.attributes.push_back(PropertyAttribute(nonStaticStr, true, true, true));
1494514f5e3Sopenharmony_ci
1504514f5e3Sopenharmony_ci    if (duplicated) {
1514514f5e3Sopenharmony_ci        Local<StringRef> duplicatedKey = StringRef::NewFromUtf8(vm, "parentInstance");
1524514f5e3Sopenharmony_ci        Local<NumberRef> duplicatedValue = NumberRef::New(vm, 0);
1534514f5e3Sopenharmony_ci        infos.instancePropertiesInfo.keys.push_back(duplicatedKey);
1544514f5e3Sopenharmony_ci        infos.instancePropertiesInfo.types.push_back(FunctionRef::SendableType::NONE);
1554514f5e3Sopenharmony_ci        infos.instancePropertiesInfo.attributes.push_back(PropertyAttribute(duplicatedValue, true, true, true));
1564514f5e3Sopenharmony_ci    }
1574514f5e3Sopenharmony_ci
1584514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = FunctionRef::NewSendableClassFunction(
1594514f5e3Sopenharmony_ci        vm, FunctionCallback, nullptr, nullptr, StringRef::NewFromUtf8(vm, "name"), infos, parent);
1604514f5e3Sopenharmony_ci
1614514f5e3Sopenharmony_ci    return constructor;
1624514f5e3Sopenharmony_ci}
1634514f5e3Sopenharmony_ci
1644514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunction)
1654514f5e3Sopenharmony_ci{
1664514f5e3Sopenharmony_ci    LocalScope scope(vm_);
1674514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = GetNewSendableClassFunction(vm_, FunctionRef::Null(vm_));
1684514f5e3Sopenharmony_ci
1694514f5e3Sopenharmony_ci    ASSERT_EQ("name", constructor->GetName(vm_)->ToString(vm_));
1704514f5e3Sopenharmony_ci    ASSERT_TRUE(constructor->IsFunction(vm_));
1714514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> jsConstructor = JSNApiHelper::ToJSHandle(constructor);
1724514f5e3Sopenharmony_ci    ASSERT_TRUE(jsConstructor->IsClassConstructor());
1734514f5e3Sopenharmony_ci
1744514f5e3Sopenharmony_ci    Local<JSValueRef> functionPrototype = constructor->GetFunctionPrototype(vm_);
1754514f5e3Sopenharmony_ci    ASSERT_TRUE(functionPrototype->IsObject(vm_));
1764514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> jsPrototype = JSNApiHelper::ToJSHandle(functionPrototype);
1774514f5e3Sopenharmony_ci    ASSERT_TRUE(jsPrototype->IsClassPrototype());
1784514f5e3Sopenharmony_ci
1794514f5e3Sopenharmony_ci    const GlobalEnvConstants *globalConst = thread_->GlobalConstants();
1804514f5e3Sopenharmony_ci    auto prototype = JSTaggedValue::GetProperty(
1814514f5e3Sopenharmony_ci                         thread_, JSNApiHelper::ToJSHandle(constructor), globalConst->GetHandledPrototypeString())
1824514f5e3Sopenharmony_ci                         .GetValue();
1834514f5e3Sopenharmony_ci    ASSERT_FALSE(prototype->IsUndefined());
1844514f5e3Sopenharmony_ci    ASSERT_TRUE(prototype->IsECMAObject() || prototype->IsNull());
1854514f5e3Sopenharmony_ci}
1864514f5e3Sopenharmony_ci
1874514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionProperties)
1884514f5e3Sopenharmony_ci{
1894514f5e3Sopenharmony_ci    LocalScope scope(vm_);
1904514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = GetNewSendableClassFunction(vm_, FunctionRef::Null(vm_));
1914514f5e3Sopenharmony_ci    Local<ObjectRef> prototype = constructor->GetFunctionPrototype(vm_);
1924514f5e3Sopenharmony_ci
1934514f5e3Sopenharmony_ci    ASSERT_EQ("static", constructor->Get(vm_, staticKey)->ToString(vm_)->ToString(vm_));
1944514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic", prototype->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
1954514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", constructor->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
1964514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", prototype->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
1974514f5e3Sopenharmony_ci
1984514f5e3Sopenharmony_ci    // set static property on constructor
1994514f5e3Sopenharmony_ci    constructor->Set(vm_, staticKey, StringRef::NewFromUtf8(vm_, "static0"));
2004514f5e3Sopenharmony_ci    ASSERT_EQ("static0", constructor->Get(vm_, staticKey)->ToString(vm_)->ToString(vm_));
2014514f5e3Sopenharmony_ci
2024514f5e3Sopenharmony_ci    // set non static property on prototype
2034514f5e3Sopenharmony_ci    prototype->Set(vm_, nonStaticKey, StringRef::NewFromUtf8(vm_, "nonStatic0"));
2044514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", prototype->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2054514f5e3Sopenharmony_ci
2064514f5e3Sopenharmony_ci    // set invalid property on constructor
2074514f5e3Sopenharmony_ci    ASSERT_FALSE(vm_->GetJSThread()->HasPendingException());
2084514f5e3Sopenharmony_ci    constructor->Set(vm_, invalidKey, StringRef::NewFromUtf8(vm_, "invalid"));
2094514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
2104514f5e3Sopenharmony_ci    JSNApi::GetAndClearUncaughtException(vm_);
2114514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", constructor->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
2124514f5e3Sopenharmony_ci
2134514f5e3Sopenharmony_ci    // set invalid property on prototype
2144514f5e3Sopenharmony_ci    ASSERT_FALSE(vm_->GetJSThread()->HasPendingException());
2154514f5e3Sopenharmony_ci    prototype->Set(vm_, invalidKey, StringRef::NewFromUtf8(vm_, "invalid"));
2164514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
2174514f5e3Sopenharmony_ci    JSNApi::GetAndClearUncaughtException(vm_);
2184514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", prototype->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
2194514f5e3Sopenharmony_ci}
2204514f5e3Sopenharmony_ci
2214514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionDictProperties)
2224514f5e3Sopenharmony_ci{
2234514f5e3Sopenharmony_ci    LocalScope scope(vm_);
2244514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = GetNewSendableClassFunction(vm_, FunctionRef::Null(vm_), true);
2254514f5e3Sopenharmony_ci    Local<ObjectRef> prototype = constructor->GetFunctionPrototype(vm_);
2264514f5e3Sopenharmony_ci
2274514f5e3Sopenharmony_ci    ASSERT_EQ("static", constructor->Get(vm_, staticKey)->ToString(vm_)->ToString(vm_));
2284514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic", prototype->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2294514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", constructor->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
2304514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", prototype->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
2314514f5e3Sopenharmony_ci
2324514f5e3Sopenharmony_ci    // set static property on constructor
2334514f5e3Sopenharmony_ci    constructor->Set(vm_, staticKey, StringRef::NewFromUtf8(vm_, "static0"));
2344514f5e3Sopenharmony_ci    ASSERT_EQ("static0", constructor->Get(vm_, staticKey)->ToString(vm_)->ToString(vm_));
2354514f5e3Sopenharmony_ci
2364514f5e3Sopenharmony_ci    // set non static property on prototype
2374514f5e3Sopenharmony_ci    prototype->Set(vm_, nonStaticKey, StringRef::NewFromUtf8(vm_, "nonStatic0"));
2384514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", prototype->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2394514f5e3Sopenharmony_ci
2404514f5e3Sopenharmony_ci    // set invalid property on constructor
2414514f5e3Sopenharmony_ci    ASSERT_FALSE(vm_->GetJSThread()->HasPendingException());
2424514f5e3Sopenharmony_ci    constructor->Set(vm_, invalidKey, StringRef::NewFromUtf8(vm_, "invalid"));
2434514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
2444514f5e3Sopenharmony_ci    JSNApi::GetAndClearUncaughtException(vm_);
2454514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", constructor->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
2464514f5e3Sopenharmony_ci
2474514f5e3Sopenharmony_ci    // set invalid property on prototype
2484514f5e3Sopenharmony_ci    ASSERT_FALSE(vm_->GetJSThread()->HasPendingException());
2494514f5e3Sopenharmony_ci    prototype->Set(vm_, invalidKey, StringRef::NewFromUtf8(vm_, "invalid"));
2504514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
2514514f5e3Sopenharmony_ci    JSNApi::GetAndClearUncaughtException(vm_);
2524514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", prototype->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
2534514f5e3Sopenharmony_ci}
2544514f5e3Sopenharmony_ci
2554514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionInstance)
2564514f5e3Sopenharmony_ci{
2574514f5e3Sopenharmony_ci    LocalScope scope(vm_);
2584514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = GetNewSendableClassFunction(vm_, FunctionRef::Null(vm_));
2594514f5e3Sopenharmony_ci    Local<JSValueRef> argv[1] = {NumberRef::New(vm_, 0)};
2604514f5e3Sopenharmony_ci    Local<ObjectRef> obj = constructor->Constructor(vm_, argv, 0);
2614514f5e3Sopenharmony_ci    Local<ObjectRef> obj0 = constructor->Constructor(vm_, argv, 0);
2624514f5e3Sopenharmony_ci
2634514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj), JSNApiHelper::ToJSHandle(constructor)));
2644514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj0), JSNApiHelper::ToJSHandle(constructor)));
2654514f5e3Sopenharmony_ci
2664514f5e3Sopenharmony_ci    // set instance property
2674514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, instanceKey)->ToString(vm_)->ToString(vm_));
2684514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj0->Get(vm_, instanceKey)->ToString(vm_)->ToString(vm_));
2694514f5e3Sopenharmony_ci    obj->Set(vm_, instanceKey, StringRef::NewFromUtf8(vm_, "instance"));
2704514f5e3Sopenharmony_ci    ASSERT_EQ("instance", obj->Get(vm_, instanceKey)->ToString(vm_)->ToString(vm_));
2714514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj0->Get(vm_, instanceKey)->ToString(vm_)->ToString(vm_));
2724514f5e3Sopenharmony_ci
2734514f5e3Sopenharmony_ci    // set non static property on prototype and get from instance
2744514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic", obj->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2754514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic", obj0->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2764514f5e3Sopenharmony_ci    Local<ObjectRef> prototype = obj->GetPrototype(vm_);
2774514f5e3Sopenharmony_ci    prototype->Set(vm_, nonStaticKey, StringRef::NewFromUtf8(vm_, "nonStatic0"));
2784514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", obj->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2794514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", obj0->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2804514f5e3Sopenharmony_ci
2814514f5e3Sopenharmony_ci    // set non static property on instance
2824514f5e3Sopenharmony_ci    ASSERT_FALSE(vm_->GetJSThread()->HasPendingException());
2834514f5e3Sopenharmony_ci    obj->Set(vm_, nonStaticKey, StringRef::NewFromUtf8(vm_, "nonStatic1"));
2844514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
2854514f5e3Sopenharmony_ci    JSNApi::GetAndClearUncaughtException(vm_);
2864514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", obj->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2874514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", obj0->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
2884514f5e3Sopenharmony_ci
2894514f5e3Sopenharmony_ci    // set invalid property on instance
2904514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
2914514f5e3Sopenharmony_ci    ASSERT_FALSE(vm_->GetJSThread()->HasPendingException());
2924514f5e3Sopenharmony_ci    obj->Set(vm_, invalidKey, StringRef::NewFromUtf8(vm_, "invalid"));
2934514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
2944514f5e3Sopenharmony_ci    JSNApi::GetAndClearUncaughtException(vm_);
2954514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
2964514f5e3Sopenharmony_ci}
2974514f5e3Sopenharmony_ci
2984514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionDictInstance)
2994514f5e3Sopenharmony_ci{
3004514f5e3Sopenharmony_ci    LocalScope scope(vm_);
3014514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = GetNewSendableClassFunction(vm_, FunctionRef::Null(vm_), true);
3024514f5e3Sopenharmony_ci    Local<JSValueRef> argv[1] = {NumberRef::New(vm_, 0)};
3034514f5e3Sopenharmony_ci    Local<ObjectRef> obj = constructor->Constructor(vm_, argv, 0);
3044514f5e3Sopenharmony_ci    Local<ObjectRef> obj0 = constructor->Constructor(vm_, argv, 0);
3054514f5e3Sopenharmony_ci
3064514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj), JSNApiHelper::ToJSHandle(constructor)));
3074514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj0), JSNApiHelper::ToJSHandle(constructor)));
3084514f5e3Sopenharmony_ci
3094514f5e3Sopenharmony_ci    // set instance property
3104514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, instanceKey)->ToString(vm_)->ToString(vm_));
3114514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj0->Get(vm_, instanceKey)->ToString(vm_)->ToString(vm_));
3124514f5e3Sopenharmony_ci    obj->Set(vm_, instanceKey, StringRef::NewFromUtf8(vm_, "instance"));
3134514f5e3Sopenharmony_ci    ASSERT_EQ("instance", obj->Get(vm_, instanceKey)->ToString(vm_)->ToString(vm_));
3144514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj0->Get(vm_, instanceKey)->ToString(vm_)->ToString(vm_));
3154514f5e3Sopenharmony_ci
3164514f5e3Sopenharmony_ci    // set non static property on prototype and get from instance
3174514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic", obj->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
3184514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic", obj0->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
3194514f5e3Sopenharmony_ci    Local<ObjectRef> prototype = obj->GetPrototype(vm_);
3204514f5e3Sopenharmony_ci    prototype->Set(vm_, nonStaticKey, StringRef::NewFromUtf8(vm_, "nonStatic0"));
3214514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", obj->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
3224514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", obj0->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
3234514f5e3Sopenharmony_ci
3244514f5e3Sopenharmony_ci    // set non static property on instance
3254514f5e3Sopenharmony_ci    ASSERT_FALSE(vm_->GetJSThread()->HasPendingException());
3264514f5e3Sopenharmony_ci    obj->Set(vm_, nonStaticKey, StringRef::NewFromUtf8(vm_, "nonStatic1"));
3274514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
3284514f5e3Sopenharmony_ci    JSNApi::GetAndClearUncaughtException(vm_);
3294514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", obj->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
3304514f5e3Sopenharmony_ci    ASSERT_EQ("nonStatic0", obj0->Get(vm_, nonStaticKey)->ToString(vm_)->ToString(vm_));
3314514f5e3Sopenharmony_ci
3324514f5e3Sopenharmony_ci    // set invalid property on instance
3334514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
3344514f5e3Sopenharmony_ci    ASSERT_FALSE(vm_->GetJSThread()->HasPendingException());
3354514f5e3Sopenharmony_ci    obj->Set(vm_, invalidKey, StringRef::NewFromUtf8(vm_, "invalid"));
3364514f5e3Sopenharmony_ci    ASSERT_TRUE(vm_->GetJSThread()->HasPendingException());
3374514f5e3Sopenharmony_ci    JSNApi::GetAndClearUncaughtException(vm_);
3384514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, invalidKey)->ToString(vm_)->ToString(vm_));
3394514f5e3Sopenharmony_ci}
3404514f5e3Sopenharmony_ci
3414514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionInherit)
3424514f5e3Sopenharmony_ci{
3434514f5e3Sopenharmony_ci    LocalScope scope(vm_);
3444514f5e3Sopenharmony_ci    Local<FunctionRef> parent = GetNewSendableClassFunction(vm_, FunctionRef::Null(vm_), false, false, true);
3454514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = GetNewSendableClassFunction(vm_, parent);
3464514f5e3Sopenharmony_ci    Local<JSValueRef> argv[1] = {NumberRef::New(vm_, 0)};
3474514f5e3Sopenharmony_ci    Local<ObjectRef> obj = constructor->Constructor(vm_, argv, 0);
3484514f5e3Sopenharmony_ci    Local<ObjectRef> obj0 = constructor->Constructor(vm_, argv, 0);
3494514f5e3Sopenharmony_ci
3504514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj), JSNApiHelper::ToJSHandle(parent)));
3514514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj0), JSNApiHelper::ToJSHandle(parent)));
3524514f5e3Sopenharmony_ci
3534514f5e3Sopenharmony_ci    // set parent instance property on instance
3544514f5e3Sopenharmony_ci    Local<StringRef> parentInstanceKey = StringRef::NewFromUtf8(vm_, "parentInstance");
3554514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, parentInstanceKey)->ToString(vm_)->ToString(vm_));
3564514f5e3Sopenharmony_ci    obj->Set(vm_, parentInstanceKey, StringRef::NewFromUtf8(vm_, "parentInstance"));
3574514f5e3Sopenharmony_ci    ASSERT_EQ("parentInstance", obj->Get(vm_, parentInstanceKey)->ToString(vm_)->ToString(vm_));
3584514f5e3Sopenharmony_ci
3594514f5e3Sopenharmony_ci    // get parent static property from constructor
3604514f5e3Sopenharmony_ci    Local<StringRef> parentStaticKey = StringRef::NewFromUtf8(vm_, "parentStatic");
3614514f5e3Sopenharmony_ci    ASSERT_EQ("parentStatic", constructor->Get(vm_, parentStaticKey)->ToString(vm_)->ToString(vm_));
3624514f5e3Sopenharmony_ci
3634514f5e3Sopenharmony_ci    // get parent non static property form instance
3644514f5e3Sopenharmony_ci    Local<StringRef> parentNonStaticKey = StringRef::NewFromUtf8(vm_, "parentNonStatic");
3654514f5e3Sopenharmony_ci    ASSERT_EQ("parentNonStatic", obj->Get(vm_, parentNonStaticKey)->ToString(vm_)->ToString(vm_));
3664514f5e3Sopenharmony_ci}
3674514f5e3Sopenharmony_ci
3684514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionDictInherit)
3694514f5e3Sopenharmony_ci{
3704514f5e3Sopenharmony_ci    LocalScope scope(vm_);
3714514f5e3Sopenharmony_ci    Local<FunctionRef> parent = GetNewSendableClassFunction(vm_, FunctionRef::Null(vm_), true, false, true);
3724514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = GetNewSendableClassFunction(vm_, parent);
3734514f5e3Sopenharmony_ci    Local<JSValueRef> argv[1] = {NumberRef::New(vm_, 0)};
3744514f5e3Sopenharmony_ci    Local<ObjectRef> obj = constructor->Constructor(vm_, argv, 0);
3754514f5e3Sopenharmony_ci    Local<ObjectRef> obj0 = constructor->Constructor(vm_, argv, 0);
3764514f5e3Sopenharmony_ci
3774514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj), JSNApiHelper::ToJSHandle(parent)));
3784514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj0), JSNApiHelper::ToJSHandle(parent)));
3794514f5e3Sopenharmony_ci
3804514f5e3Sopenharmony_ci    // set parent instance property on instance
3814514f5e3Sopenharmony_ci    Local<StringRef> parentInstanceKey = StringRef::NewFromUtf8(vm_, "parentInstance");
3824514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, parentInstanceKey)->ToString(vm_)->ToString(vm_));
3834514f5e3Sopenharmony_ci    obj->Set(vm_, parentInstanceKey, StringRef::NewFromUtf8(vm_, "parentInstance"));
3844514f5e3Sopenharmony_ci    ASSERT_EQ("parentInstance", obj->Get(vm_, parentInstanceKey)->ToString(vm_)->ToString(vm_));
3854514f5e3Sopenharmony_ci
3864514f5e3Sopenharmony_ci    // get parent static property from constructor
3874514f5e3Sopenharmony_ci    Local<StringRef> parentStaticKey = StringRef::NewFromUtf8(vm_, "parentStatic");
3884514f5e3Sopenharmony_ci    ASSERT_EQ("parentStatic", constructor->Get(vm_, parentStaticKey)->ToString(vm_)->ToString(vm_));
3894514f5e3Sopenharmony_ci
3904514f5e3Sopenharmony_ci    // get parent non static property form instance
3914514f5e3Sopenharmony_ci    Local<StringRef> parentNonStaticKey = StringRef::NewFromUtf8(vm_, "parentNonStatic");
3924514f5e3Sopenharmony_ci    ASSERT_EQ("parentNonStatic", obj->Get(vm_, parentNonStaticKey)->ToString(vm_)->ToString(vm_));
3934514f5e3Sopenharmony_ci}
3944514f5e3Sopenharmony_ci
3954514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionInheritWithDuplicatedKey)
3964514f5e3Sopenharmony_ci{
3974514f5e3Sopenharmony_ci    LocalScope scope(vm_);
3984514f5e3Sopenharmony_ci    Local<FunctionRef> parent = GetNewSendableClassFunction(vm_, FunctionRef::Null(vm_), false, false, true);
3994514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = GetNewSendableClassFunction(vm_, parent, false, true);
4004514f5e3Sopenharmony_ci    Local<JSValueRef> argv[1] = {NumberRef::New(vm_, 0)};
4014514f5e3Sopenharmony_ci    Local<ObjectRef> obj = constructor->Constructor(vm_, argv, 0);
4024514f5e3Sopenharmony_ci
4034514f5e3Sopenharmony_ci    ASSERT_TRUE(JSFunction::InstanceOf(thread_, JSNApiHelper::ToJSHandle(obj), JSNApiHelper::ToJSHandle(parent)));
4044514f5e3Sopenharmony_ci
4054514f5e3Sopenharmony_ci    // set duplicated instance property on instance
4064514f5e3Sopenharmony_ci    Local<StringRef> parentInstanceKey = StringRef::NewFromUtf8(vm_, "parentInstance");
4074514f5e3Sopenharmony_ci    ASSERT_EQ("undefined", obj->Get(vm_, parentInstanceKey)->ToString(vm_)->ToString(vm_));
4084514f5e3Sopenharmony_ci    obj->Set(vm_, parentInstanceKey, NumberRef::New(vm_, 0));
4094514f5e3Sopenharmony_ci    EXPECT_TRUE(NumberRef::New(vm_, 0)->IsStrictEquals(vm_, obj->Get(vm_, parentInstanceKey)));
4104514f5e3Sopenharmony_ci}
4114514f5e3Sopenharmony_ci
4124514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendable)
4134514f5e3Sopenharmony_ci{
4144514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4154514f5e3Sopenharmony_ci    Local<FunctionRef> func = FunctionRef::NewSendable(
4164514f5e3Sopenharmony_ci        vm_,
4174514f5e3Sopenharmony_ci        [](JsiRuntimeCallInfo *runtimeInfo) -> JSValueRef {
4184514f5e3Sopenharmony_ci            EcmaVM *vm = runtimeInfo->GetVM();
4194514f5e3Sopenharmony_ci            LocalScope scope(vm);
4204514f5e3Sopenharmony_ci            return **StringRef::NewFromUtf8(vm, "funcResult");
4214514f5e3Sopenharmony_ci        },
4224514f5e3Sopenharmony_ci        nullptr);
4234514f5e3Sopenharmony_ci    Local<JSValueRef> res = func->Call(vm_, JSValueRef::Undefined(vm_), nullptr, 0);
4244514f5e3Sopenharmony_ci    ASSERT_EQ("funcResult", res->ToString(vm_)->ToString(vm_));
4254514f5e3Sopenharmony_ci}
4264514f5e3Sopenharmony_ci
4274514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionFunction)
4284514f5e3Sopenharmony_ci{
4294514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4304514f5e3Sopenharmony_ci
4314514f5e3Sopenharmony_ci    FunctionRef::SendablePropertiesInfos infos;
4324514f5e3Sopenharmony_ci
4334514f5e3Sopenharmony_ci    Local<FunctionRef> func = FunctionRef::NewSendable(
4344514f5e3Sopenharmony_ci        vm_,
4354514f5e3Sopenharmony_ci        [](JsiRuntimeCallInfo *runtimeInfo) -> JSValueRef {
4364514f5e3Sopenharmony_ci            EcmaVM *vm = runtimeInfo->GetVM();
4374514f5e3Sopenharmony_ci            LocalScope scope(vm);
4384514f5e3Sopenharmony_ci            return **StringRef::NewFromUtf8(vm, "funcResult");
4394514f5e3Sopenharmony_ci        },
4404514f5e3Sopenharmony_ci        nullptr);
4414514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.keys.push_back(staticKey);
4424514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.types.push_back(FunctionRef::SendableType::OBJECT);
4434514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.attributes.push_back(PropertyAttribute(func, true, true, true));
4444514f5e3Sopenharmony_ci
4454514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = FunctionRef::NewSendableClassFunction(
4464514f5e3Sopenharmony_ci        vm_, FunctionCallback, nullptr, nullptr, StringRef::NewFromUtf8(vm_, "name"), infos, FunctionRef::Null(vm_));
4474514f5e3Sopenharmony_ci
4484514f5e3Sopenharmony_ci    Local<FunctionRef> staticValue = constructor->Get(vm_, staticKey);
4494514f5e3Sopenharmony_ci    ASSERT_TRUE(staticValue->IsFunction(vm_));
4504514f5e3Sopenharmony_ci    Local<JSValueRef> res = staticValue->Call(vm_, JSValueRef::Undefined(vm_), nullptr, 0);
4514514f5e3Sopenharmony_ci    ASSERT_EQ("funcResult", res->ToString(vm_)->ToString(vm_));
4524514f5e3Sopenharmony_ci}
4534514f5e3Sopenharmony_ci
4544514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewSendableClassFunctionGetterSetter)
4554514f5e3Sopenharmony_ci{
4564514f5e3Sopenharmony_ci    LocalScope scope(vm_);
4574514f5e3Sopenharmony_ci
4584514f5e3Sopenharmony_ci    FunctionRef::SendablePropertiesInfos infos;
4594514f5e3Sopenharmony_ci
4604514f5e3Sopenharmony_ci    Local<StringRef> getterSetter = StringRef::NewFromUtf8(vm_, "getterSetter");
4614514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.keys.push_back(getterSetter);
4624514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.types.push_back(FunctionRef::SendableType::NONE);
4634514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.attributes.push_back(PropertyAttribute(getterSetter, true, true, true));
4644514f5e3Sopenharmony_ci    Local<FunctionRef> staticGetter = FunctionRef::NewSendable(
4654514f5e3Sopenharmony_ci        vm_,
4664514f5e3Sopenharmony_ci        [](JsiRuntimeCallInfo *info) -> JSValueRef {
4674514f5e3Sopenharmony_ci            Local<JSValueRef> value = info->GetThisRef();
4684514f5e3Sopenharmony_ci            Local<ObjectRef> obj = value->ToObject(info->GetVM());
4694514f5e3Sopenharmony_ci            Local<JSValueRef> temp = obj->Get(info->GetVM(), StringRef::NewFromUtf8(info->GetVM(), "getterSetter"));
4704514f5e3Sopenharmony_ci            return **temp->ToString(info->GetVM());
4714514f5e3Sopenharmony_ci        },
4724514f5e3Sopenharmony_ci        nullptr);
4734514f5e3Sopenharmony_ci    Local<FunctionRef> staticSetter = FunctionRef::NewSendable(
4744514f5e3Sopenharmony_ci        vm_,
4754514f5e3Sopenharmony_ci        [](JsiRuntimeCallInfo *info) -> JSValueRef {
4764514f5e3Sopenharmony_ci            Local<JSValueRef> arg = info->GetCallArgRef(0);
4774514f5e3Sopenharmony_ci            Local<JSValueRef> value = info->GetThisRef();
4784514f5e3Sopenharmony_ci            Local<ObjectRef> obj = value->ToObject(info->GetVM());
4794514f5e3Sopenharmony_ci            obj->Set(info->GetVM(), StringRef::NewFromUtf8(info->GetVM(), "getterSetter"), arg);
4804514f5e3Sopenharmony_ci            return **JSValueRef::Undefined(info->GetVM());
4814514f5e3Sopenharmony_ci        },
4824514f5e3Sopenharmony_ci        nullptr);
4834514f5e3Sopenharmony_ci    Local<JSValueRef> staticValue = panda::ObjectRef::CreateSendableAccessorData(vm_, staticGetter, staticSetter);
4844514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.keys.push_back(staticKey);
4854514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.types.push_back(FunctionRef::SendableType::OBJECT);
4864514f5e3Sopenharmony_ci    infos.staticPropertiesInfo.attributes.push_back(PropertyAttribute(staticValue, true, true, true));
4874514f5e3Sopenharmony_ci
4884514f5e3Sopenharmony_ci    Local<FunctionRef> constructor = FunctionRef::NewSendableClassFunction(
4894514f5e3Sopenharmony_ci        vm_, FunctionCallback, nullptr, nullptr, StringRef::NewFromUtf8(vm_, "name"), infos, FunctionRef::Null(vm_));
4904514f5e3Sopenharmony_ci
4914514f5e3Sopenharmony_ci    ASSERT_EQ("getterSetter", constructor->Get(vm_, getterSetter)->ToString(vm_)->ToString(vm_));
4924514f5e3Sopenharmony_ci    ASSERT_EQ("getterSetter", constructor->Get(vm_, staticKey)->ToString(vm_)->ToString(vm_));
4934514f5e3Sopenharmony_ci    constructor->Set(vm_, staticKey, StringRef::NewFromUtf8(vm_, "getterSetter0"));
4944514f5e3Sopenharmony_ci    ASSERT_EQ("getterSetter0", constructor->Get(vm_, getterSetter)->ToString(vm_)->ToString(vm_));
4954514f5e3Sopenharmony_ci    ASSERT_EQ("getterSetter0", constructor->Get(vm_, staticKey)->ToString(vm_)->ToString(vm_));
4964514f5e3Sopenharmony_ci}
4974514f5e3Sopenharmony_ci
4984514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, NewObjectWithProperties)
4994514f5e3Sopenharmony_ci{
5004514f5e3Sopenharmony_ci    LocalScope scope(vm_);
5014514f5e3Sopenharmony_ci
5024514f5e3Sopenharmony_ci    FunctionRef::SendablePropertiesInfo info;
5034514f5e3Sopenharmony_ci    Local<StringRef> str = StringRef::NewFromUtf8(vm_, "str");
5044514f5e3Sopenharmony_ci    info.keys.push_back(str);
5054514f5e3Sopenharmony_ci    info.types.push_back(FunctionRef::SendableType::NONE);
5064514f5e3Sopenharmony_ci    info.attributes.push_back(PropertyAttribute(str, true, true, true));
5074514f5e3Sopenharmony_ci
5084514f5e3Sopenharmony_ci    Local<ObjectRef> object = ObjectRef::NewSWithProperties(vm_, info);
5094514f5e3Sopenharmony_ci    Local<JSValueRef> value = object->Get(vm_, str);
5104514f5e3Sopenharmony_ci    EXPECT_TRUE(str->IsStrictEquals(vm_, value));
5114514f5e3Sopenharmony_ci}
5124514f5e3Sopenharmony_ci
5134514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SendableMapRef_GetSize_GetTotalElements_Get_GetKey_GetValue)
5144514f5e3Sopenharmony_ci{
5154514f5e3Sopenharmony_ci    LocalScope scope(vm_);
5164514f5e3Sopenharmony_ci    Local<SendableMapRef> map = SendableMapRef::New(vm_);
5174514f5e3Sopenharmony_ci    Local<JSValueRef> key = StringRef::NewFromUtf8(vm_, "TestKey");
5184514f5e3Sopenharmony_ci    Local<JSValueRef> value = StringRef::NewFromUtf8(vm_, "TestValue");
5194514f5e3Sopenharmony_ci    map->Set(vm_, key, value);
5204514f5e3Sopenharmony_ci    Local<JSValueRef> res = map->Get(vm_, key);
5214514f5e3Sopenharmony_ci    ASSERT_EQ(res->ToString(vm_)->ToString(vm_), value->ToString(vm_)->ToString(vm_));
5224514f5e3Sopenharmony_ci    int32_t num = map->GetSize(vm_);
5234514f5e3Sopenharmony_ci    int32_t num1 = map->GetTotalElements(vm_);
5244514f5e3Sopenharmony_ci    ASSERT_EQ(num, 1);
5254514f5e3Sopenharmony_ci    ASSERT_EQ(num1, 1);
5264514f5e3Sopenharmony_ci    Local<JSValueRef> res1 = map->GetKey(vm_, 0);
5274514f5e3Sopenharmony_ci    ASSERT_EQ(res1->ToString(vm_)->ToString(vm_), key->ToString(vm_)->ToString(vm_));
5284514f5e3Sopenharmony_ci    Local<JSValueRef> res2 = map->GetValue(vm_, 0);
5294514f5e3Sopenharmony_ci    ASSERT_EQ(res2->ToString(vm_)->ToString(vm_), value->ToString(vm_)->ToString(vm_));
5304514f5e3Sopenharmony_ci}
5314514f5e3Sopenharmony_ci
5324514f5e3Sopenharmony_ciHWTEST_F_L0(JSNApiTests, SendableSetRef_GetSize_GetTotalElements_GetValue)
5334514f5e3Sopenharmony_ci{
5344514f5e3Sopenharmony_ci    LocalScope scope(vm_);
5354514f5e3Sopenharmony_ci    Local<SendableSetRef> set = SendableSetRef::New(vm_);
5364514f5e3Sopenharmony_ci    EXPECT_TRUE(set->IsSharedSet(vm_));
5374514f5e3Sopenharmony_ci    Local<JSValueRef> value = StringRef::NewFromUtf8(vm_, "TestValue");
5384514f5e3Sopenharmony_ci    set->Add(vm_, value);
5394514f5e3Sopenharmony_ci    int32_t num = set->GetSize(vm_);
5404514f5e3Sopenharmony_ci    int32_t num1 = set->GetTotalElements(vm_);
5414514f5e3Sopenharmony_ci    ASSERT_EQ(num, 1);
5424514f5e3Sopenharmony_ci    ASSERT_EQ(num1, 1);
5434514f5e3Sopenharmony_ci    Local<JSValueRef> res = set->GetValue(vm_, 0);
5444514f5e3Sopenharmony_ci    ASSERT_EQ(res->ToString(vm_)->ToString(vm_), value->ToString(vm_)->ToString(vm_));
5454514f5e3Sopenharmony_ci}
5464514f5e3Sopenharmony_ci
5474514f5e3Sopenharmony_ci}  // namespace panda::test
548