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