/* * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ecmascript/base/json_helper.h" #include "ecmascript/base/json_stringifier.h" #include "ecmascript/js_api/js_api_hashmap.h" #include "ecmascript/js_api/js_api_hashset.h" #include "ecmascript/js_array.h" #include "ecmascript/js_map.h" #include "ecmascript/js_set.h" #include "ecmascript/linked_hash_table.h" #include "ecmascript/object_factory.h" #include "ecmascript/tests/test_helper.h" #include "ecmascript/shared_objects/js_shared_map.h" #include "ecmascript/shared_objects/js_shared_set.h" #include "ecmascript/tests/ecma_test_common.h" using namespace panda::ecmascript; using namespace panda::ecmascript::base; namespace panda::test { class JsonStringifierTest : public BaseTestWithScope { public: using TransformType = base::JsonHelper::TransformType; }; static JSTaggedValue CreateBaseJSObject(JSThread *thread, const CString keyCStr) { EcmaVM *ecmaVM = thread->GetEcmaVM(); JSHandle globalEnv = ecmaVM->GetGlobalEnv(); ObjectFactory *factory = ecmaVM->GetFactory(); JSHandle objectFunc(globalEnv->GetObjectFunction()); JSHandle jsObject(factory->NewJSObjectByConstructor(JSHandle(objectFunc), objectFunc)); EXPECT_TRUE(*jsObject != nullptr); JSHandle handleKey1(factory->NewFromASCII(&keyCStr[0])); JSHandle handleValue1(thread, JSTaggedValue(1)); // 1 : test case JSObject::SetProperty(thread, JSHandle(jsObject), handleKey1, handleValue1); CString str2 = "x"; JSHandle handleKey2(factory->NewFromASCII(str2)); JSHandle handleValue2(thread, JSTaggedValue(3.6)); // 3.6 : test case JSObject::SetProperty(thread, JSHandle(jsObject), handleKey2, handleValue2); CString str3 = "y"; JSHandle handleKey3(factory->NewFromASCII(str3)); JSHandle handleValue3(factory->NewFromASCII("abc")); JSObject::SetProperty(thread, JSHandle(jsObject), handleKey3, handleValue3); return jsObject.GetTaggedValue(); } static JSHandle CreateSharedMap(JSThread *thread) { auto globalEnv = thread->GetEcmaVM()->GetGlobalEnv(); JSHandle proto = globalEnv->GetSharedMapPrototype(); auto emptySLayout = thread->GlobalConstants()->GetHandledEmptySLayoutInfo(); auto vm = thread->GetEcmaVM(); ObjectFactory *factory = vm->GetFactory(); JSHandle mapClass = factory->NewSEcmaHClass(JSSharedMap::SIZE, 0, JSType::JS_SHARED_MAP, proto, emptySLayout); JSHandle obj = factory->NewSharedOldSpaceJSObjectWithInit(mapClass); JSHandle jsMap = JSHandle::Cast(obj); JSHandle linkedMap( LinkedHashMap::Create(thread, LinkedHashMap::MIN_CAPACITY, MemSpaceKind::SHARED)); jsMap->SetLinkedMap(thread, linkedMap); jsMap->SetModRecord(0); return jsMap; } static JSHandle CreateJSSharedSet(JSThread *thread) { auto globalEnv = thread->GetEcmaVM()->GetGlobalEnv(); auto vm = thread->GetEcmaVM(); ObjectFactory *factory = vm->GetFactory(); JSHandle proto = globalEnv->GetSFunctionPrototype(); auto emptySLayout = thread->GlobalConstants()->GetHandledEmptySLayoutInfo(); JSHandle setClass = factory->NewSEcmaHClass(JSSharedSet::SIZE, 0, JSType::JS_SHARED_SET, proto, emptySLayout); JSHandle jsSet = JSHandle::Cast(factory->NewJSObjectWithInit(setClass)); JSHandle linkedSet( LinkedHashSet::Create(thread, LinkedHashSet::MIN_CAPACITY, MemSpaceKind::SHARED)); jsSet->SetLinkedSet(thread, linkedSet); jsSet->SetModRecord(0); return jsSet; } static JSHandle CreateJSMap(JSThread *thread) { auto globalEnv = thread->GetEcmaVM()->GetGlobalEnv(); auto vm = thread->GetEcmaVM(); ObjectFactory *factory = vm->GetFactory(); JSHandle constructor = globalEnv->GetBuiltinsMapFunction(); JSHandle map = JSHandle::Cast(factory->NewJSObjectByConstructor(JSHandle(constructor), constructor)); JSHandle linkedMap = LinkedHashMap::Create(thread); map->SetLinkedMap(thread, linkedMap); return JSHandle(thread, *map); } static JSHandle CreateJSSet(JSThread *thread) { auto globalEnv = thread->GetEcmaVM()->GetGlobalEnv(); JSHandle proto = globalEnv->GetFunctionPrototype(); auto vm = thread->GetEcmaVM(); ObjectFactory *factory = vm->GetFactory(); JSHandle hclass = factory->NewEcmaHClass(JSSet::SIZE, JSType::JS_SET, proto); JSHandle jsSetObject = factory->NewJSObjectWithInit(hclass); JSHandle jsSet = JSHandle::Cast(jsSetObject); JSHandle linkedSet(LinkedHashSet::Create(thread)); jsSet->SetLinkedSet(thread, linkedSet); return jsSet; } static JSAPIHashMap *CreateHashMap(JSThread *thread) { return EcmaContainerCommon::CreateHashMap(thread); } static JSAPIHashSet *CreateHashSet(JSThread *thread) { return EcmaContainerCommon::CreateHashSet(thread); } static JSTaggedValue TestForStringfy1([[maybe_unused]] EcmaRuntimeCallInfo *argv) { // false: test case return JSTaggedValue(JSTaggedValue::False()); } static JSTaggedValue TestForStringfy2([[maybe_unused]] EcmaRuntimeCallInfo *argv) { // 10.12: test case return JSTaggedValue(10.12); } /** * @tc.name: Stringify_001 * @tc.desc: Check whether the result returned through "Stringify" function is within expectations * the first parameter of the ECMAObject,the second parameter is JSFunction,the third parameter * is Undefined.if the second parameter is JSFunction,the return value is the parameter stringification * after through "call" function. * @tc.type: FUNC * @tc.require: */ HWTEST_F_L0(JsonStringifierTest, Stringify_001) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JSHandle env = thread->GetEcmaVM()->GetGlobalEnv(); JSHandle handleObj = JSHandle(thread, CreateBaseJSObject(thread, "z")); JSHandle handleFunc1 = factory->NewJSFunction(env, reinterpret_cast(TestForStringfy1)); JSHandle handleFunc2 = factory->NewJSFunction(env, reinterpret_cast(TestForStringfy2)); JSHandle handleValue(thread, handleObj.GetTaggedValue()); JSHandle handleReplacer1(thread, handleFunc1.GetTaggedValue()); JSHandle handleReplacer2(thread, handleFunc2.GetTaggedValue()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JsonStringifier stringifier1(thread); JSHandle resultString1 = stringifier1.Stringify(handleValue, handleReplacer1, handleGap); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("false", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); JsonStringifier stringifier2(thread); JSHandle resultString2 = stringifier2.Stringify(handleValue, handleReplacer2, handleGap); EXPECT_TRUE(resultString2->IsString()); JSHandle handleEcmaStr2(resultString2); EXPECT_STREQ("10.12", EcmaStringAccessor(handleEcmaStr2).ToCString().c_str()); } /** * @tc.name: Stringify_002 * @tc.desc: Check whether the result returned through "Stringify" function is within expectations * the first parameter of the ECMAObject,the second parameter is Undefined,the third parameter * is Number.This situation will stringize parameters through "SerializeJSONObject" function. * @tc.type: FUNC * @tc.require: */ HWTEST_F_L0(JsonStringifierTest, Stringify_002) { JsonStringifier stringifier(thread); JSHandle handleObj = JSHandle(thread, CreateBaseJSObject(thread, "z")); JSHandle handleValue(thread, handleObj.GetTaggedValue()); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue(static_cast(10))); JSHandle resultString = stringifier.Stringify(handleValue, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("{\n \"z\": 1,\n \"x\": 3.6,\n \"y\": \"abc\"\n}", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); } /** * @tc.name: Stringify_003 * @tc.desc: Check whether the result returned through "Stringify" function is within expectations * the first parameter of the ECMAObject,the second parameter is Undefined,the third parameter * is String,This situation will stringize parameters through "SerializeJSONObject" function. * @tc.type: FUNC * @tc.require: */ HWTEST_F_L0(JsonStringifierTest, Stringify_003) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread); JSHandle handleObj = JSHandle(thread, CreateBaseJSObject(thread, "z")); JSHandle handleMsg(factory->NewFromASCII("tttt")); JSHandle handleStr(JSTaggedValue::ToString(thread, handleMsg)); JSHandle handleValue(thread, handleObj.GetTaggedValue()); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, handleStr.GetTaggedValue()); JSHandle resultString = stringifier.Stringify(handleValue, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle resultStr = factory->NewFromASCII("{\ntttt\"z\": 1,\ntttt\"x\": 3.6,\ntttt\"y\": \"abc\"\n}"); EXPECT_EQ(EcmaStringAccessor::Compare(instance, resultStr, JSHandle(resultString)), 0); } /** * @tc.name: Stringify_004 * @tc.desc: Check whether the result returned through "Stringify" function is within expectations * the first parameter of the ECMAObject,the second parameter is JSArray,the third parameter * is String.This situation will stringize parameters through "SerializeJSONObject" function. * @tc.type: FUNC * @tc.require: */ HWTEST_F_L0(JsonStringifierTest, Stringify_004) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread); JSHandle handleObj1 = JSHandle(thread, CreateBaseJSObject(thread, "z")); JSArray *handleArr = JSArray::Cast(JSArray::ArrayCreate(thread, JSTaggedNumber(0)).GetTaggedValue().GetTaggedObject()); JSHandle handleObj2(thread, handleArr); JSHandle handleKey0(thread, JSTaggedValue(0)); JSHandle handleValue0(factory->NewFromASCII("z")); JSObject::SetProperty(thread, JSHandle(handleObj2), handleKey0, handleValue0); JSHandle handleKey1(thread, JSTaggedValue(1)); JSHandle handleValue1(factory->NewFromASCII("x")); JSObject::SetProperty(thread, JSHandle(handleObj2), handleKey1, handleValue1); JSHandle handleMsg(factory->NewFromASCII("tttt")); JSHandle handleStr(JSTaggedValue::ToString(thread, handleMsg)); JSHandle handleValue(thread, handleObj1.GetTaggedValue()); JSHandle handleReplacer(thread, handleObj2.GetTaggedValue()); JSHandle handleGap(thread, handleStr.GetTaggedValue()); JSHandle resultString = stringifier.Stringify(handleValue, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("{\ntttt\"z\": 1,\ntttt\"x\": 3.6\n}", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); } /** * @tc.name: Stringify_005 * @tc.desc: Check whether the result returned through "Stringify" function is within expectations * the first parameter of the ECMAObject,the second parameter is Undefined,the third parameter * is Undefined.This situation will stringize the first parameter through "SerializeJSONObject" function. * @tc.type: FUNC * @tc.require: */ HWTEST_F_L0(JsonStringifierTest, Stringify_005) { JsonStringifier stringifier(thread); JSHandle handleObj = JSHandle(thread, CreateBaseJSObject(thread, "z")); JSHandle handleValue(thread, handleObj.GetTaggedValue()); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleValue, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("{\"z\":1,\"x\":3.6,\"y\":\"abc\"}", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); } /** * @tc.name: Stringify_006 * @tc.desc: Check whether the result returned through "Stringify" function is within expectations * the first parameter of the JSArray,the second parameter is Undefined,the third parameter * is String,This situation will stringize parameters through "SerializeJSArray" function. * @tc.type: FUNC * @tc.require: */ HWTEST_F_L0(JsonStringifierTest, Stringify_006) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread); JSArray *handleArr = JSArray::Cast(JSArray::ArrayCreate(thread, JSTaggedNumber(0)).GetTaggedValue().GetTaggedObject()); JSHandle handleObj(thread, handleArr); JSHandle handleKey0(thread, JSTaggedValue(0)); JSHandle handleValue0(factory->NewFromASCII("json")); JSObject::SetProperty(thread, JSHandle(handleObj), handleKey0, handleValue0); JSHandle handleKey1(thread, JSTaggedValue(1)); PropertyDescriptor handleDesc(thread, JSHandle(thread, JSTaggedValue(100)), true, true, true); JSArray::DefineOwnProperty(thread, handleObj, handleKey1, handleDesc); JSHandle handleKey2(thread, JSTaggedValue(2)); JSHandle handleValue2(factory->NewFromASCII("abc")); JSObject::SetProperty(thread, JSHandle(handleObj), handleKey2, handleValue2); JSHandle handleMsg(factory->NewFromASCII("tttt")); JSHandle handleStr(JSTaggedValue::ToString(thread, handleMsg)); JSHandle handleValue(thread, handleObj.GetTaggedValue()); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, handleStr.GetTaggedValue()); JSHandle resultString = stringifier.Stringify(handleValue, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("[\ntttt\"json\",\ntttt100,\ntttt\"abc\"\n]", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); } /** * @tc.name: Stringify_007 * @tc.desc: Check whether the result returned through "Stringify" function is within expectations * the first parameter of the JSObject,the second parameter is Undefined,the third parameter * is Undefined.This situation will stringize the first parameter through "SerializeJSArray" function. * @tc.type: FUNC * @tc.require: */ HWTEST_F_L0(JsonStringifierTest, Stringify_007) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread); JSArray *handleArr = JSArray::Cast(JSArray::ArrayCreate(thread, JSTaggedNumber(0)).GetTaggedValue().GetTaggedObject()); JSHandle handleObj(thread, handleArr); JSHandle handleKey0(thread, JSTaggedValue(0)); PropertyDescriptor handleDesc0(thread, JSHandle(thread, JSTaggedValue(1)), true, true, true); JSArray::DefineOwnProperty(thread, handleObj, handleKey0, handleDesc0); JSHandle handleKey1(thread, JSTaggedValue(1)); PropertyDescriptor handleDesc1(thread, JSHandle(thread, JSTaggedValue(3.6)), true, true, true); JSArray::DefineOwnProperty(thread, handleObj, handleKey1, handleDesc1); JSHandle handleKey2(thread, JSTaggedValue(2)); JSHandle handleValue2(factory->NewFromASCII("abc")); JSObject::SetProperty(thread, JSHandle(handleObj), handleKey2, handleValue2); JSHandle handleValue(thread, handleObj.GetTaggedValue()); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleValue, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("[1,3.6,\"abc\"]", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); } /** * @tc.name: Stringify_008 * @tc.desc: Check whether the result returned through "Stringify" function is within expectations * the first parameter of the JSObject,the second parameter is Undefined,the third parameter * is Undefined.This situation will stringize the first parameter through "SerializePrimitiveRef" * function. * @tc.type: FUNC * @tc.require: */ HWTEST_F_L0(JsonStringifierTest, Stringify_008) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread); JSHandle undefined = thread->GlobalConstants()->GetHandledUndefined(); JSHandle handleStr(factory->NewFromASCII("\"\\\b\f\n\r\t")); JSHandle handlePrimitiveRef = factory->NewJSString(handleStr, undefined); JSHandle handleObj(thread, handlePrimitiveRef.GetTaggedValue()); JSHandle handleValue(thread, handleObj.GetTaggedValue()); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleValue, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("\"\\\"\\\\\\b\\f\\n\\r\\t\"", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); } static void* Detach(void *param1, void *param2, void *hint, void *detachData) { GTEST_LOG_(INFO) << "detach is running"; if (param1 == nullptr && param2 == nullptr) { GTEST_LOG_(INFO) << "detach: two params is nullptr"; } if (hint == nullptr && detachData) { GTEST_LOG_(INFO) << "detach: hint is nullptr"; } return nullptr; } static void* Attach([[maybe_unused]] void *enginePointer, [[maybe_unused]] void *buffer, [[maybe_unused]] void *hint, [[maybe_unused]] void *attachData) { GTEST_LOG_(INFO) << "attach is running"; return nullptr; } static panda::JSNApi::NativeBindingInfo* CreateNativeBindingInfo(void* attach, void* detach) { GTEST_LOG_(INFO) << "CreateNativeBindingInfo"; auto info = panda::JSNApi::NativeBindingInfo::CreateNewInstance(); info->attachFunc = attach; info->detachFunc = detach; return info; } HWTEST_F_L0(JsonStringifierTest, Stringify_009) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread); EcmaVM *ecmaVM = thread->GetEcmaVM(); JSHandle globalEnv = ecmaVM->GetGlobalEnv(); JSHandle objectFunc(globalEnv->GetObjectFunction()); JSHandle jsObject(factory->NewJSObjectByConstructor(JSHandle(objectFunc), objectFunc)); EXPECT_TRUE(*jsObject != nullptr); JSHandle key1(factory->NewFromASCII("key1")); auto info = CreateNativeBindingInfo(reinterpret_cast(Attach), reinterpret_cast(Detach)); JSHandle value1(factory->NewJSNativePointer(reinterpret_cast(info))); JSObject::SetProperty(thread, JSHandle(jsObject), key1, value1); JSHandle key2(factory->NewFromASCII("key2")); JSHandle value2(factory->NewFromASCII("abc")); JSObject::SetProperty(thread, JSHandle(jsObject), key2, value2); JSHandle handleValue(thread, jsObject.GetTaggedValue()); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleValue, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("{\"key1\":{},\"key2\":\"abc\"}", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_010) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle sharedMap = CreateSharedMap(thread); JSHandle handleMap = JSHandle(sharedMap); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleMap, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("{}", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); JsonStringifier stringifier1(thread, TransformType::SENDABLE); JSHandle sharedMap1 = CreateSharedMap(thread); JSHandle key1(factory->NewFromASCII("key1")); JSHandle value1(factory->NewFromASCII("abc")); JSSharedMap::Set(thread, sharedMap1, key1, value1); JSHandle key2(factory->NewFromASCII("key2")); JSHandle value2(factory->NewFromASCII("val")); JSSharedMap::Set(thread, sharedMap1, key2, value2); JSHandle handleMap1 = JSHandle(sharedMap1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleMap1 != nullptr); JSHandle resultString1 = stringifier1.Stringify(handleMap1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("{\"key1\":\"abc\",\"key2\":\"val\"}", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_011) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle jsMap = CreateJSMap(thread); JSHandle handleMap = JSHandle(jsMap); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleMap, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("{}", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); JsonStringifier stringifier1(thread, TransformType::SENDABLE); JSHandle jsMap1 = CreateJSMap(thread); JSHandle key1(factory->NewFromASCII("key1")); JSHandle value1(factory->NewFromASCII("abc")); JSMap::Set(thread, jsMap1, key1, value1); JSHandle key2(factory->NewFromASCII("key2")); JSHandle value2(factory->NewFromASCII("val")); JSMap::Set(thread, jsMap1, key2, value2); JSHandle handleMap1 = JSHandle(jsMap1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleMap1 != nullptr); JSHandle resultString1 = stringifier1.Stringify(handleMap1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("{\"key1\":\"abc\",\"key2\":\"val\"}", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_012) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle sharedSet = CreateJSSharedSet(thread); JSHandle handleSet = JSHandle(sharedSet); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleSet, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("[]", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); JsonStringifier stringifier1(thread, TransformType::SENDABLE); JSHandle sharedSet1 = CreateJSSharedSet(thread); JSHandle value1(factory->NewFromASCII("abc")); JSSharedSet::Add(thread, sharedSet1, value1); JSHandle value2(factory->NewFromASCII("val")); JSSharedSet::Add(thread, sharedSet1, value2); JSHandle handleSet1 = JSHandle(sharedSet1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleSet1 != nullptr); JSHandle resultString1 = stringifier1.Stringify(handleSet1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("[\"abc\",\"val\"]", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_013) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle jsSet = CreateJSSet(thread); JSHandle handleSet = JSHandle(jsSet); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleSet, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("[]", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); JsonStringifier stringifier1(thread, TransformType::SENDABLE); JSHandle jsSet1 = CreateJSSet(thread); JSHandle value1(factory->NewFromASCII("abc")); JSSet::Add(thread, jsSet1, value1); JSHandle value2(factory->NewFromASCII("val")); JSSet::Add(thread, jsSet1, value2); JSHandle handleSet1 = JSHandle(jsSet1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleSet1 != nullptr); JSHandle resultString1 = stringifier1.Stringify(handleSet1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("[\"abc\",\"val\"]", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_014) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle hashMap(thread, CreateHashMap(thread)); JSHandle handleMap = JSHandle(hashMap); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleMap, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("{}", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); JsonStringifier stringifier1(thread, TransformType::SENDABLE); JSHandle hashMap1(thread, CreateHashMap(thread)); JSHandle key1(factory->NewFromASCII("key1")); JSHandle value1(factory->NewFromASCII("abc")); JSAPIHashMap::Set(thread, hashMap1, key1, value1); JSHandle key2(factory->NewFromASCII("key2")); JSHandle value2(factory->NewFromASCII("val")); JSAPIHashMap::Set(thread, hashMap1, key2, value2); JSHandle handleMap1 = JSHandle(hashMap1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleMap1 != nullptr); JSHandle resultString1 = stringifier1.Stringify(handleMap1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STRNE("{}", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_015) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle hashSet(thread, CreateHashSet(thread)); JSHandle handleSet = JSHandle(hashSet); JSHandle handleReplacer(thread, JSTaggedValue::Undefined()); JSHandle handleGap(thread, JSTaggedValue::Undefined()); JSHandle resultString = stringifier.Stringify(handleSet, handleReplacer, handleGap); EXPECT_TRUE(resultString->IsString()); JSHandle handleEcmaStr(resultString); EXPECT_STREQ("[]", EcmaStringAccessor(handleEcmaStr).ToCString().c_str()); JsonStringifier stringifier1(thread, TransformType::SENDABLE); JSHandle hashSet1(thread, CreateHashSet(thread)); JSHandle value1(factory->NewFromASCII("abc")); JSAPIHashSet::Add(thread, hashSet1, value1); JSHandle value2(factory->NewFromASCII("val")); JSAPIHashSet::Add(thread, hashSet1, value2); JSHandle handleSet1 = JSHandle(hashSet1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleSet1 != nullptr); JSHandle resultString1 = stringifier1.Stringify(handleSet1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STRNE("[]", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_016) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle sharedMap1 = CreateSharedMap(thread); JSHandle key1(factory->NewFromASCII("key1")); JSHandle value1(factory->NewFromASCII("abc")); JSSharedMap::Set(thread, sharedMap1, key1, value1); JSSharedMap::Clear(thread, sharedMap1); JSHandle key2(factory->NewFromASCII("key2")); JSHandle value2(factory->NewFromASCII("val")); JSSharedMap::Set(thread, sharedMap1, key2, value2); JSSharedMap::Set(thread, sharedMap1, key1, value1); JSHandle handleMap1 = JSHandle(sharedMap1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleMap1 != nullptr); JSHandle resultString1 = stringifier.Stringify(handleMap1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("{\"key2\":\"val\",\"key1\":\"abc\"}", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_017) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle sharedSet1 = CreateJSSharedSet(thread); JSHandle value1(factory->NewFromASCII("abc")); JSSharedSet::Add(thread, sharedSet1, value1); JSSharedSet::Clear(thread, sharedSet1); JSHandle value2(factory->NewFromASCII("val")); JSSharedSet::Add(thread, sharedSet1, value2); JSSharedSet::Add(thread, sharedSet1, value1); JSHandle handleSet1 = JSHandle(sharedSet1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleSet1 != nullptr); JSHandle resultString1 = stringifier.Stringify(handleSet1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("[\"val\",\"abc\"]", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_018) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle sharedMap1 = CreateSharedMap(thread); JSHandle key1(factory->NewFromASCII("key1")); JSHandle value1(factory->NewFromASCII("abc")); JSSharedMap::Set(thread, sharedMap1, key1, value1); JSHandle key2(factory->NewFromASCII("key2")); JSHandle value2(factory->NewFromASCII("val")); JSHandle undefined(thread, JSTaggedValue::Undefined()); JSSharedMap::Set(thread, sharedMap1, key2, undefined); JSSharedMap::Set(thread, sharedMap1, undefined, value2); JSHandle handleMap1 = JSHandle(sharedMap1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleMap1 != nullptr); JSHandle resultString1 = stringifier.Stringify(handleMap1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("{\"key1\":\"abc\",\"undefined\":\"val\"}", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_019) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier(thread, TransformType::SENDABLE); JSHandle sharedSet1 = CreateJSSharedSet(thread); JSHandle value1(factory->NewFromASCII("abc")); JSSharedSet::Add(thread, sharedSet1, value1); JSHandle value2(factory->NewFromASCII("val")); JSSharedSet::Add(thread, sharedSet1, value2); JSHandle undefined(thread, JSTaggedValue::Undefined()); JSSharedSet::Add(thread, sharedSet1, undefined); JSHandle handleSet1 = JSHandle(sharedSet1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleSet1 != nullptr); JSHandle resultString1 = stringifier.Stringify(handleSet1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("[\"abc\",\"val\",null]", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_020) { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JsonStringifier stringifier1(thread, TransformType::SENDABLE); JSHandle hashMap1(thread, CreateHashMap(thread)); JSHandle key1(factory->NewFromASCII("key1")); JSHandle value1(factory->NewFromASCII("abc")); JSAPIHashMap::Set(thread, hashMap1, key1, value1); JSHandle key2(factory->NewFromASCII("key2")); JSHandle value2(thread, JSTaggedValue::Undefined()); JSAPIHashMap::Set(thread, hashMap1, key2, value2); JSHandle handleMap1 = JSHandle(hashMap1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleMap1 != nullptr); JSHandle resultString1 = stringifier1.Stringify(handleMap1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("{\"key1\":\"abc\"}", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } HWTEST_F_L0(JsonStringifierTest, Stringify_021) { JsonStringifier stringifier1(thread, TransformType::SENDABLE); JSHandle hashSet1(thread, CreateHashSet(thread)); JSHandle value1(thread, JSTaggedValue::Undefined()); JSAPIHashSet::Add(thread, hashSet1, value1); JSHandle handleSet1 = JSHandle(hashSet1); JSHandle handleReplacer1(thread, JSTaggedValue::Undefined()); JSHandle handleGap1(thread, JSTaggedValue::Undefined()); EXPECT_TRUE(*handleSet1 != nullptr); JSHandle resultString1 = stringifier1.Stringify(handleSet1, handleReplacer1, handleGap1); EXPECT_TRUE(resultString1->IsString()); JSHandle handleEcmaStr1(resultString1); EXPECT_STREQ("[null]", EcmaStringAccessor(handleEcmaStr1).ToCString().c_str()); } } // namespace panda::test