diff --git a/ecmascript/tests/BUILD.gn b/ecmascript/tests/BUILD.gn old mode 100644 new mode 100755 index 17f523f5aa7b7b3f7c7aaefdf1023c7abad079be..fb310c0b78b3e620db102968c6c7ae300eba1db7 --- a/ecmascript/tests/BUILD.gn +++ b/ecmascript/tests/BUILD.gn @@ -83,6 +83,28 @@ host_unittest_action("DumpTest") { ] } +host_unittest_action("EcmaStringTest") { + module_out_path = module_output_path + + sources = [ + # test file + "ecma_string_test.cpp", + ] + + configs = [ + "//ark/js_runtime:ecma_test_config", + "//ark/js_runtime:ark_jsruntime_public_config", # should add before + # arkruntime_public_config + "//ark/js_runtime:ark_jsruntime_config", + "$ark_root/runtime:arkruntime_public_config", + ] + + deps = [ + "$ark_root/libpandabase:libarkbase", + sdk_libc_secshared_dep, + ] +} + host_unittest_action("GlueRegsTest") { module_out_path = module_output_path @@ -684,6 +706,7 @@ group("unittest") { ":AssertScopeTest", ":BuiltinsTest", ":DumpTest", + ":EcmaStringTest", ":GcTest", ":GlueRegsTest", ":HugeObjectTest", @@ -719,35 +742,36 @@ group("host_unittest") { # deps file deps = [ - ":AssertScopeTestAction", - ":BuiltinsTestAction", - ":DumpTestAction", - ":GcTestAction", - ":GlueRegsTestAction", - ":HugeObjectTestAction", - ":JsArrayTestAction", - ":JsDateTestAction", - ":JsForinIteratorTestAction", - ":JsFunctionTestAction", - ":JsHandleTestAction", - ":JsIteratorTestAction", - ":JsMapTestAction", - ":JsObjectTestAction", - ":JsPrimitiveRefTestAction", - ":JsPromiseTestAction", - ":JsProxyTestAction", - ":JsSerializerTestAction", - ":JsSetTestAction", - ":JsSymbolTestAction", - ":JsTaggedQueueTestAction", - ":JsVerificationTestAction", - ":LexicalEnvTestAction", - ":LinkedHashTableTestAction", - ":NameDictionaryTestAction", - ":NativePointerTestAction", - ":ObjectFactoryTestAction", - ":TaggedValueTestAction", - ":WeakRefGenGcTestAction", - ":WeakRefStwGcTestAction", + ":AssertScopeTestAction(${host_toolchain})", + ":BuiltinsTestAction(${host_toolchain})", + ":DumpTestAction(${host_toolchain})", + ":EcmaStringTestAction(${host_toolchain})", + ":GcTestAction(${host_toolchain})", + ":GlueRegsTestAction(${host_toolchain})", + ":HugeObjectTestAction(${host_toolchain})", + ":JsArrayTestAction(${host_toolchain})", + ":JsDateTestAction(${host_toolchain})", + ":JsForinIteratorTestAction(${host_toolchain})", + ":JsFunctionTestAction(${host_toolchain})", + ":JsHandleTestAction(${host_toolchain})", + ":JsIteratorTestAction(${host_toolchain})", + ":JsMapTestAction(${host_toolchain})", + ":JsObjectTestAction(${host_toolchain})", + ":JsPrimitiveRefTestAction(${host_toolchain})", + ":JsPromiseTestAction(${host_toolchain})", + ":JsProxyTestAction(${host_toolchain})", + ":JsSerializerTestAction(${host_toolchain})", + ":JsSetTestAction(${host_toolchain})", + ":JsSymbolTestAction(${host_toolchain})", + ":JsTaggedQueueTestAction(${host_toolchain})", + ":JsVerificationTestAction(${host_toolchain})", + ":LexicalEnvTestAction(${host_toolchain})", + ":LinkedHashTableTestAction(${host_toolchain})", + ":NameDictionaryTestAction(${host_toolchain})", + ":NativePointerTestAction(${host_toolchain})", + ":ObjectFactoryTestAction(${host_toolchain})", + ":TaggedValueTestAction(${host_toolchain})", + ":WeakRefGenGcTestAction(${host_toolchain})", + ":WeakRefStwGcTestAction(${host_toolchain})", ] } diff --git a/ecmascript/tests/ecma_string_test.cpp b/ecmascript/tests/ecma_string_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b119255c06864d38d5eb23d626d92e58163d0a3b --- /dev/null +++ b/ecmascript/tests/ecma_string_test.cpp @@ -0,0 +1,1042 @@ +/* + * Copyright (c) 2021 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/ecma_string-inl.h" + #include "ecmascript/tests/test_helper.h" + + using namespace panda::ecmascript; + + namespace panda::test { +class EcmaStringTest : public testing::Test { +public: + static void SetUpTestCase() + { + GTEST_LOG_(INFO) << "SetUpTestCase"; + } + + static void TesrDownTestCase() + { + GTEST_LOG_(INFO) << "TearDownCase"; + } + + void SetUp() override + { + TestHelper::CreateEcmaVMWithScope(instance, thread, scope); + } + + void TearDown() override + { + TestHelper::DestroyEcmaVMWithScope(instance, scope); + } + PandaVM *instance {nullptr}; + ecmascript::EcmaHandleScope *scope {nullptr}; + JSThread *thread {nullptr}; +}; + +HWTEST_F_L0(EcmaStringTest, SetCompressedStringsEnabled) +{ + EXPECT_TRUE(EcmaString::GetCompressedStringsEnabled()); + EcmaString::SetCompressedStringsEnabled(false); + EXPECT_FALSE(EcmaString::GetCompressedStringsEnabled()); + EcmaString::SetCompressedStringsEnabled(true); + EXPECT_TRUE(EcmaString::GetCompressedStringsEnabled()); +} + +HWTEST_F_L0(EcmaStringTest, CanBeCompressed) +{ + uint8_t arrayU8[7] = {12, 34, 77, 127, 99, 1}; + uint16_t arrayU16Comp[] = {1, 4, 37, 91, 127, 1}; + uint16_t arrayU16NotComp[] = {72, 43, 337, 961, 1317, 65535}; + EXPECT_TRUE(EcmaString::CanBeCompressed(arrayU8)); + EXPECT_TRUE(EcmaString::CanBeCompressed(arrayU16Comp, sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]))); + EXPECT_FALSE(EcmaString::CanBeCompressed(arrayU16NotComp, sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]))); + + EcmaString::SetCompressedStringsEnabled(false); // Set compressedStringsEnabled false. + EXPECT_FALSE(EcmaString::CanBeCompressed(arrayU16NotComp, sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]))); + /* Set compressedStringsEnabled default, because it is a static boolean that some other functions rely on.The foll- + * owing HWTEST_F_L0 will come to an unexpected result if we do not set it default in the end of this HWTEST_F_L0. + */ + EcmaString::SetCompressedStringsEnabled(true); // Set compressedStringsEnabled true(default). +} + +HWTEST_F_L0(EcmaStringTest, CreateEmptyString) +{ + EcmaVM *ecmaVMPtr = EcmaVM::Cast(instance); + + EcmaString *ecmaStrEmptyPtr = EcmaString::CreateEmptyString(ecmaVMPtr); + EXPECT_EQ(ecmaStrEmptyPtr->GetLength(), 0); + EXPECT_TRUE(ecmaStrEmptyPtr->IsUtf8()); + EXPECT_FALSE(ecmaStrEmptyPtr->IsUtf16()); + + EcmaString::SetCompressedStringsEnabled(false); // Set compressedStringsEnabled false. + EcmaString *ecmaStrEmptyNotCompPtr = EcmaString::CreateEmptyString(ecmaVMPtr); + EXPECT_EQ(ecmaStrEmptyNotCompPtr->GetLength(), 0); + EXPECT_TRUE(ecmaStrEmptyNotCompPtr->IsUtf16()); + EcmaString::SetCompressedStringsEnabled(true); // Set compressedStringsEnabled true(default). +} + +HWTEST_F_L0(EcmaStringTest, AllocStringObject) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // AllocStringObject( , true, ). + size_t sizeAllocComp = 5; + EcmaString *ecmaStrAllocCompPtr = EcmaString::AllocStringObject(sizeAllocComp, true, ecmaVMPtr); + for (int i = 0; i < sizeAllocComp; i++) { + EXPECT_EQ(ecmaStrAllocCompPtr->At(i), 0); + } + EXPECT_EQ(ecmaStrAllocCompPtr->GetLength(), sizeAllocComp); + EXPECT_TRUE(ecmaStrAllocCompPtr->IsUtf8()); + EXPECT_FALSE(ecmaStrAllocCompPtr->IsUtf16()); + + // AllocStringObject( , false, ). + size_t sizeAllocNotComp = 5; + EcmaString *ecmaStrAllocNotCompPtr = EcmaString::AllocStringObject(sizeAllocNotComp, false, ecmaVMPtr); + for (int i = 0; i < sizeAllocNotComp; i++) { + EXPECT_EQ(ecmaStrAllocNotCompPtr->At(i), 0); + } + EXPECT_EQ(ecmaStrAllocNotCompPtr->GetLength(), sizeAllocNotComp); + EXPECT_FALSE(ecmaStrAllocNotCompPtr->IsUtf8()); + EXPECT_TRUE(ecmaStrAllocNotCompPtr->IsUtf16()); + EcmaString::SetCompressedStringsEnabled(false); // Set compressedStringsEnabled false. + EXPECT_TRUE(ecmaStrAllocNotCompPtr->IsUtf16()); + EcmaString::SetCompressedStringsEnabled(true); // Set compressedStringsEnabled true(default). +} + +HWTEST_F_L0(EcmaStringTest, CreateFromUtf8) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + uint8_t arrayU8[] = {"xyz123!@#"}; + size_t lengthEcmaStrU8 = sizeof(arrayU8) - 1; + EcmaString *ecmaStrU8Ptr = EcmaString::CreateFromUtf8(&arrayU8[0], lengthEcmaStrU8, ecmaVMPtr, true); + for (int i = 0; i < lengthEcmaStrU8; i++) { + EXPECT_EQ(arrayU8[i], ecmaStrU8Ptr->At(i)); + } + EXPECT_EQ(ecmaStrU8Ptr->GetLength(), lengthEcmaStrU8); + EXPECT_TRUE(ecmaStrU8Ptr->IsUtf8()); + EXPECT_FALSE(ecmaStrU8Ptr->IsUtf16()); +} + +HWTEST_F_L0(EcmaStringTest, CreateFromUtf16) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // CreateFromUtf16( , , , true). + uint16_t arrayU16Comp[] = {1, 23, 45, 67, 127}; + size_t lengthEcmaStrU16Comp = sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]); + EcmaString *ecmaStrU16CompPtr = EcmaString::CreateFromUtf16(&arrayU16Comp[0], lengthEcmaStrU16Comp, ecmaVMPtr, + true); + EXPECT_EQ(ecmaStrU16CompPtr->GetLength(), lengthEcmaStrU16Comp); + EXPECT_TRUE(ecmaStrU16CompPtr->IsUtf8()); + EXPECT_FALSE(ecmaStrU16CompPtr->IsUtf16()); + + // CreateFromUtf16( , , , false). + uint16_t arrayU16NotComp[] = {127, 33, 128, 12, 256, 11100, 65535}; + size_t lengthEcmaStrU16NotComp = sizeof(arrayU16NotComp) / sizeof(arrayU16NotComp[0]); + EcmaString *ecmaStrU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayU16NotComp[0], lengthEcmaStrU16NotComp, + ecmaVMPtr, false); + EXPECT_EQ(ecmaStrU16NotCompPtr->GetLength(), lengthEcmaStrU16NotComp); + EXPECT_FALSE(ecmaStrU16NotCompPtr->IsUtf8()); + EXPECT_TRUE(ecmaStrU16NotCompPtr->IsUtf16()); + EcmaString::SetCompressedStringsEnabled(false); // Set compressedStringsEnabled false. + EXPECT_TRUE(ecmaStrU16NotCompPtr->IsUtf16()); + EcmaString::SetCompressedStringsEnabled(true); // Set compressedStringsEnabled true(default). +} + +HWTEST_F_L0(EcmaStringTest, ComputeSizeUtf8) +{ + uint32_t scale = 3333; + for (uint32_t i = 0x40000000U - 1; i > scale; i = i - scale) { + uint32_t length = i; + EXPECT_EQ(EcmaString::ComputeSizeUtf8(length), length + sizeof(EcmaString)); + } +} + +HWTEST_F_L0(EcmaStringTest, ComputeDataSizeUtf16) +{ + uint32_t scale = 3333; + for (uint32_t i = 0x40000000U - 1; i > scale; i = i - scale) { + uint32_t length = i; + EXPECT_EQ(EcmaString::ComputeDataSizeUtf16(length), 2 * length); + } +} + +HWTEST_F_L0(EcmaStringTest, ComputeSizeUtf16) +{ + uint32_t scale = 3333; + for (uint32_t i = 0x40000000U - 1; i > scale; i = i - scale) { + uint32_t length = i; + EXPECT_EQ(EcmaString::ComputeSizeUtf16(length), 2 * length + sizeof(EcmaString)); + } +} + +HWTEST_F_L0(EcmaStringTest, ObjectSize) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + EcmaString *ecmaStrEmptyPtr = EcmaString::CreateEmptyString(ecmaVMPtr); + EXPECT_EQ(ecmaStrEmptyPtr->ObjectSize(), sizeof(EcmaString) + 0); + + size_t lengthEcmaStrAllocComp = 5; + EcmaString *ecmaStrAllocCompPtr = EcmaString::AllocStringObject(lengthEcmaStrAllocComp, true, ecmaVMPtr); + EXPECT_EQ(ecmaStrAllocCompPtr->ObjectSize(), sizeof(EcmaString) + sizeof(uint8_t) * lengthEcmaStrAllocComp); + + size_t lengthEcmaStrAllocNotComp = 5; + EcmaString *ecmaStrAllocNotCompPtr = EcmaString::AllocStringObject(lengthEcmaStrAllocNotComp, false, ecmaVMPtr); + EXPECT_EQ(ecmaStrAllocNotCompPtr->ObjectSize(), sizeof(EcmaString) + sizeof(uint16_t) * lengthEcmaStrAllocNotComp); + + uint8_t arrayU8[] = {"abcde"}; + size_t lengthEcmaStrU8 = sizeof(arrayU8) - 1; + EcmaString *ecmaStrU8Ptr = EcmaString::CreateFromUtf8(&arrayU8[0], lengthEcmaStrU8, ecmaVMPtr, true); + EXPECT_EQ(ecmaStrU8Ptr->ObjectSize(), sizeof(EcmaString) + sizeof(uint8_t) * lengthEcmaStrU8); + + // ObjectSize(). EcmaString made by CreateFromUtf16( , , , true). + uint16_t arrayU16Comp[] = {1, 23, 45, 67, 127}; + size_t lengthEcmaStrU16Comp = sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]); + EcmaString *ecmaStrU16CompPtr = EcmaString::CreateFromUtf16(&arrayU16Comp[0], lengthEcmaStrU16Comp, ecmaVMPtr, + true); + EXPECT_EQ(ecmaStrU16CompPtr->ObjectSize(), sizeof(EcmaString) + sizeof(uint8_t) * lengthEcmaStrU16Comp); + + // ObjectSize(). EcmaString made by CreateFromUtf16( , , , false). + uint16_t arrayU16NotComp[] = {127, 128, 256, 11100, 65535}; + size_t lengthEcmaStrU16NotComp = sizeof(arrayU16NotComp) / sizeof(arrayU16NotComp[0]); + EcmaString *ecmaStrU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayU16NotComp[0], lengthEcmaStrU16NotComp, + ecmaVMPtr, false); + EXPECT_EQ(ecmaStrU16NotCompPtr->ObjectSize(), sizeof(EcmaString) + sizeof(uint16_t) * lengthEcmaStrU16NotComp); +} + +HWTEST_F_L0(EcmaStringTest, Compare) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // Compare(). Between EcmaString made by CreateFromUtf8(). + uint8_t arrayU8No1[3] = {1, 23}; + uint8_t arrayU8No2[4] = {1, 23, 49}; + uint8_t arrayU8No3[6] = {1, 23, 45, 97, 127}; + uint32_t lengthEcmaStrU8No1 = sizeof(arrayU8No1) - 1; + uint32_t lengthEcmaStrU8No2 = sizeof(arrayU8No2) - 1; + uint32_t lengthEcmaStrU8No3 = sizeof(arrayU8No3) - 1; + EcmaString *ecmaStrU8PtrNo1 = EcmaString::CreateFromUtf8(&arrayU8No1[0], lengthEcmaStrU8No1, ecmaVMPtr, true); + EcmaString *ecmaStrU8PtrNo2 = EcmaString::CreateFromUtf8(&arrayU8No2[0], lengthEcmaStrU8No2, ecmaVMPtr, true); + EcmaString *ecmaStrU8PtrNo3 = EcmaString::CreateFromUtf8(&arrayU8No3[0], lengthEcmaStrU8No3, ecmaVMPtr, true); + EXPECT_EQ(ecmaStrU8PtrNo1->Compare(ecmaStrU8PtrNo2), -1); + EXPECT_EQ(ecmaStrU8PtrNo2->Compare(ecmaStrU8PtrNo1), 1); + EXPECT_EQ(ecmaStrU8PtrNo2->Compare(ecmaStrU8PtrNo3), 49 - 45); + EXPECT_EQ(ecmaStrU8PtrNo3->Compare(ecmaStrU8PtrNo2), 45 - 49); + + // Compare(). Between EcmaString made by CreateFromUtf16( , , , true). + uint16_t arrayU16CompNo1[] = {1, 23}; + uint16_t arrayU16CompNo2[] = {1, 23, 49}; + uint16_t arrayU16CompNo3[] = {1, 23, 45, 97, 127}; + uint32_t lengthEcmaStrU16CompNo1 = sizeof(arrayU16CompNo1) / sizeof(arrayU16CompNo1[0]); + uint32_t lengthEcmaStrU16CompNo2 = sizeof(arrayU16CompNo2) / sizeof(arrayU16CompNo2[0]); + uint32_t lengthEcmaStrU16CompNo3 = sizeof(arrayU16CompNo3) / sizeof(arrayU16CompNo3[0]); + EcmaString *ecmaStrU16CompPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16CompNo1[0], lengthEcmaStrU16CompNo1, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16CompNo2[0], lengthEcmaStrU16CompNo2, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo3 = EcmaString::CreateFromUtf16(&arrayU16CompNo3[0], lengthEcmaStrU16CompNo3, + ecmaVMPtr, true); + EXPECT_EQ(ecmaStrU16CompPtrNo1->Compare(ecmaStrU16CompPtrNo2), -1); + EXPECT_EQ(ecmaStrU16CompPtrNo2->Compare(ecmaStrU16CompPtrNo1), 1); + EXPECT_EQ(ecmaStrU16CompPtrNo2->Compare(ecmaStrU16CompPtrNo3), 49 - 45); + EXPECT_EQ(ecmaStrU16CompPtrNo3->Compare(ecmaStrU16CompPtrNo2), 45 - 49); + + // Compare(). EcmaString made by CreateFromUtf8() and EcmaString made by CreateFromUtf16( , , , true). + EXPECT_EQ(ecmaStrU8PtrNo1->Compare(ecmaStrU16CompPtrNo1), 0); + EXPECT_EQ(ecmaStrU16CompPtrNo1->Compare(ecmaStrU8PtrNo1), 0); + EXPECT_EQ(ecmaStrU8PtrNo1->Compare(ecmaStrU16CompPtrNo2), -1); + EXPECT_EQ(ecmaStrU16CompPtrNo2->Compare(ecmaStrU8PtrNo1), 1); + EXPECT_EQ(ecmaStrU8PtrNo2->Compare(ecmaStrU16CompPtrNo3), 49 - 45); + EXPECT_EQ(ecmaStrU16CompPtrNo3->Compare(ecmaStrU8PtrNo2), 45 - 49); + + // Compare(). Between EcmaString made by CreateFromUtf16( , , , false). + uint16_t arrayU16NotCompNo1[] = {1, 23}; + uint16_t arrayU16NotCompNo2[] = {1, 23, 49}; + uint16_t arrayU16NotCompNo3[] = {1, 23, 456, 6789, 65535, 127}; + uint32_t lengthEcmaStrU16NotCompNo1 = sizeof(arrayU16NotCompNo1) / sizeof(arrayU16NotCompNo1[0]); + uint32_t lengthEcmaStrU16NotCompNo2 = sizeof(arrayU16NotCompNo2) / sizeof(arrayU16NotCompNo2[0]); + uint32_t lengthEcmaStrU16NotCompNo3 = sizeof(arrayU16NotCompNo3) / sizeof(arrayU16NotCompNo3[0]); + EcmaString *ecmaStrU16NotCompPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo2[0], + lengthEcmaStrU16NotCompNo2, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo3 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo3[0], + lengthEcmaStrU16NotCompNo3, ecmaVMPtr, false); + EXPECT_EQ(ecmaStrU16NotCompPtrNo1->Compare(ecmaStrU16NotCompPtrNo2), -1); + EXPECT_EQ(ecmaStrU16NotCompPtrNo2->Compare(ecmaStrU16NotCompPtrNo1), 1); + EXPECT_EQ(ecmaStrU16NotCompPtrNo2->Compare(ecmaStrU16NotCompPtrNo3), 49 - 456); + EXPECT_EQ(ecmaStrU16NotCompPtrNo3->Compare(ecmaStrU16NotCompPtrNo2), 456 - 49); + + // Compare(). EcmaString made by CreateFromUtf8() and EcmaString made by CreateFromUtf16( , , , false). + EXPECT_EQ(ecmaStrU8PtrNo1->Compare(ecmaStrU16NotCompPtrNo1), 0); + EXPECT_EQ(ecmaStrU16NotCompPtrNo1->Compare(ecmaStrU8PtrNo1), 0); + EXPECT_EQ(ecmaStrU8PtrNo1->Compare(ecmaStrU16NotCompPtrNo2), -1); + EXPECT_EQ(ecmaStrU16NotCompPtrNo2->Compare(ecmaStrU8PtrNo1), 1); + EXPECT_EQ(ecmaStrU8PtrNo2->Compare(ecmaStrU16NotCompPtrNo3), 49 - 456); + EXPECT_EQ(ecmaStrU16NotCompPtrNo3->Compare(ecmaStrU8PtrNo2), 456 - 49); + + // Compare(). EcmaString made by CreateFromUtf16( , , , true) and EcmaString made by CreateFromUtf16( , , , false). + EXPECT_EQ(ecmaStrU16CompPtrNo1->Compare(ecmaStrU16NotCompPtrNo1), 0); + EXPECT_EQ(ecmaStrU16NotCompPtrNo1->Compare(ecmaStrU16CompPtrNo1), 0); + EXPECT_EQ(ecmaStrU16CompPtrNo1->Compare(ecmaStrU16NotCompPtrNo2), -1); + EXPECT_EQ(ecmaStrU16NotCompPtrNo2->Compare(ecmaStrU16CompPtrNo1), 1); + EXPECT_EQ(ecmaStrU16CompPtrNo2->Compare(ecmaStrU16NotCompPtrNo3), 49 - 456); + EXPECT_EQ(ecmaStrU16NotCompPtrNo3->Compare(ecmaStrU16CompPtrNo2), 456 - 49); +} + +HWTEST_F_L0(EcmaStringTest, Concat) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // Concat(). EcmaString made by CreateFromUtf8() and EcmaString made by CreateFromUtf8(). + uint8_t arrayFrontU8[] = {"abcdef"}; + uint8_t arrayBackU8[] = {"ABCDEF"}; + uint32_t lengthEcmaStrFrontU8 = sizeof(arrayFrontU8) - 1; + uint32_t lengthEcmaStrBackU8 = sizeof(arrayBackU8) - 1; + EcmaString *ecmaStrFrontU8Ptr = EcmaString::CreateFromUtf8(&arrayFrontU8[0], lengthEcmaStrFrontU8, ecmaVMPtr, + true); + EcmaString *ecmaStrBackU8Ptr = EcmaString::CreateFromUtf8(&arrayBackU8[0], lengthEcmaStrBackU8, ecmaVMPtr, true); + JSHandle handle_ecmaStrFrontU8Ptr(thread, ecmaStrFrontU8Ptr); + JSHandle handle_ecmaStrBackU8Ptr(thread, ecmaStrBackU8Ptr); + EcmaString *ecmaStrConcatU8Ptr = EcmaString::Concat(handle_ecmaStrFrontU8Ptr, handle_ecmaStrBackU8Ptr, ecmaVMPtr); + EXPECT_TRUE(ecmaStrConcatU8Ptr->IsUtf8()); + for (int i = 0; i < lengthEcmaStrFrontU8; i++) { + EXPECT_EQ(ecmaStrConcatU8Ptr->At(i), arrayFrontU8[i]); + } + for (int i = 0; i < lengthEcmaStrBackU8; i++) { + EXPECT_EQ(ecmaStrConcatU8Ptr->At(i + lengthEcmaStrFrontU8), arrayBackU8[i]); + } + EXPECT_EQ(ecmaStrConcatU8Ptr->GetLength(), lengthEcmaStrFrontU8 + lengthEcmaStrBackU8); + + // Concat(). EcmaString made by CreateFromUtf16( , , , false) and EcmaString made by CreateFromUtf16( , , , false). + uint16_t arrayFrontU16NotComp[] = {128, 129, 256, 11100, 65535, 100}; + uint16_t arrayBackU16NotComp[] = {88, 768, 1, 270, 345, 333}; + uint32_t lengthEcmaStrFrontU16NotComp = sizeof(arrayFrontU16NotComp) / sizeof(arrayFrontU16NotComp[0]); + uint32_t lengthEcmaStrBackU16NotComp = sizeof(arrayBackU16NotComp) / sizeof(arrayBackU16NotComp[0]); + EcmaString *ecmaStrFrontU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayFrontU16NotComp[0], + lengthEcmaStrFrontU16NotComp, ecmaVMPtr, false); + EcmaString *ecmaStrBackU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayBackU16NotComp[0], + lengthEcmaStrBackU16NotComp, ecmaVMPtr, false); + JSHandle handle_ecmaStrFrontU16NotCompPtr(thread, ecmaStrFrontU16NotCompPtr); + JSHandle handle_ecmaStrBackU16NotCompPtr(thread, ecmaStrBackU16NotCompPtr); + EcmaString *ecmaStrConcatU16NotCompPtr = EcmaString::Concat(handle_ecmaStrFrontU16NotCompPtr, + handle_ecmaStrBackU16NotCompPtr, ecmaVMPtr); + EXPECT_TRUE(ecmaStrConcatU16NotCompPtr->IsUtf16()); + for (int i = 0; i < lengthEcmaStrFrontU16NotComp; i++) { + EXPECT_EQ(ecmaStrConcatU16NotCompPtr->At(i), arrayFrontU16NotComp[i]); + } + for (int i = 0; i < lengthEcmaStrBackU16NotComp; i++) { + EXPECT_EQ(ecmaStrConcatU16NotCompPtr->At(i + lengthEcmaStrFrontU16NotComp), arrayBackU16NotComp[i]); + } + EXPECT_EQ(ecmaStrConcatU16NotCompPtr->GetLength(), lengthEcmaStrFrontU16NotComp + lengthEcmaStrBackU16NotComp); + + /* Concat() after SetCompressedStringsEnabled(false). EcmaString made by CreateFromUtf16( , , , false) and + * EcmaString made by CreateFromUtf16( , , , false). + */ + EcmaString::SetCompressedStringsEnabled(false); // Set compressedStringsEnabled false. + EcmaString *ecmaStrConcatU16NotCompAfterSetFalsePtr = EcmaString::Concat(handle_ecmaStrFrontU16NotCompPtr, + handle_ecmaStrBackU16NotCompPtr, ecmaVMPtr); + EXPECT_TRUE(ecmaStrConcatU16NotCompAfterSetFalsePtr->IsUtf16()); + for (int i = 0; i < lengthEcmaStrFrontU16NotComp; i++) { + EXPECT_EQ(ecmaStrConcatU16NotCompAfterSetFalsePtr->At(i), arrayFrontU16NotComp[i]); + } + for (int i = 0; i < lengthEcmaStrBackU16NotComp; i++) { + EXPECT_EQ(ecmaStrConcatU16NotCompAfterSetFalsePtr->At(i + lengthEcmaStrFrontU16NotComp), + arrayBackU16NotComp[i]); + } + EXPECT_EQ(ecmaStrConcatU16NotCompAfterSetFalsePtr->GetLength(), + lengthEcmaStrFrontU16NotComp + lengthEcmaStrBackU16NotComp); + EcmaString::SetCompressedStringsEnabled(true); // Set compressedStringsEnabled true(default). + + // Concat(). EcmaString made by CreateFromUtf8() and EcmaString made by CreateFromUtf16( , , , false). + EcmaString *ecmaStrConcatU8U16NotCompPtr = EcmaString::Concat(handle_ecmaStrFrontU8Ptr, + handle_ecmaStrBackU16NotCompPtr, ecmaVMPtr); + EXPECT_TRUE(ecmaStrConcatU8U16NotCompPtr->IsUtf16()); + for (int i = 0; i < lengthEcmaStrFrontU8; i++) { + EXPECT_EQ(ecmaStrConcatU8U16NotCompPtr->At(i), arrayFrontU8[i]); + } + for (int i = 0; i < lengthEcmaStrBackU16NotComp; i++) { + EXPECT_EQ(ecmaStrConcatU8U16NotCompPtr->At(i + lengthEcmaStrFrontU8), arrayBackU16NotComp[i]); + } + EXPECT_EQ(ecmaStrConcatU8U16NotCompPtr->GetLength(), lengthEcmaStrFrontU8 + lengthEcmaStrBackU16NotComp); +} + +HWTEST_F_L0(EcmaStringTest, FastSubString) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + uint8_t arrayU8[6] = {3, 7, 19, 54, 99}; + uint16_t arrayU16Comp[] = {1, 12, 34, 56, 127}; + uint16_t arrayU16NotComp[] = {19, 54, 256, 11100, 65535}; + uint32_t lengthEcmaStrU8 = sizeof(arrayU8) - 1; + uint32_t lengthEcmaStrU16Comp = sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]); + uint32_t lengthEcmaStrU16NotComp = sizeof(arrayU16NotComp) / sizeof(arrayU16NotComp[0]); + EcmaString *ecmaStrU8Ptr = EcmaString::CreateFromUtf8(&arrayU8[0], lengthEcmaStrU8, ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtr = EcmaString::CreateFromUtf16(&arrayU16Comp[0], lengthEcmaStrU16Comp, ecmaVMPtr, + true); + EcmaString *ecmaStrU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayU16NotComp[0], lengthEcmaStrU16NotComp, + ecmaVMPtr, false); + JSHandle handle_ecmaStrU8Ptr(thread, ecmaStrU8Ptr); + JSHandle handle_ecmaStrU16CompPtr(thread, ecmaStrU16CompPtr); + JSHandle handle_ecmaStrU16NotCompPtr(thread, ecmaStrU16NotCompPtr); + uint32_t indexStartSubU8 = 2; + uint32_t lengthSubU8 = 2; + uint32_t indexStartSubU16Comp = 0; + uint32_t lengthSubU16Comp = 2; + uint32_t indexStartSubU16NotComp = 0; + uint32_t lengthSubU16NotComp = 2; + + // FastSubString(). From EcmaString made by CreateFromUtf8(). + EcmaString *ecmaStrSubU8Ptr = EcmaString::FastSubString(handle_ecmaStrU8Ptr, indexStartSubU8, lengthSubU8, + ecmaVMPtr); + for (int i = 0; i < lengthSubU8; i++) { + EXPECT_EQ(ecmaStrSubU8Ptr->At(i), ecmaStrU8Ptr->At(i + indexStartSubU8)); + } + EXPECT_EQ(ecmaStrSubU8Ptr->GetLength(), lengthSubU8); + + // FastSubString(). From EcmaString made by CreateFromUtf16( , , , true). + EcmaString *ecmaStrSubU16CompPtr = EcmaString::FastSubString(handle_ecmaStrU16CompPtr, indexStartSubU16Comp, + lengthSubU16Comp, ecmaVMPtr); + for (int i = 0; i < lengthSubU16Comp; i++) { + EXPECT_EQ(ecmaStrSubU16CompPtr->At(i), ecmaStrU16CompPtr->At(i + indexStartSubU16Comp)); + } + EXPECT_EQ(ecmaStrSubU16CompPtr->GetLength(), lengthSubU16Comp); + + // FastSubString(). From EcmaString made by CreateFromUtf16( , , , false). + EcmaString *ecmaStrSubU16NotCompPtr = EcmaString::FastSubString(handle_ecmaStrU16NotCompPtr, + indexStartSubU16NotComp, lengthSubU16NotComp, ecmaVMPtr); + for (int i = 0; i < lengthSubU16NotComp; i++) { + EXPECT_EQ(ecmaStrSubU16NotCompPtr->At(i), ecmaStrU16NotCompPtr->At(i + indexStartSubU16NotComp)); + } + EXPECT_EQ(ecmaStrSubU16NotCompPtr->GetLength(), lengthSubU16NotComp); +} + +HWTEST_F_L0(EcmaStringTest, WriteData) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // WriteData(). From EcmaString made by CreateFromUtf8() to EcmaString made by AllocStringObject( , true, ). + uint8_t arrayU8WriteFrom[6] = {1, 12, 34, 56, 127}; + uint32_t lengthEcmaStrU8WriteFrom = sizeof(arrayU8WriteFrom) - 1; + EcmaString *ecmaStrU8WriteFromPtr = EcmaString::CreateFromUtf8(&arrayU8WriteFrom[0], lengthEcmaStrU8WriteFrom, + ecmaVMPtr, true); + size_t sizeEcmaStrU8WriteTo = 5; + EcmaString *ecmaStrAllocTrueWriteToPtr = EcmaString::AllocStringObject(sizeEcmaStrU8WriteTo, true, ecmaVMPtr); + uint32_t indexStartWriteFromArrayU8 = 2; + uint32_t lengthWriteFromArrayU8 = 2; + ecmaStrAllocTrueWriteToPtr->WriteData(ecmaStrU8WriteFromPtr, indexStartWriteFromArrayU8, sizeEcmaStrU8WriteTo, + lengthWriteFromArrayU8); + for (int i = 0; i < lengthWriteFromArrayU8; i++) { + EXPECT_EQ(ecmaStrAllocTrueWriteToPtr->At(i + indexStartWriteFromArrayU8), ecmaStrU8WriteFromPtr->At(i)); + } + + // WriteData(). From char to EcmaString made by AllocStringObject( , true, ). + char u8Write = 'a'; + uint32_t indexAtWriteFromU8 = 4; + ecmaStrAllocTrueWriteToPtr->WriteData(u8Write, indexAtWriteFromU8); + EXPECT_EQ(ecmaStrAllocTrueWriteToPtr->At(indexAtWriteFromU8), u8Write); + + /* WriteData(). From EcmaString made by CreateFromUtf16( , , , false) to EcmaStringU16 made by + * AllocStringObject( , false, ). + */ + uint16_t arrayU16WriteFrom[10] = {67, 777, 1999, 1, 45, 66, 23456, 65535, 127, 333}; + uint32_t lengthEcmaStrU16WriteFrom = sizeof(arrayU16WriteFrom) / sizeof(arrayU16WriteFrom[0]); + EcmaString *ecmaStrU16WriteFromPtr = EcmaString::CreateFromUtf16(&arrayU16WriteFrom[0], lengthEcmaStrU16WriteFrom, + ecmaVMPtr, false); + size_t sizeEcmaStrU16WriteTo = 10; + EcmaString *ecmaStrU16WriteToPtr = EcmaString::AllocStringObject(sizeEcmaStrU16WriteTo, false, ecmaVMPtr); + uint32_t indexStartWriteFromArrayU16 = 3; + uint32_t numBytesWriteFromArrayU16 = 2 * 3; + ecmaStrU16WriteToPtr->WriteData(ecmaStrU16WriteFromPtr, indexStartWriteFromArrayU16, sizeEcmaStrU16WriteTo, + numBytesWriteFromArrayU16); + for (int i = 0; i < (numBytesWriteFromArrayU16 / 2); i++) { + EXPECT_EQ(ecmaStrU16WriteToPtr->At(i + indexStartWriteFromArrayU16), ecmaStrU16WriteFromPtr->At(i)); + } + + // WriteData(). From EcmaString made by CreateFromUtf8() to EcmaString made by AllocStringObject( , false, ). + uint32_t indexStartWriteFromU8ToU16 = 1; + uint32_t numBytesWriteFromU8ToU16 = 4; + ecmaStrU16WriteToPtr->WriteData(ecmaStrU8WriteFromPtr, indexStartWriteFromU8ToU16, sizeEcmaStrU16WriteTo, + numBytesWriteFromU8ToU16); + for (int i = 0; i < numBytesWriteFromU8ToU16; i++) { + EXPECT_EQ(ecmaStrU16WriteToPtr->At(i + indexStartWriteFromU8ToU16), ecmaStrU8WriteFromPtr->At(i)); + } + + // WriteData(). From char to EcmaString made by AllocStringObject( , false, ). + ecmaStrU16WriteToPtr->WriteData(u8Write, indexAtWriteFromU8); + EXPECT_EQ(ecmaStrU16WriteToPtr->At(indexAtWriteFromU8), u8Write); +} + +HWTEST_F_L0(EcmaStringTest, GetUtf8Length) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + uint8_t arrayU8[6] = {3, 7, 19, 54, 99}; + uint16_t arrayU16Comp[] = {1, 12, 34, 56, 127}; + uint16_t arrayU16NotComp[] = {19, 54, 256, 11100, 65535}; + uint32_t lengthEcmaStrU8 = sizeof(arrayU8) - 1; + uint32_t lengthEcmaStrU16Comp = sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]); + uint32_t lengthEcmaStrU16NotComp = sizeof(arrayU16NotComp) / sizeof(arrayU16NotComp[0]); + EcmaString *ecmaStrU8Ptr = EcmaString::CreateFromUtf8(&arrayU8[0], lengthEcmaStrU8, ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtr = EcmaString::CreateFromUtf16(&arrayU16Comp[0], lengthEcmaStrU16Comp, ecmaVMPtr, + true); + EcmaString *ecmaStrU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayU16NotComp[0], lengthEcmaStrU16NotComp, + ecmaVMPtr, false); + + EXPECT_EQ(ecmaStrU8Ptr->GetUtf8Length(), lengthEcmaStrU8 + 1); + EXPECT_EQ(ecmaStrU16CompPtr->GetUtf8Length(), lengthEcmaStrU16Comp + 1); + EXPECT_EQ(ecmaStrU16NotCompPtr->GetUtf8Length(), 2 * lengthEcmaStrU16NotComp + 1); +} + +HWTEST_F_L0(EcmaStringTest, GetUtf16Length) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + uint8_t arrayU8[6] = {3, 7, 19, 54, 99}; + uint16_t arrayU16Comp[] = {1, 12, 34, 56, 127}; + uint16_t arrayU16NotComp[] = {19, 54, 256, 11100, 65535}; + uint32_t lengthEcmaStrU8 = sizeof(arrayU8) - 1; + uint32_t lengthEcmaStrU16Comp = sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]); + uint32_t lengthEcmaStrU16NotComp = sizeof(arrayU16NotComp) / sizeof(arrayU16NotComp[0]); + EcmaString *ecmaStrU8Ptr = EcmaString::CreateFromUtf8(&arrayU8[0], lengthEcmaStrU8, ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtr = EcmaString::CreateFromUtf16(&arrayU16Comp[0], lengthEcmaStrU16Comp, ecmaVMPtr, + true); + EcmaString *ecmaStrU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayU16NotComp[0], lengthEcmaStrU16NotComp, + ecmaVMPtr, false); + + EXPECT_EQ(ecmaStrU8Ptr->GetUtf16Length(), lengthEcmaStrU8); + EXPECT_EQ(ecmaStrU16CompPtr->GetUtf16Length(), lengthEcmaStrU16Comp); + EXPECT_EQ(ecmaStrU16NotCompPtr->GetUtf16Length(), lengthEcmaStrU16NotComp); +} + +HWTEST_F_L0(EcmaStringTest, GetDataUtf8) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // From EcmaString made by CreateFromUtf8(). + uint8_t arrayU8[] = {"abcde"}; + uint32_t lengthEcmaStrU8 = sizeof(arrayU8) - 1; + EcmaString *ecmaStrU8Ptr = EcmaString::CreateFromUtf8(&arrayU8[0], lengthEcmaStrU8, ecmaVMPtr, true); + const uint8_t *arrayU8FromEcmaStrU8Ptr = ecmaStrU8Ptr->GetDataUtf8(); + for (int i =0; i < lengthEcmaStrU8; i++) { + EXPECT_EQ(*(arrayU8FromEcmaStrU8Ptr + i), arrayU8[i]); + } + + // From EcmaString made by CreateFromUtf16( , , , true). + uint16_t arrayU16Comp[] = {3, 1, 34, 123, 127, 111, 42, 3, 20, 10}; + uint32_t lengthEcmaStrU16Comp = sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]); + EcmaString *ecmaStrU16CompPtr = EcmaString::CreateFromUtf16(&arrayU16Comp[0], lengthEcmaStrU16Comp, ecmaVMPtr, + true); + const uint8_t *arrayU8FromEcmaStrU16CompPtr = ecmaStrU16CompPtr->GetDataUtf8(); + for (int i = 0; i < sizeof(arrayU16Comp) / arrayU16Comp[0]; i++) { + EXPECT_EQ(*(arrayU8FromEcmaStrU16CompPtr + i), arrayU16Comp[i]); + } +} + +HWTEST_F_L0(EcmaStringTest, GetDataUtf16) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // From EcmaString made by CreateFromUtf16( , , , false). + uint16_t arrayU16NotComp[] = {67, 777, 1999, 1, 45, 66, 23456, 65535, 127, 333}; + uint32_t lengthEcmaStrU16NotComp = sizeof(arrayU16NotComp) / sizeof(arrayU16NotComp[0]); + EcmaString *ecmaStrU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayU16NotComp[0], lengthEcmaStrU16NotComp, + ecmaVMPtr, false); + const uint16_t *arrayU16FromEcmaStrU16NotCompPtr = ecmaStrU16NotCompPtr->GetDataUtf16(); + for (int i = 0; i < lengthEcmaStrU16NotComp; i++) { + EXPECT_EQ(*(arrayU16FromEcmaStrU16NotCompPtr + i), arrayU16NotComp[i]); + } +} + +HWTEST_F_L0(EcmaStringTest, CopyDataRegionUtf8) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // CopyDataRegionUtf8(). From EcmaString made by CreateFromUtf8(). + uint8_t arrayU8CopyFrom[6] = {1, 12, 34, 56, 127}; + uint32_t lengthEcmaStrU8CopyFrom = sizeof(arrayU8CopyFrom) - 1; + EcmaString *ecmaStrU8CopyFromPtr = EcmaString::CreateFromUtf8(&arrayU8CopyFrom[0], lengthEcmaStrU8CopyFrom, + ecmaVMPtr, true); + const size_t lengthEcmaStrU8CopyTo = 7; + uint8_t defaultByteForU8CopyTo = 1; + uint8_t arrayU8CopyTo[lengthEcmaStrU8CopyTo]; + memset_s(&arrayU8CopyTo[0], lengthEcmaStrU8CopyTo, defaultByteForU8CopyTo, lengthEcmaStrU8CopyTo); + size_t indexStartFromArrayU8 = 2; + size_t lengthCopyToEcmaStrU8 = 3; + size_t lengthReturnU8 = ecmaStrU8CopyFromPtr->CopyDataRegionUtf8(arrayU8CopyTo, indexStartFromArrayU8, + lengthCopyToEcmaStrU8, lengthEcmaStrU8CopyTo); + + EXPECT_EQ(lengthReturnU8, lengthCopyToEcmaStrU8); + EXPECT_EQ(sizeof(arrayU8CopyTo), lengthEcmaStrU8CopyTo); + for (int i = 0; i < lengthCopyToEcmaStrU8; i++) { + EXPECT_EQ(arrayU8CopyTo[i], ecmaStrU8CopyFromPtr->At(i + indexStartFromArrayU8)); + } + for (int i = lengthCopyToEcmaStrU8; i < lengthEcmaStrU8CopyTo; i++) { + EXPECT_EQ(arrayU8CopyTo[i], defaultByteForU8CopyTo); + } + + // CopyDataRegionUtf8(). From EcmaString made by CreateFromUtf16( , , , true). + uint16_t arrayU16CompCopyFrom[] = {1, 12, 34, 56, 127}; + uint32_t lengthEcmaStrU16CompCopyFrom = sizeof(arrayU16CompCopyFrom) / sizeof(arrayU16CompCopyFrom[0]); + EcmaString *ecmaStrU16CompCopyFromPtr = EcmaString::CreateFromUtf16(&arrayU16CompCopyFrom[0], + lengthEcmaStrU16CompCopyFrom, ecmaVMPtr, true); + const size_t lengthEcmaStrU16CompCopyTo = 8; + uint8_t defaultByteForU16CompCopyTo = 1; + uint8_t arrayU16CompCopyTo[lengthEcmaStrU16CompCopyTo]; + memset_s(&arrayU16CompCopyTo[0], lengthEcmaStrU16CompCopyTo, defaultByteForU16CompCopyTo, + lengthEcmaStrU16CompCopyTo); + size_t indexStartFromArrayU16Comp = 2; + size_t lengthCopyToEcmaStrU16Comp = 3; + size_t lengthReturnU16Comp = ecmaStrU16CompCopyFromPtr->CopyDataRegionUtf8(&arrayU16CompCopyTo[0], + indexStartFromArrayU16Comp, lengthCopyToEcmaStrU16Comp, lengthEcmaStrU16CompCopyTo); + + EXPECT_EQ(lengthReturnU16Comp, lengthCopyToEcmaStrU16Comp); + EXPECT_EQ(sizeof(arrayU16CompCopyTo) / sizeof(arrayU16CompCopyTo[0]), lengthEcmaStrU16CompCopyTo); + for (int i = 0; i < lengthCopyToEcmaStrU16Comp; i++) { + EXPECT_EQ(arrayU16CompCopyTo[i], ecmaStrU16CompCopyFromPtr->At(i + indexStartFromArrayU16Comp)); + } + for (int i = lengthCopyToEcmaStrU16Comp; i < lengthEcmaStrU16CompCopyTo; i++) { + EXPECT_EQ(arrayU16CompCopyTo[i], defaultByteForU16CompCopyTo); + } +} + +HWTEST_F_L0(EcmaStringTest, CopyDataRegionUtf16) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // CopyDataRegionUtf16(). From EcmaString made by CreateFromUtf16( , , , false). + uint16_t arrayU16NotCompCopyFrom[10] = {67, 777, 1999, 1, 45, 66, 23456, 65535, 127, 333}; + uint32_t lengthEcmaStrU16NotCompCopyFrom = sizeof(arrayU16NotCompCopyFrom) / sizeof(arrayU16NotCompCopyFrom[0]); + EcmaString *ecmaStrU16NotCompCopyFromPtr = EcmaString::CreateFromUtf16(&arrayU16NotCompCopyFrom[0], + lengthEcmaStrU16NotCompCopyFrom, ecmaVMPtr, false); + const size_t lengthOfArrayU16NotCompCopyTo = 13; + uint8_t defaultOneByteValueOfArrayU16NotCompCopyTo = 244; + uint16_t arrayU16NotCompCopyTo[lengthOfArrayU16NotCompCopyTo]; + memset_s(&arrayU16NotCompCopyTo[0], sizeof(uint16_t) * lengthOfArrayU16NotCompCopyTo, + defaultOneByteValueOfArrayU16NotCompCopyTo, sizeof(uint16_t) * lengthOfArrayU16NotCompCopyTo); + size_t startIndexFromArrayU16NotComp = 2; + size_t byteLengthCopyFromArrayU16NotComp = 3; + size_t lengthReturnU16NotComp = ecmaStrU16NotCompCopyFromPtr->CopyDataRegionUtf16(&arrayU16NotCompCopyTo[0], + startIndexFromArrayU16NotComp, byteLengthCopyFromArrayU16NotComp, lengthOfArrayU16NotCompCopyTo); + + EXPECT_EQ(lengthReturnU16NotComp, byteLengthCopyFromArrayU16NotComp); + EXPECT_EQ(sizeof(arrayU16NotCompCopyTo) / sizeof(arrayU16NotCompCopyTo[0]), lengthOfArrayU16NotCompCopyTo); + for (int i = 0; i < byteLengthCopyFromArrayU16NotComp; i++) { + EXPECT_EQ(arrayU16NotCompCopyTo[i], ecmaStrU16NotCompCopyFromPtr->At(i + startIndexFromArrayU16NotComp)); + } + for (int i = byteLengthCopyFromArrayU16NotComp; i < lengthOfArrayU16NotCompCopyTo; i++) { + EXPECT_EQ(arrayU16NotCompCopyTo[i], ((uint16_t)defaultOneByteValueOfArrayU16NotCompCopyTo) * (1 + (1 << 8))); + } +} + +HWTEST_F_L0(EcmaStringTest, IndexOf) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // IndexOf(). Find EcmaString made by CreateFromUtf8() From EcmaString made by CreateFromUtf8(). + uint8_t arrayU8From[7] = {23, 25, 1, 3, 39, 80}; + uint8_t arrayU8Target[4] = {1, 3, 39}; + uint32_t lengthEcmaStrU8From = sizeof(arrayU8From) - 1; + uint32_t lengthEcmaStrU8Target = sizeof(arrayU8Target) - 1; + EcmaString *ecmaStrU8FromPtr = EcmaString::CreateFromUtf8(&arrayU8From[0], lengthEcmaStrU8From, ecmaVMPtr, true); + EcmaString *ecmaStrU8TargetPtr = EcmaString::CreateFromUtf8(&arrayU8Target[0], lengthEcmaStrU8Target, ecmaVMPtr, + true); + int32_t posStart = 0; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(ecmaStrU8TargetPtr, posStart), 2); + EXPECT_EQ(ecmaStrU8TargetPtr->IndexOf(ecmaStrU8FromPtr, posStart), -1); + posStart = -1; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(ecmaStrU8TargetPtr, posStart), 2); + posStart = 1; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(ecmaStrU8TargetPtr, posStart), 2); + posStart = 2; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(ecmaStrU8TargetPtr, posStart), 2); + posStart = 3; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(ecmaStrU8TargetPtr, posStart), -1); + + // IndexOf(). Find EcmaString made by CreateFromUtf8() From EcmaString made by CreateFromUtf16( , , , false). + uint16_t arrayU16NotCompFromNo1[] = {67, 65535, 127, 777, 1453, 44, 1, 3, 39, 80, 333}; + uint32_t lengthEcmaStrU16NotCompFromNo1 = sizeof(arrayU16NotCompFromNo1) / sizeof(arrayU16NotCompFromNo1[0]); + EcmaString *ecmaStrU16NotCompFromPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16NotCompFromNo1[0], + lengthEcmaStrU16NotCompFromNo1, ecmaVMPtr, false); + posStart = 0; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(ecmaStrU8TargetPtr, posStart), 6); + EXPECT_EQ(ecmaStrU8TargetPtr->IndexOf(ecmaStrU16NotCompFromPtrNo1, posStart), -1); + posStart = -1; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(ecmaStrU8TargetPtr, posStart), 6); + posStart = 1; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(ecmaStrU8TargetPtr, posStart), 6); + posStart = 6; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(ecmaStrU8TargetPtr, posStart), 6); + posStart = 7; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(ecmaStrU8TargetPtr, posStart), -1); + + /* IndexOf(). Find EcmaString made by CreateFromUtf16( , , , false) From EcmaString made by + * CreateFromUtf16( , , , false). + */ + uint16_t arrayU16NotCompTargetNo1[] = {1453, 44}; + uint32_t lengthEcmaStrU16NotCompTargetNo1 = sizeof(arrayU16NotCompTargetNo1) / sizeof(arrayU16NotCompTargetNo1[0]); + EcmaString *arrayU16NotCompTargetPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16NotCompTargetNo1[0], + lengthEcmaStrU16NotCompTargetNo1, ecmaVMPtr, false); + posStart = 0; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(arrayU16NotCompTargetPtrNo1, posStart), 4); + EXPECT_EQ(arrayU16NotCompTargetPtrNo1->IndexOf(ecmaStrU16NotCompFromPtrNo1, posStart), -1); + posStart = -1; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(arrayU16NotCompTargetPtrNo1, posStart), 4); + posStart = 1; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(arrayU16NotCompTargetPtrNo1, posStart), 4); + posStart = 4; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(arrayU16NotCompTargetPtrNo1, posStart), 4); + posStart = 5; + EXPECT_EQ(ecmaStrU16NotCompFromPtrNo1->IndexOf(arrayU16NotCompTargetPtrNo1, posStart), -1); + + // IndexOf(). Find EcmaString made by CreateFromUtf16( , , , false) From EcmaString made by CreateFromUtf8(). + uint16_t arrayU16NotCompTargetNo2[] = {3, 39, 80}; + uint32_t lengthEcmaStrU16NotCompTargetNo2 = sizeof(arrayU16NotCompTargetNo2) / sizeof(arrayU16NotCompTargetNo2[0]); + EcmaString *arrayU16NotCompTargetPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16NotCompTargetNo2[0], + lengthEcmaStrU16NotCompTargetNo2, ecmaVMPtr, false); + posStart = 0; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(arrayU16NotCompTargetPtrNo2, posStart), 3); + EXPECT_EQ(arrayU16NotCompTargetPtrNo2->IndexOf(ecmaStrU8FromPtr, posStart), -1); + posStart = -1; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(arrayU16NotCompTargetPtrNo2, posStart), 3); + posStart = 1; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(arrayU16NotCompTargetPtrNo2, posStart), 3); + posStart = 3; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(arrayU16NotCompTargetPtrNo2, posStart), 3); + posStart = 4; + EXPECT_EQ(ecmaStrU8FromPtr->IndexOf(arrayU16NotCompTargetPtrNo2, posStart), -1); +} + +HWTEST_F_L0(EcmaStringTest, StringsAreEqual) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // StringsAreEqual(). + uint8_t arrayU8No1[4] = {45, 92, 78}; + uint8_t arrayU8No2[4] = {45, 92, 78}; + uint8_t arrayU8No3[5] = {45, 92, 78, 1}; + uint16_t arrayU16CompNo1[] = {45, 92, 78}; + uint16_t arrayU16CompNo2[] = {45, 92, 78}; + uint16_t arrayU16CompNo3[] = {45, 92, 78, 1}; + uint16_t arrayU16NotCompNo1[] = {45, 92, 78}; + uint16_t arrayU16NotCompNo2[] = {45, 92, 78}; + uint16_t arrayU16NotCompNo3[] = {45, 92, 78, 1}; + uint32_t lengthEcmaStrU8No1 = sizeof(arrayU8No1) - 1; + uint32_t lengthEcmaStrU8No2 = sizeof(arrayU8No2) - 1; + uint32_t lengthEcmaStrU8No3 = sizeof(arrayU8No3) - 1; + uint32_t lengthEcmaStrU16CompNo1 = sizeof(arrayU16CompNo1) / sizeof(arrayU16CompNo1[0]); + uint32_t lengthEcmaStrU16CompNo2 = sizeof(arrayU16CompNo2) / sizeof(arrayU16CompNo2[0]); + uint32_t lengthEcmaStrU16CompNo3 = sizeof(arrayU16CompNo3) / sizeof(arrayU16CompNo3[0]); + uint32_t lengthEcmaStrU16NotCompNo1 = sizeof(arrayU16NotCompNo1) / sizeof(arrayU16NotCompNo1[0]); + uint32_t lengthEcmaStrU16NotCompNo2 = sizeof(arrayU16NotCompNo2) / sizeof(arrayU16NotCompNo2[0]); + uint32_t lengthEcmaStrU16NotCompNo3 = sizeof(arrayU16NotCompNo3) / sizeof(arrayU16NotCompNo3[0]); + EcmaString *ecmaStrU8PtrNo1 = EcmaString::CreateFromUtf8(&arrayU8No1[0], lengthEcmaStrU8No1, ecmaVMPtr, true); + EcmaString *ecmaStrU8PtrNo2 = EcmaString::CreateFromUtf8(&arrayU8No2[0], lengthEcmaStrU8No2, ecmaVMPtr, true); + EcmaString *ecmaStrU8PtrNo3 = EcmaString::CreateFromUtf8(&arrayU8No3[0], lengthEcmaStrU8No3, ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16CompNo1[0], lengthEcmaStrU16CompNo1, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16CompNo2[0], lengthEcmaStrU16CompNo2, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo3 = EcmaString::CreateFromUtf16(&arrayU16CompNo3[0], lengthEcmaStrU16CompNo3, + ecmaVMPtr, true); + EcmaString *ecmaStrU16NotCompPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo2[0], + lengthEcmaStrU16NotCompNo2, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo3 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo3[0], + lengthEcmaStrU16NotCompNo3, ecmaVMPtr, false); + + EXPECT_TRUE(EcmaString::StringsAreEqual(ecmaStrU8PtrNo1, ecmaStrU8PtrNo2)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU8PtrNo1, ecmaStrU8PtrNo3)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU8PtrNo3, ecmaStrU8PtrNo1)); + + EXPECT_TRUE(EcmaString::StringsAreEqual(ecmaStrU8PtrNo1, ecmaStrU16CompPtrNo2)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU8PtrNo1, ecmaStrU16CompPtrNo3)); + + EXPECT_TRUE(EcmaString::StringsAreEqual(ecmaStrU16CompPtrNo1, ecmaStrU16CompPtrNo2)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16CompPtrNo1, ecmaStrU16CompPtrNo3)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16CompPtrNo3, ecmaStrU16CompPtrNo1)); + + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU8PtrNo1, ecmaStrU16NotCompPtrNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16NotCompPtrNo1, ecmaStrU8PtrNo1)); + + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16CompPtrNo1, ecmaStrU16NotCompPtrNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16NotCompPtrNo1, ecmaStrU16CompPtrNo1)); + + EXPECT_TRUE(EcmaString::StringsAreEqual(ecmaStrU16NotCompPtrNo1, ecmaStrU16NotCompPtrNo2)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16NotCompPtrNo1, ecmaStrU16NotCompPtrNo3)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16NotCompPtrNo3, ecmaStrU16NotCompPtrNo1)); + + // StringsAreEqual(). Complements for EcmaString made by CreateFromUtf16( , , , false)(0-65535). + uint16_t arrayU16NotCompNo4[] = {234, 345, 127, 2345, 65535, 5}; + uint16_t arrayU16NotCompNo5[] = {234, 345, 127, 2345, 65535, 5}; + uint16_t arrayU16NotCompNo6[] = {1, 234, 345, 127, 2345, 65535, 5}; + uint32_t lengthEcmaStrU16NotCompNo4 = sizeof(arrayU16NotCompNo4) / sizeof(arrayU16NotCompNo4[0]); + uint32_t lengthEcmaStrU16NotCompNo5 = sizeof(arrayU16NotCompNo5) / sizeof(arrayU16NotCompNo5[0]); + uint32_t lengthEcmaStrU16NotCompNo6 = sizeof(arrayU16NotCompNo6) / sizeof(arrayU16NotCompNo6[0]); + EcmaString *ecmaStrU16NotCompPtrNo4 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo4[0], + lengthEcmaStrU16NotCompNo4, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo5 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo5[0], + lengthEcmaStrU16NotCompNo5, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo6 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo6[0], + lengthEcmaStrU16NotCompNo6, ecmaVMPtr, false); + EXPECT_TRUE(EcmaString::StringsAreEqual(ecmaStrU16NotCompPtrNo4, ecmaStrU16NotCompPtrNo5)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16NotCompPtrNo4, ecmaStrU16NotCompPtrNo6)); + EXPECT_FALSE(EcmaString::StringsAreEqual(ecmaStrU16NotCompPtrNo6, ecmaStrU16NotCompPtrNo4)); +} + +HWTEST_F_L0(EcmaStringTest, StringsAreEqualUtf8) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // StringsAreEqualUtf8(). + uint8_t arrayU8No1[4] = {45, 92, 78}; + uint8_t arrayU8No2[5] = {45, 92, 78, 24}; + uint8_t arrayU8No3[3] = {45, 92}; + uint16_t arrayU16CompNo1[] = {45, 92, 78}; + uint16_t arrayU16CompNo2[] = {45, 92, 78, 24}; + uint16_t arrayU16CompNo3[] = {45, 92}; + uint16_t arrayU16CompNo4[] = {25645, 25692, 25678}; + uint16_t arrayU16NotCompNo1[] = {45, 92, 78}; + uint16_t arrayU16NotCompNo2[] = {45, 92, 78, 24}; + uint16_t arrayU16NotCompNo3[] = {45, 92}; + uint16_t arrayU16NotCompNo4[] = {25645, 25692, 25678}; + uint32_t lengthEcmaStrU8No1 = sizeof(arrayU8No1) - 1; + uint32_t lengthEcmaStrU8No2 = sizeof(arrayU8No2) - 1; + uint32_t lengthEcmaStrU8No3 = sizeof(arrayU8No3) - 1; + uint32_t lengthEcmaStrU16CompNo1 = sizeof(arrayU16CompNo1) / sizeof(arrayU16CompNo1[0]); + uint32_t lengthEcmaStrU16CompNo2 = sizeof(arrayU16CompNo2) / sizeof(arrayU16CompNo2[0]); + uint32_t lengthEcmaStrU16CompNo3 = sizeof(arrayU16CompNo3) / sizeof(arrayU16CompNo3[0]); + uint32_t lengthEcmaStrU16CompNo4 = sizeof(arrayU16CompNo4) / sizeof(arrayU16CompNo4[0]); + uint32_t lengthEcmaStrU16NotCompNo1 = sizeof(arrayU16NotCompNo1) / sizeof(arrayU16NotCompNo1[0]); + uint32_t lengthEcmaStrU16NotCompNo2 = sizeof(arrayU16NotCompNo2) / sizeof(arrayU16NotCompNo2[0]); + uint32_t lengthEcmaStrU16NotCompNo3 = sizeof(arrayU16NotCompNo3) / sizeof(arrayU16NotCompNo3[0]); + uint32_t lengthEcmaStrU16NotCompNo4 = sizeof(arrayU16NotCompNo4) / sizeof(arrayU16NotCompNo4[0]); + EcmaString *ecmaStrU8PtrNo1 = EcmaString::CreateFromUtf8(&arrayU8No1[0], lengthEcmaStrU8No1, ecmaVMPtr, true); + EcmaString *ecmaStrU8PtrNo2 = EcmaString::CreateFromUtf8(&arrayU8No2[0], lengthEcmaStrU8No2, ecmaVMPtr, true); + EcmaString *ecmaStrU8PtrNo3 = EcmaString::CreateFromUtf8(&arrayU8No3[0], lengthEcmaStrU8No3, ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16CompNo1[0], lengthEcmaStrU16CompNo1, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16CompNo2[0], lengthEcmaStrU16CompNo2, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo3 = EcmaString::CreateFromUtf16(&arrayU16CompNo3[0], lengthEcmaStrU16CompNo3, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo4 = EcmaString::CreateFromUtf16(&arrayU16CompNo4[0], lengthEcmaStrU16CompNo4, + ecmaVMPtr, true); + EcmaString *ecmaStrU16NotCompPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo2[0], + lengthEcmaStrU16NotCompNo2, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo3 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo3[0], + lengthEcmaStrU16NotCompNo3, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo4 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo4[0], + lengthEcmaStrU16NotCompNo4, ecmaVMPtr, false); + + // StringsAreEqualUtf8(). EcmaString made by CreateFromUtf8(), Array:U8. + EXPECT_TRUE(EcmaString::StringsAreEqualUtf8(ecmaStrU8PtrNo1, &arrayU8No1[0], lengthEcmaStrU8No1, true)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU8PtrNo1, &arrayU8No1[0], lengthEcmaStrU8No1, false)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU8PtrNo2, &arrayU8No1[0], lengthEcmaStrU8No1, true)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU8PtrNo3, &arrayU8No1[0], lengthEcmaStrU8No1, true)); + + // StringsAreEqualUtf8(). EcmaString made by CreateFromUtf16( , , , true), Array:U8. + EXPECT_TRUE(EcmaString::StringsAreEqualUtf8(ecmaStrU16CompPtrNo1, &arrayU8No1[0], lengthEcmaStrU8No1, true)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU16CompPtrNo1, &arrayU8No1[0], lengthEcmaStrU8No1, false)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU16CompPtrNo2, &arrayU8No1[0], lengthEcmaStrU8No1, true)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU16CompPtrNo3, &arrayU8No1[0], lengthEcmaStrU8No1, true)); + + // StringsAreEqualUtf8(). EcmaString made by CreateFromUtf16( , , , true), Array:U8. + EXPECT_TRUE(EcmaString::StringsAreEqualUtf8(ecmaStrU16CompPtrNo4, &arrayU8No1[0], lengthEcmaStrU8No1, true)); + + // StringsAreEqualUtf8(). EcmaString made by CreateFromUtf16( , , , false), Array:U8. + EXPECT_TRUE(EcmaString::StringsAreEqualUtf8(ecmaStrU16NotCompPtrNo1, &arrayU8No1[0], lengthEcmaStrU8No1, false)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU16NotCompPtrNo1, &arrayU8No1[0], lengthEcmaStrU8No1, true)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU16NotCompPtrNo2, &arrayU8No1[0], lengthEcmaStrU8No1, false)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU16NotCompPtrNo3, &arrayU8No1[0], lengthEcmaStrU8No1, false)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf8(ecmaStrU16NotCompPtrNo4, &arrayU8No1[0], lengthEcmaStrU8No1, false)); +} + +HWTEST_F_L0(EcmaStringTest, StringsAreEqualUtf16) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // StringsAreEqualUtf16(). + uint8_t arrayU8No1[4] = {45, 92, 78}; + uint8_t arrayU8No2[5] = {45, 92, 78, 24}; + uint8_t arrayU8No3[3] = {45, 92}; + uint16_t arrayU16CompNo1[] = {45, 92, 78}; + uint16_t arrayU16CompNo2[] = {45, 92, 78, 24}; + uint16_t arrayU16CompNo3[] = {45, 92}; + uint16_t arrayU16CompNo4[] = {25645, 25692, 25678}; // 25645 % 256 == 45... + uint16_t arrayU16NotCompNo1[] = {45, 92, 78}; + uint16_t arrayU16NotCompNo2[] = {45, 92, 78, 24}; + uint16_t arrayU16NotCompNo3[] = {45, 92}; + uint16_t arrayU16NotCompNo4[] = {25645, 25692, 25678}; // 25645 % 256 == 45... + uint16_t arrayU16NotCompNo5[] = {25645, 25692, 25678, 65535}; + uint16_t arrayU16NotCompNo6[] = {25645, 25692}; + uint32_t lengthEcmaStrU8No1 = sizeof(arrayU8No1) - 1; + uint32_t lengthEcmaStrU8No2 = sizeof(arrayU8No2) - 1; + uint32_t lengthEcmaStrU8No3 = sizeof(arrayU8No3) - 1; + uint32_t lengthEcmaStrU16CompNo1 = sizeof(arrayU16CompNo1) / sizeof(arrayU16CompNo1[0]); + uint32_t lengthEcmaStrU16CompNo2 = sizeof(arrayU16CompNo2) / sizeof(arrayU16CompNo2[0]); + uint32_t lengthEcmaStrU16CompNo3 = sizeof(arrayU16CompNo3) / sizeof(arrayU16CompNo3[0]); + uint32_t lengthEcmaStrU16CompNo4 = sizeof(arrayU16CompNo4) / sizeof(arrayU16CompNo4[0]); + uint32_t lengthEcmaStrU16NotCompNo1 = sizeof(arrayU16NotCompNo1) / sizeof(arrayU16NotCompNo1[0]); + uint32_t lengthEcmaStrU16NotCompNo2 = sizeof(arrayU16NotCompNo2) / sizeof(arrayU16NotCompNo2[0]); + uint32_t lengthEcmaStrU16NotCompNo3 = sizeof(arrayU16NotCompNo3) / sizeof(arrayU16NotCompNo3[0]); + uint32_t lengthEcmaStrU16NotCompNo4 = sizeof(arrayU16NotCompNo4) / sizeof(arrayU16NotCompNo4[0]); + uint32_t lengthEcmaStrU16NotCompNo5 = sizeof(arrayU16NotCompNo5) / sizeof(arrayU16NotCompNo5[0]); + uint32_t lengthEcmaStrU16NotCompNo6 = sizeof(arrayU16NotCompNo6) / sizeof(arrayU16NotCompNo6[0]); + EcmaString *ecmaStrU8PtrNo1 = EcmaString::CreateFromUtf8(&arrayU8No1[0], lengthEcmaStrU8No1, ecmaVMPtr, true); + EcmaString *ecmaStrU8PtrNo2 = EcmaString::CreateFromUtf8(&arrayU8No2[0], lengthEcmaStrU8No2, ecmaVMPtr, true); + EcmaString *ecmaStrU8PtrNo3 = EcmaString::CreateFromUtf8(&arrayU8No3[0], lengthEcmaStrU8No3, ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16CompNo1[0], lengthEcmaStrU16CompNo1, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16CompNo2[0], lengthEcmaStrU16CompNo2, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo3 = EcmaString::CreateFromUtf16(&arrayU16CompNo3[0], lengthEcmaStrU16CompNo3, + ecmaVMPtr, true); + EcmaString *ecmaStrU16CompPtrNo4 = EcmaString::CreateFromUtf16(&arrayU16CompNo4[0], lengthEcmaStrU16CompNo4, + ecmaVMPtr, true); + EcmaString *ecmaStrU16NotCompPtrNo1 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo2 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo2[0], + lengthEcmaStrU16NotCompNo2, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo3 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo3[0], + lengthEcmaStrU16NotCompNo3, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo4 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo4[0], + lengthEcmaStrU16NotCompNo4, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo5 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo5[0], + lengthEcmaStrU16NotCompNo5, ecmaVMPtr, false); + EcmaString *ecmaStrU16NotCompPtrNo6 = EcmaString::CreateFromUtf16(&arrayU16NotCompNo6[0], + lengthEcmaStrU16NotCompNo6, ecmaVMPtr, false); + + // StringsAreEqualUtf16(). EcmaString made by CreateFromUtf8, Array:U16(1-127). + EXPECT_TRUE(EcmaString::StringsAreEqualUtf16(ecmaStrU8PtrNo1, &arrayU16NotCompNo1[0], lengthEcmaStrU16NotCompNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU8PtrNo2, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU8PtrNo3, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + + // StringsAreEqualUtf16(). EcmaString made by CreateFromUtf16( , , , true), Array:U16(1-127). + EXPECT_TRUE(EcmaString::StringsAreEqualUtf16(ecmaStrU16CompPtrNo1, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + EXPECT_TRUE(EcmaString::StringsAreEqualUtf16(ecmaStrU16CompPtrNo4, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU16CompPtrNo2, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU16CompPtrNo3, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + + // StringsAreEqualUtf16(). EcmaString made by CreateFromUtf16( , , , false), Array:U16(1-127). + EXPECT_TRUE(EcmaString::StringsAreEqualUtf16(ecmaStrU16NotCompPtrNo1, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU16NotCompPtrNo2, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU16NotCompPtrNo3, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU16NotCompPtrNo4, &arrayU16NotCompNo1[0], + lengthEcmaStrU16NotCompNo1)); + + // StringsAreEqualUtf16(). EcmaString made by CreateFromUtf16( , , , false), Array:U16(0-65535). + EXPECT_TRUE(EcmaString::StringsAreEqualUtf16(ecmaStrU16NotCompPtrNo4, &arrayU16NotCompNo4[0], + lengthEcmaStrU16NotCompNo4)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU16NotCompPtrNo5, &arrayU16NotCompNo4[0], + lengthEcmaStrU16NotCompNo4)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU16NotCompPtrNo6, &arrayU16NotCompNo4[0], + lengthEcmaStrU16NotCompNo4)); + EXPECT_FALSE(EcmaString::StringsAreEqualUtf16(ecmaStrU16NotCompPtrNo1, &arrayU16NotCompNo4[0], + lengthEcmaStrU16NotCompNo4)); +} + +HWTEST_F_L0(EcmaStringTest, ComputeHashcodeUtf8) +{ + uint8_t arrayU8[] = {"abc"}; + uint32_t lengthEcmaStrU8 = sizeof(arrayU8) - 1; + uint32_t hashExpect = 0; + for (uint32_t i = 0; i < lengthEcmaStrU8; i++) { + hashExpect = hashExpect * 31 + arrayU8[i]; + } + EXPECT_EQ(EcmaString::ComputeHashcodeUtf8(&arrayU8[0], lengthEcmaStrU8), static_cast(hashExpect)); +} + +HWTEST_F_L0(EcmaStringTest, ComputeHashcodeUtf16) +{ + uint16_t arrayU16[] = {199, 1, 256, 65535, 777}; + uint32_t lengthEcmaStrU16 = sizeof(arrayU16) / sizeof(arrayU16[0]); + uint32_t hashExpect = 0; + for (uint32_t i = 0; i < lengthEcmaStrU16; i++) { + hashExpect = hashExpect * 31 + arrayU16[i]; + } + EXPECT_EQ(EcmaString::ComputeHashcodeUtf16(&arrayU16[0], lengthEcmaStrU16), static_cast(hashExpect)); +} + +HWTEST_F_L0(EcmaStringTest, GetHashcode) +{ + EcmaVM* ecmaVMPtr = EcmaVM::Cast(instance); + + // GetHashcode(). EcmaString made by CreateFromUtf8(). + uint8_t arrayU8[] = {"abc"}; + uint32_t lengthEcmaStrU8 = sizeof(arrayU8) - 1; + EcmaString *ecmaStrU8Ptr = EcmaString::CreateFromUtf8(&arrayU8[0], lengthEcmaStrU8, ecmaVMPtr, true); + uint32_t hashExpect = 0; + for (uint32_t i = 0; i < lengthEcmaStrU8; i++) { + hashExpect = hashExpect * 31 + arrayU8[i]; + } + EXPECT_EQ(ecmaStrU8Ptr->GetHashcode(), static_cast(hashExpect)); + + // GetHashcode(). EcmaString made by CreateFromUtf16( , , , true). + uint16_t arrayU16Comp[] = {45, 92, 78, 24}; + uint32_t lengthEcmaStrU16Comp = sizeof(arrayU16Comp) / sizeof(arrayU16Comp[0]); + EcmaString *ecmaStrU16CompPtr = EcmaString::CreateFromUtf16(&arrayU16Comp[0], lengthEcmaStrU16Comp, ecmaVMPtr, + true); + hashExpect = 0; + for (uint32_t i = 0; i < lengthEcmaStrU16Comp; i++) { + hashExpect = hashExpect * 31 + arrayU16Comp[i]; + } + EXPECT_EQ(ecmaStrU16CompPtr->GetHashcode(), static_cast(hashExpect)); + + // GetHashcode(). EcmaString made by CreateFromUtf16( , , , false). + uint16_t arrayU16NotComp[] = {199, 1, 256, 65535, 777}; + uint32_t lengthEcmaStrU16NotComp = sizeof(arrayU16NotComp) / sizeof(arrayU16NotComp[0]); + EcmaString *ecmaStrU16NotCompPtr = EcmaString::CreateFromUtf16(&arrayU16NotComp[0], lengthEcmaStrU16NotComp, + ecmaVMPtr, false); + hashExpect = 0; + for (uint32_t i = 0; i < lengthEcmaStrU16NotComp; i++) { + hashExpect = hashExpect * 31 + arrayU16NotComp[i]; + } + EXPECT_EQ(ecmaStrU16NotCompPtr->GetHashcode(), static_cast(hashExpect)); + EcmaString::SetCompressedStringsEnabled(false); // Set compressedStringsEnabled false. + EXPECT_EQ(ecmaStrU16NotCompPtr->GetHashcode(), static_cast(hashExpect)); + EcmaString::SetCompressedStringsEnabled(true); // Set compressedStringsEnabled true(default). + + // GetHashcode(). EcmaString made by CreateEmptyString(). + EcmaString *ecmaStrEmptyPtr = EcmaString::CreateEmptyString(ecmaVMPtr); + EXPECT_EQ(ecmaStrEmptyPtr->GetHashcode(), 0); + EcmaString::SetCompressedStringsEnabled(false); // Set compressedStringsEnabled false. + EcmaString *ecmaStrNotCompEmptyPtr = EcmaString::CreateEmptyString(ecmaVMPtr); + EXPECT_EQ(ecmaStrNotCompEmptyPtr->GetHashcode(), 0); + EcmaString::SetCompressedStringsEnabled(true); // Set compressedStringsEnabled true(default). + + // GetHashcode(). EcmaString made by AllocStringObject(). + size_t sizeAlloc = 5; + EcmaString *ecmaStrAllocCompPtr = EcmaString::AllocStringObject(sizeAlloc, true, ecmaVMPtr); + EcmaString *ecmaStrAllocNotCompPtr = EcmaString::AllocStringObject(sizeAlloc, false, ecmaVMPtr); + EXPECT_EQ(ecmaStrAllocCompPtr->GetHashcode(), 0); + EXPECT_EQ(ecmaStrAllocNotCompPtr->GetHashcode(), 0); + EcmaString::SetCompressedStringsEnabled(false); // Set compressedStringsEnabled false. + EXPECT_EQ(ecmaStrAllocNotCompPtr->GetHashcode(), 0); + EcmaString::SetCompressedStringsEnabled(true); // Set compressedStringsEnabled true(default). +} +} // namespace panda::ecmascript