• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ecmascript/ecma_string_table.h"
17 #include "ecmascript/tests/test_helper.h"
18 
19 using namespace panda::ecmascript;
20 
21 namespace panda::test {
22 class EcmaStringTableTest : public BaseTestWithScope<false> {
23 };
24 
25 /**
26  * @tc.name: GetOrInternFlattenString_EmptyString
27  * @tc.desc: Write empty string emptyStr to the Intern pool and takes the hash code as its index.
28  * @tc.type: FUNC
29  * @tc.require:
30  */
HWTEST_F_L0(EcmaStringTableTest,GetOrInternFlattenString_EmptyString)31 HWTEST_F_L0(EcmaStringTableTest, GetOrInternFlattenString_EmptyString)
32 {
33     EcmaStringTable *table = thread->GetEcmaVM()->GetEcmaStringTable();
34 
35     JSHandle<EcmaString> emptyEcmaStrHandle(thread, EcmaStringAccessor::CreateEmptyString(thread->GetEcmaVM()));
36     EXPECT_TRUE(!EcmaStringAccessor(emptyEcmaStrHandle).IsInternString());
37 
38     table->GetOrInternFlattenString(thread->GetEcmaVM(), *emptyEcmaStrHandle);
39     EXPECT_TRUE(!EcmaStringAccessor(emptyEcmaStrHandle).IsInternString());
40 }
41 
42 /**
43  * @tc.name: GetOrInternString
44  * @tc.desc: Obtain EcmaString string from utf8 encoded data. If the string already exists in the detention pool,
45              it will be returned directly. If not, it will be added to the detention pool and then returned.
46  * @tc.type: FUNC
47  * @tc.require:
48  */
HWTEST_F_L0(EcmaStringTableTest,GetOrInternString_utf8Data)49 HWTEST_F_L0(EcmaStringTableTest, GetOrInternString_utf8Data)
50 {
51     EcmaVM *vm = thread->GetEcmaVM();
52     EcmaStringTable *table = thread->GetEcmaVM()->GetEcmaStringTable();
53 
54     uint8_t utf8Data[] = {0x68, 0x65, 0x6c, 0x6c, 0x6f}; // " hello "
55     EcmaString *ecmaStrCreatePtr = EcmaStringAccessor::CreateFromUtf8(vm, utf8Data, sizeof(utf8Data), true);
56     EXPECT_TRUE(!EcmaStringAccessor(ecmaStrCreatePtr).IsInternString());
57 
58     EcmaString *ecmaStrGetPtr = table->GetOrInternString(vm, utf8Data, sizeof(utf8Data), true);
59     EXPECT_STREQ(EcmaStringAccessor(ecmaStrGetPtr).ToCString().c_str(), "hello");
60     EXPECT_TRUE(EcmaStringAccessor(ecmaStrGetPtr).IsInternString());
61 }
62 
63 /**
64  * @tc.name: GetOrInternString
65  * @tc.desc: Obtain EcmaString string from utf16 encoded data. If the string already exists in the detention pool,
66              it will be returned directly. If not, it will be added to the detention pool and then returned.
67  * @tc.type: FUNC
68  * @tc.require:
69  */
HWTEST_F_L0(EcmaStringTableTest,GetOrInternString_utf16Data)70 HWTEST_F_L0(EcmaStringTableTest, GetOrInternString_utf16Data)
71 {
72     EcmaVM *vm = thread->GetEcmaVM();
73     EcmaStringTable *table = thread->GetEcmaVM()->GetEcmaStringTable();
74 
75     uint16_t utf16Data[] = {0x7F16, 0x7801, 0x89E3, 0x7801}; // “ 编码解码 ”
76     EcmaString *ecmaStrCreatePtr =
77         EcmaStringAccessor::CreateFromUtf16(vm, utf16Data, sizeof(utf16Data) / sizeof(uint16_t), false);
78     EXPECT_TRUE(!EcmaStringAccessor(ecmaStrCreatePtr).IsInternString());
79 
80     EcmaString *ecmaStrGetPtr = table->GetOrInternString(vm, utf16Data, sizeof(utf16Data) / sizeof(uint16_t), false);
81     EXPECT_STREQ(EcmaStringAccessor(ecmaStrGetPtr).ToCString().c_str(), "编码解码");
82     EXPECT_TRUE(EcmaStringAccessor(ecmaStrGetPtr).IsInternString());
83 }
84 
85 /**
86  * @tc.name: GetOrInternString
87  * @tc.desc: Obtain EcmaString string from another EcmaString. If the string already exists in the detention pool,
88              it will be returned directly. If not, it will be added to the detention pool and then returned.
89  * @tc.type: FUNC
90  * @tc.require:
91  */
HWTEST_F_L0(EcmaStringTableTest,GetOrInternString_EcmaString)92 HWTEST_F_L0(EcmaStringTableTest, GetOrInternString_EcmaString)
93 {
94     EcmaVM *vm = thread->GetEcmaVM();
95     ObjectFactory *factory = vm->GetFactory();
96     EcmaStringTable *table = thread->GetEcmaVM()->GetEcmaStringTable();
97 
98     JSHandle<EcmaString> ecmaStrCreateHandle = factory->NewFromASCII("hello world");
99     EXPECT_TRUE(EcmaStringAccessor(ecmaStrCreateHandle).IsInternString());
100 
101     EcmaString *ecmaStrGetPtr = table->GetOrInternString(vm, *ecmaStrCreateHandle);
102     EXPECT_STREQ(EcmaStringAccessor(ecmaStrGetPtr).ToCString().c_str(), "hello world");
103     EXPECT_TRUE(EcmaStringAccessor(ecmaStrGetPtr).IsInternString());
104 }
105 
106 /**
107  * @tc.name: GetOrInternString
108  * @tc.desc: Check the uniqueness of string and its hashcode in stringtable to ensure that no two strings have
109              same contents and same hashcode
110  * @tc.type: FUNC
111  * @tc.require:
112  */
HWTEST_F_L0(EcmaStringTableTest,GetOrInternString_CheckStringTable)113 HWTEST_F_L0(EcmaStringTableTest, GetOrInternString_CheckStringTable)
114 {
115     EXPECT_TRUE(thread->GetEcmaVM()->GetEcmaStringTable()->CheckStringTableValidity(thread));
116 }
117 }  // namespace panda::test
118