1 /*
2 * Copyright (c) 2021 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/builtins/builtins_string.h"
17
18 #include "ecmascript/base/builtins_base.h"
19 #include "ecmascript/builtins/builtins_regexp.h"
20 #include "ecmascript/ecma_runtime_call_info.h"
21 #include "ecmascript/ecma_string.h"
22 #include "ecmascript/ecma_vm.h"
23 #include "ecmascript/global_env.h"
24 #include "ecmascript/js_array.h"
25 #include "ecmascript/js_primitive_ref.h"
26 #include "ecmascript/js_regexp.h"
27 #include "ecmascript/js_tagged_value.h"
28 #include "ecmascript/object_factory.h"
29 #include "ecmascript/tests/test_helper.h"
30
31 using namespace panda::ecmascript;
32 using namespace panda::ecmascript::builtins;
33
34 namespace panda::test {
35 class BuiltinsStringTest : public testing::Test {
36 public:
SetUpTestCase()37 static void SetUpTestCase()
38 {
39 GTEST_LOG_(INFO) << "SetUpTestCase";
40 }
41
TearDownTestCase()42 static void TearDownTestCase()
43 {
44 GTEST_LOG_(INFO) << "TearDownCase";
45 }
46
SetUp()47 void SetUp() override
48 {
49 JSRuntimeOptions options;
50 #if PANDA_TARGET_LINUX
51 // for consistency requirement, use ohos_icu4j/data as icu-data-path
52 options.SetIcuDataPath(ICU_PATH);
53 #endif
54 options.SetEnableForceGC(true);
55 instance = JSNApi::CreateEcmaVM(options);
56 instance->SetEnableForceGC(true);
57 ASSERT_TRUE(instance != nullptr) << "Cannot create EcmaVM";
58 thread = instance->GetJSThread();
59 scope = new EcmaHandleScope(thread);
60 }
61
TearDown()62 void TearDown() override
63 {
64 TestHelper::DestroyEcmaVMWithScope(instance, scope);
65 }
66
67 EcmaVM *instance {nullptr};
68 EcmaHandleScope *scope {nullptr};
69 JSThread *thread {nullptr};
70 };
71
CreateBuiltinsStringRegExpObjByPatternAndFlags(JSThread * thread,const JSHandle<EcmaString> & pattern,const JSHandle<EcmaString> & flags)72 JSTaggedValue CreateBuiltinsStringRegExpObjByPatternAndFlags(JSThread *thread, const JSHandle<EcmaString> &pattern,
73 const JSHandle<EcmaString> &flags)
74 {
75 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
76 JSHandle<JSFunction> regexp(env->GetRegExpFunction());
77 JSHandle<JSObject> globalObject(thread, env->GetGlobalObject());
78
79 // 8 : test case
80 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, regexp.GetTaggedValue(), 8);
81 ecmaRuntimeCallInfo->SetFunction(regexp.GetTaggedValue());
82 ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue());
83 ecmaRuntimeCallInfo->SetCallArg(0, pattern.GetTaggedValue());
84 ecmaRuntimeCallInfo->SetCallArg(1, flags.GetTaggedValue());
85
86 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
87 JSTaggedValue result = BuiltinsRegExp::RegExpConstructor(ecmaRuntimeCallInfo);
88 TestHelper::TearDownFrame(thread, prev);
89 return result;
90 }
91
HWTEST_F_L0(BuiltinsStringTest,StringConstructor1)92 HWTEST_F_L0(BuiltinsStringTest, StringConstructor1)
93 {
94 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
95
96 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
97 JSHandle<JSFunction> string(env->GetStringFunction());
98 JSHandle<JSObject> globalObject(thread, env->GetGlobalObject());
99 JSHandle<EcmaString> string2 = factory->NewFromASCII("ABC");
100
101 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, string.GetTaggedValue(), 6);
102 ecmaRuntimeCallInfo->SetFunction(string.GetTaggedValue());
103 ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue());
104 ecmaRuntimeCallInfo->SetCallArg(0, string2.GetTaggedValue());
105
106 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
107 JSTaggedValue result = BuiltinsString::StringConstructor(ecmaRuntimeCallInfo);
108 JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
109 ASSERT_TRUE(value.IsECMAObject());
110 JSHandle<JSPrimitiveRef> ref(thread, JSPrimitiveRef::Cast(value.GetTaggedObject()));
111 JSHandle<EcmaString> test = factory->NewFromASCII("ABC");
112 ASSERT_EQ(EcmaStringAccessor::Compare(instance,
113 JSHandle<EcmaString>(thread, EcmaString::Cast(ref->GetValue())), test), 0);
114 }
115
116 // String.fromCharCode(65, 66, 67)
HWTEST_F_L0(BuiltinsStringTest,fromCharCode1)117 HWTEST_F_L0(BuiltinsStringTest, fromCharCode1)
118 {
119 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
120 const double arg1 = 65;
121 const double arg2 = 66;
122 const double arg3 = 67;
123
124 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
125 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
126 ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
127 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(arg1));
128 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(arg2));
129 ecmaRuntimeCallInfo->SetCallArg(2, JSTaggedValue(arg3));
130
131 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
132 JSTaggedValue result = BuiltinsString::FromCharCode(ecmaRuntimeCallInfo);
133 ASSERT_TRUE(result.IsString());
134 JSTaggedValue value(static_cast<JSTaggedType>(result.GetRawData()));
135 JSHandle<JSTaggedValue> valueHandle(thread, JSTaggedValue(value.GetTaggedObject()));
136 JSHandle<EcmaString> test = factory->NewFromASCII("ABC");
137 ASSERT_EQ(EcmaStringAccessor::Compare(instance, JSHandle<EcmaString>::Cast(valueHandle), test), 0);
138 }
139
140 // String.fromCodePoint(65, 66, 67)
HWTEST_F_L0(BuiltinsStringTest,fromCodePoint1)141 HWTEST_F_L0(BuiltinsStringTest, fromCodePoint1)
142 {
143 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
144 const double arg1 = 65;
145 const double arg2 = 66;
146 const double arg3 = 67;
147
148 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
149 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
150 ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
151 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(arg1));
152 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(arg2));
153 ecmaRuntimeCallInfo->SetCallArg(2, JSTaggedValue(arg3));
154
155 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
156 JSTaggedValue result = BuiltinsString::FromCodePoint(ecmaRuntimeCallInfo);
157 ASSERT_TRUE(result.IsString());
158 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
159 JSHandle<EcmaString> test = factory->NewFromASCII("ABC");
160 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
161 }
162
163 // "abcabcabc".charAt(5)
HWTEST_F_L0(BuiltinsStringTest,charAt1)164 HWTEST_F_L0(BuiltinsStringTest, charAt1)
165 {
166 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
167 JSHandle<EcmaString> thisVal = factory->NewFromASCII("abcabcabc");
168
169 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
170 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
171 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
172 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(5)));
173
174 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
175 JSTaggedValue result = BuiltinsString::CharAt(ecmaRuntimeCallInfo);
176 ASSERT_TRUE(result.IsString());
177 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
178 JSHandle<EcmaString> test = factory->NewFromASCII("c");
179 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
180 }
181
182 // "一二三四".charAt(2)
HWTEST_F_L0(BuiltinsStringTest,charAt2)183 HWTEST_F_L0(BuiltinsStringTest, charAt2)
184 {
185 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
186 JSHandle<EcmaString> thisVal = factory->NewFromUtf8("一二三四");
187
188 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
189 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
190 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
191 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(2)));
192
193 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
194 JSTaggedValue result = BuiltinsString::CharAt(ecmaRuntimeCallInfo);
195 ASSERT_TRUE(result.IsString());
196 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
197 JSHandle<EcmaString> test = factory->NewFromUtf8("三");
198 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
199 }
200
201 // "abcabcabc".charAt(-1)
HWTEST_F_L0(BuiltinsStringTest,charAt3)202 HWTEST_F_L0(BuiltinsStringTest, charAt3)
203 {
204 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
205 JSHandle<EcmaString> thisVal = factory->NewFromASCII("abcabcabc");
206
207 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
208 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
209 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
210 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(-1)));
211
212 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
213 JSTaggedValue result = BuiltinsString::CharAt(ecmaRuntimeCallInfo);
214 ASSERT_TRUE(result.IsString());
215 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
216 JSHandle<EcmaString> test = factory->GetEmptyString();
217 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
218 }
219
220 // "ABC".charCodeAt(0)
HWTEST_F_L0(BuiltinsStringTest,charCodeAt1)221 HWTEST_F_L0(BuiltinsStringTest, charCodeAt1)
222 {
223 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
224 JSHandle<EcmaString> thisVal = factory->NewFromASCII("ABC");
225
226 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
227 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
228 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
229 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(0)));
230
231 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
232 JSTaggedValue result = BuiltinsString::CharCodeAt(ecmaRuntimeCallInfo);
233
234 ASSERT_EQ(result.GetRawData(), JSTaggedValue(65).GetRawData());
235 }
236
237 // "ABC".charCodeAt(-1)
HWTEST_F_L0(BuiltinsStringTest,charCodeAt2)238 HWTEST_F_L0(BuiltinsStringTest, charCodeAt2)
239 {
240 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
241 JSHandle<EcmaString> thisVal = factory->NewFromASCII("ABC");
242
243 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
244 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
245 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
246 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(-1)));
247
248 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
249 JSTaggedValue result = BuiltinsString::CharCodeAt(ecmaRuntimeCallInfo);
250
251 JSTaggedValue test = BuiltinsString::GetTaggedDouble(base::NAN_VALUE);
252 ASSERT_EQ(result.GetRawData(), test.GetRawData());
253 }
254
255 // "ABC".codePointAt(1)
HWTEST_F_L0(BuiltinsStringTest,codePointAt1)256 HWTEST_F_L0(BuiltinsStringTest, codePointAt1)
257 {
258 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
259 JSHandle<EcmaString> thisVal = factory->NewFromASCII("ABC");
260
261 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
262 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
263 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
264 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(1)));
265
266 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
267 JSTaggedValue result = BuiltinsString::CodePointAt(ecmaRuntimeCallInfo);
268
269 ASSERT_EQ(result.GetRawData(), JSTaggedValue(66).GetRawData());
270 }
271
272 // 'a'.concat('b', 'c', 'd')
HWTEST_F_L0(BuiltinsStringTest,concat1)273 HWTEST_F_L0(BuiltinsStringTest, concat1)
274 {
275 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
276 JSHandle<EcmaString> thisStr = factory->NewFromASCII("a");
277 JSHandle<EcmaString> val1 = factory->NewFromASCII("b");
278 JSHandle<EcmaString> val2 = factory->NewFromASCII("c");
279 JSHandle<EcmaString> val3 = factory->NewFromASCII("d");
280
281 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
282 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
283 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
284 ecmaRuntimeCallInfo->SetCallArg(0, val1.GetTaggedValue());
285 ecmaRuntimeCallInfo->SetCallArg(1, val2.GetTaggedValue());
286 ecmaRuntimeCallInfo->SetCallArg(2, val3.GetTaggedValue());
287
288 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
289 JSTaggedValue result = BuiltinsString::Concat(ecmaRuntimeCallInfo);
290 ASSERT_TRUE(result.IsString());
291 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
292 JSHandle<EcmaString> test = factory->NewFromASCII("abcd");
293 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
294 }
295
296 // "abcabcabc".indexof('b')
HWTEST_F_L0(BuiltinsStringTest,indexof1)297 HWTEST_F_L0(BuiltinsStringTest, indexof1)
298 {
299 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
300 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
301 JSHandle<EcmaString> val = factory->NewFromASCII("b");
302
303 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
304 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
305 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
306 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
307
308 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
309 JSTaggedValue result = BuiltinsString::IndexOf(ecmaRuntimeCallInfo);
310
311 ASSERT_EQ(result.GetRawData(), JSTaggedValue(1).GetRawData());
312 }
313
314 // "abcabcabc".indexof('b', 2)
HWTEST_F_L0(BuiltinsStringTest,indexof2)315 HWTEST_F_L0(BuiltinsStringTest, indexof2)
316 {
317 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
318 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
319 JSHandle<EcmaString> val = factory->NewFromASCII("b");
320
321 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
322 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
323 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
324 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
325 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<double>(2)));
326
327 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
328 JSTaggedValue result = BuiltinsString::IndexOf(ecmaRuntimeCallInfo);
329
330 ASSERT_EQ(result.GetRawData(), JSTaggedValue(4).GetRawData());
331 }
332
333 // "abcabcabc".indexof('d')
HWTEST_F_L0(BuiltinsStringTest,indexof3)334 HWTEST_F_L0(BuiltinsStringTest, indexof3)
335 {
336 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
337 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
338 JSHandle<EcmaString> val = factory->NewFromASCII("d");
339
340 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
341 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
342 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
343 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
344
345 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
346 JSTaggedValue result = BuiltinsString::IndexOf(ecmaRuntimeCallInfo);
347
348 ASSERT_EQ(result.GetRawData(), JSTaggedValue(-1).GetRawData());
349 }
350
351 // "abcabcabc".lastIndexOf('b')
HWTEST_F_L0(BuiltinsStringTest,lastIndexOf1)352 HWTEST_F_L0(BuiltinsStringTest, lastIndexOf1)
353 {
354 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
355 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
356 JSHandle<EcmaString> val = factory->NewFromASCII("b");
357
358 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
359 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
360 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
361 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
362
363 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
364 JSTaggedValue result = BuiltinsString::LastIndexOf(ecmaRuntimeCallInfo);
365
366 ASSERT_EQ(result.GetRawData(), JSTaggedValue(7).GetRawData());
367 }
368 // "abcabcabc".lastIndexOf('b', 2)
HWTEST_F_L0(BuiltinsStringTest,lastIndexOf2)369 HWTEST_F_L0(BuiltinsStringTest, lastIndexOf2)
370 {
371 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
372 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
373 JSHandle<EcmaString> val = factory->NewFromASCII("b");
374
375 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
376 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
377 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
378 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
379 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<double>(2)));
380
381 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
382 JSTaggedValue result = BuiltinsString::LastIndexOf(ecmaRuntimeCallInfo);
383
384 ASSERT_EQ(result.GetRawData(), JSTaggedValue(1).GetRawData());
385 }
386
387 // "abcabcabc".lastIndexOf('d')
HWTEST_F_L0(BuiltinsStringTest,lastIndexOf3)388 HWTEST_F_L0(BuiltinsStringTest, lastIndexOf3)
389 {
390 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
391 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
392 JSHandle<EcmaString> val = factory->NewFromASCII("d");
393
394 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
395 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
396 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
397 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
398
399 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
400 JSTaggedValue result = BuiltinsString::LastIndexOf(ecmaRuntimeCallInfo);
401
402 ASSERT_EQ(result.GetRawData(), JSTaggedValue(-1).GetRawData());
403 }
404
405 // "abcabcabc".includes('b')
HWTEST_F_L0(BuiltinsStringTest,Includes2)406 HWTEST_F_L0(BuiltinsStringTest, Includes2)
407 {
408 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
409 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
410 JSHandle<EcmaString> val = factory->NewFromASCII("b");
411
412 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
413 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
414 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
415 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
416
417 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
418 JSTaggedValue result = BuiltinsString::Includes(ecmaRuntimeCallInfo);
419
420 ASSERT_EQ(result.GetRawData(), JSTaggedValue::True().GetRawData());
421 }
422
423 // "abccccccc".includes('b',2)
HWTEST_F_L0(BuiltinsStringTest,Includes3)424 HWTEST_F_L0(BuiltinsStringTest, Includes3)
425 {
426 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
427 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abccccccc");
428 JSHandle<EcmaString> val = factory->NewFromASCII("b");
429
430 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
431 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
432 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
433 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
434 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<double>(2)));
435
436 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
437 JSTaggedValue result = BuiltinsString::Includes(ecmaRuntimeCallInfo);
438
439 ASSERT_EQ(result.GetRawData(), JSTaggedValue::False().GetRawData());
440 }
441
442 // "一二三四".includes('二')
HWTEST_F_L0(BuiltinsStringTest,Includes4)443 HWTEST_F_L0(BuiltinsStringTest, Includes4)
444 {
445 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
446 JSHandle<EcmaString> thisStr = factory->NewFromUtf8("一二三四");
447 JSHandle<EcmaString> val = factory->NewFromUtf8("二");
448
449 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
450 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
451 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
452 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
453
454 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
455 JSTaggedValue result = BuiltinsString::Includes(ecmaRuntimeCallInfo);
456
457 ASSERT_EQ(result.GetRawData(), JSTaggedValue::True().GetRawData());
458 }
459
460 // "To be, or not to be, that is the question.".startsWith('To be')
HWTEST_F_L0(BuiltinsStringTest,startsWith1)461 HWTEST_F_L0(BuiltinsStringTest, startsWith1)
462 {
463 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
464 JSHandle<EcmaString> thisStr = factory->NewFromASCII("To be, or not to be, that is the question.");
465 JSHandle<EcmaString> val = factory->NewFromASCII("To be");
466
467 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
468 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
469 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
470 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
471
472 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
473 JSTaggedValue result = BuiltinsString::StartsWith(ecmaRuntimeCallInfo);
474
475 ASSERT_EQ(result.GetRawData(), JSTaggedValue::True().GetRawData());
476 }
477
478 // "To be, or not to be, that is the question.".startsWith('not to be')
HWTEST_F_L0(BuiltinsStringTest,startsWith2)479 HWTEST_F_L0(BuiltinsStringTest, startsWith2)
480 {
481 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
482 JSHandle<EcmaString> thisStr = factory->NewFromASCII("To be, or not to be, that is the question.");
483 JSHandle<EcmaString> val = factory->NewFromASCII("not to be");
484
485 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
486 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
487 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
488 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
489
490 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
491 JSTaggedValue result = BuiltinsString::StartsWith(ecmaRuntimeCallInfo);
492
493 ASSERT_EQ(result.GetRawData(), JSTaggedValue::False().GetRawData());
494 }
495
496 // "To be, or not to be, that is the question.".startsWith('not to be', 10)
HWTEST_F_L0(BuiltinsStringTest,startsWith3)497 HWTEST_F_L0(BuiltinsStringTest, startsWith3)
498 {
499 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
500 JSHandle<EcmaString> thisStr = factory->NewFromASCII("To be, or not to be, that is the question.");
501 JSHandle<EcmaString> val = factory->NewFromASCII("not to be");
502
503 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
504 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
505 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
506 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
507 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<double>(10)));
508
509 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
510 JSTaggedValue result = BuiltinsString::StartsWith(ecmaRuntimeCallInfo);
511
512 ASSERT_EQ(result.GetRawData(), JSTaggedValue::True().GetRawData());
513 }
514
515 // "To be, or not to be, that is the question.".endsWith('question.')
HWTEST_F_L0(BuiltinsStringTest,endsWith1)516 HWTEST_F_L0(BuiltinsStringTest, endsWith1)
517 {
518 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
519 JSHandle<EcmaString> thisStr = factory->NewFromASCII("To be, or not to be, that is the question.");
520 JSHandle<EcmaString> val = factory->NewFromASCII("question.");
521
522 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
523 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
524 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
525 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
526
527 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
528 JSTaggedValue result = BuiltinsString::EndsWith(ecmaRuntimeCallInfo);
529
530 ASSERT_EQ(result.GetRawData(), JSTaggedValue::True().GetRawData());
531 }
532
533 // "To be, or not to be, that is the question.".endsWith('to be')
HWTEST_F_L0(BuiltinsStringTest,endsWith2)534 HWTEST_F_L0(BuiltinsStringTest, endsWith2)
535 {
536 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
537 JSHandle<EcmaString> thisStr = factory->NewFromASCII("To be, or not to be, that is the question.");
538 JSHandle<EcmaString> val = factory->NewFromASCII("to be");
539
540 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
541 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
542 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
543 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
544
545 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
546 JSTaggedValue result = BuiltinsString::EndsWith(ecmaRuntimeCallInfo);
547
548 ASSERT_EQ(result.GetRawData(), JSTaggedValue::False().GetRawData());
549 }
550
551 // "To be, or not to be, that is the question.".endsWith('to be', 19)
HWTEST_F_L0(BuiltinsStringTest,endsWith3)552 HWTEST_F_L0(BuiltinsStringTest, endsWith3)
553 {
554 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
555 JSHandle<EcmaString> thisStr = factory->NewFromASCII("To be, or not to be, that is the question.");
556 JSHandle<EcmaString> val = factory->NewFromASCII("to be");
557
558 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
559 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
560 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
561 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
562 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<double>(19)));
563
564 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
565 JSTaggedValue result = BuiltinsString::EndsWith(ecmaRuntimeCallInfo);
566
567 ASSERT_EQ(result.GetRawData(), JSTaggedValue::True().GetRawData());
568 }
569
570 // "有ABC".toLocaleLowerCase()
HWTEST_F_L0(BuiltinsStringTest,toLocaleLowerCase2)571 HWTEST_F_L0(BuiltinsStringTest, toLocaleLowerCase2)
572 {
573 ASSERT_NE(thread, nullptr);
574 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
575 JSHandle<EcmaString> thisStr = factory->NewFromUtf8("有ABC");
576
577 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
578 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
579 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
580
581 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
582 JSTaggedValue result = BuiltinsString::ToLocaleLowerCase(ecmaRuntimeCallInfo);
583 ASSERT_TRUE(result.IsString());
584 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
585 JSHandle<EcmaString> test = factory->NewFromUtf8("有abc");
586 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
587 }
588
589 // "ABC".toLowerCase()
HWTEST_F_L0(BuiltinsStringTest,toLowerCase1)590 HWTEST_F_L0(BuiltinsStringTest, toLowerCase1)
591 {
592 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
593 JSHandle<EcmaString> thisStr = factory->NewFromASCII("ABC");
594
595 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
596 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
597 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
598
599 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
600 JSTaggedValue result = BuiltinsString::ToLowerCase(ecmaRuntimeCallInfo);
601 ASSERT_TRUE(result.IsString());
602 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
603 JSHandle<EcmaString> test = factory->NewFromASCII("abc");
604 ASSERT_TRUE(JSTaggedValue::SameValue(resultHandle.GetTaggedValue(), test.GetTaggedValue()));
605 }
606
607 // "abc".toUpperCase()
HWTEST_F_L0(BuiltinsStringTest,toUpperCase1)608 HWTEST_F_L0(BuiltinsStringTest, toUpperCase1)
609 {
610 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
611 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abc");
612
613 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
614 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
615 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
616
617 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
618 JSTaggedValue result = BuiltinsString::ToUpperCase(ecmaRuntimeCallInfo);
619 ASSERT_TRUE(result.IsString());
620 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
621 JSHandle<EcmaString> test = factory->NewFromASCII("ABC");
622 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
623 }
624
625 // "abc".localecompare('b')
HWTEST_F_L0(BuiltinsStringTest,localecompare1)626 HWTEST_F_L0(BuiltinsStringTest, localecompare1)
627 {
628 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
629 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abc");
630 JSHandle<EcmaString> val = factory->NewFromASCII("b");
631
632 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
633 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
634 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
635 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
636
637 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
638 JSTaggedValue result = BuiltinsString::LocaleCompare(ecmaRuntimeCallInfo);
639
640 ASSERT_EQ(result.GetRawData(), JSTaggedValue(-1).GetRawData());
641 }
642
643 // "abc".localecompare('abc')
HWTEST_F_L0(BuiltinsStringTest,localecompare2)644 HWTEST_F_L0(BuiltinsStringTest, localecompare2)
645 {
646 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
647 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abc");
648 JSHandle<EcmaString> val = factory->NewFromASCII("abc");
649
650 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
651 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
652 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
653 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
654
655 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
656 JSTaggedValue result = BuiltinsString::LocaleCompare(ecmaRuntimeCallInfo);
657
658 ASSERT_EQ(result.GetRawData(), JSTaggedValue(0).GetRawData());
659 }
660
661 // "abc".localecompare('aa')
HWTEST_F_L0(BuiltinsStringTest,localecompare3)662 HWTEST_F_L0(BuiltinsStringTest, localecompare3)
663 {
664 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
665 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abc");
666 JSHandle<EcmaString> val = factory->NewFromASCII("aa");
667
668 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
669 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
670 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
671 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
672
673 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
674 JSTaggedValue result = BuiltinsString::LocaleCompare(ecmaRuntimeCallInfo);
675
676 ASSERT_EQ(result.GetRawData(), JSTaggedValue(1).GetRawData());
677 }
678
679 // "你好".localecompare('辅助')
HWTEST_F_L0(BuiltinsStringTest,localecompare4)680 HWTEST_F_L0(BuiltinsStringTest, localecompare4)
681 {
682 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
683 std::string referenceStr = "你好";
684 std::string compareStr = "辅助";
685 JSHandle<EcmaString> thisStr = factory->NewFromStdString(referenceStr);
686 JSHandle<EcmaString> val = factory->NewFromStdString(compareStr);
687 JSHandle<EcmaString> locale = factory->NewFromASCII("zh-Hans");
688
689 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
690 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
691 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
692 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
693 ecmaRuntimeCallInfo->SetCallArg(1, locale.GetTaggedValue());
694
695 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
696 JSTaggedValue result = BuiltinsString::LocaleCompare(ecmaRuntimeCallInfo);
697 TestHelper::TearDownFrame(thread, prev);
698
699 ASSERT_GT(result.GetRawData(), JSTaggedValue(0).GetRawData());
700 }
701
702 // Test localeCompare when locales changed
HWTEST_F_L0(BuiltinsStringTest,localecompare5)703 HWTEST_F_L0(BuiltinsStringTest, localecompare5)
704 {
705 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
706 std::string referenceStr = "ä";
707 std::string compareStr = "z";
708 JSHandle<EcmaString> thisStr = factory->NewFromStdString(referenceStr);
709 JSHandle<EcmaString> val = factory->NewFromStdString(compareStr);
710 JSHandle<EcmaString> locale = factory->NewFromASCII("de");
711
712 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
713 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
714 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
715 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
716 ecmaRuntimeCallInfo->SetCallArg(1, locale.GetTaggedValue());
717
718 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
719 JSTaggedValue result = BuiltinsString::LocaleCompare(ecmaRuntimeCallInfo);
720 TestHelper::TearDownFrame(thread, prev1);
721 ASSERT_EQ(result.GetRawData(), JSTaggedValue(-1).GetRawData());
722
723 auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
724 ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
725 ecmaRuntimeCallInfo1->SetThis(thisStr.GetTaggedValue());
726 ecmaRuntimeCallInfo1->SetCallArg(0, val.GetTaggedValue());
727 // change locale
728 ecmaRuntimeCallInfo1->SetCallArg(1, JSTaggedValue::Undefined());
729 [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
730 JSTaggedValue result1 = BuiltinsString::LocaleCompare(ecmaRuntimeCallInfo1);
731 TestHelper::TearDownFrame(thread, prev2);
732 ASSERT_EQ(result1.GetRawData(), JSTaggedValue(-1).GetRawData());
733 }
734
735 // "abc".normalize('NFC')
HWTEST_F_L0(BuiltinsStringTest,normalize1)736 HWTEST_F_L0(BuiltinsStringTest, normalize1)
737 {
738 ASSERT_NE(thread, nullptr);
739 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
740 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abc");
741 JSHandle<EcmaString> val = factory->NewFromASCII("NFC");
742
743 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
744 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
745 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
746 ecmaRuntimeCallInfo->SetCallArg(0, val.GetTaggedValue());
747
748 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
749 JSTaggedValue result = BuiltinsString::Normalize(ecmaRuntimeCallInfo);
750 ASSERT_TRUE(result.IsString());
751 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
752 JSHandle<EcmaString> test = factory->NewFromASCII("abc");
753 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
754 }
755
756 // "abc".repeat(5)
HWTEST_F_L0(BuiltinsStringTest,repeat1)757 HWTEST_F_L0(BuiltinsStringTest, repeat1)
758 {
759 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
760 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abc");
761
762 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
763 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
764 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
765 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(5)));
766
767 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
768 JSTaggedValue result = BuiltinsString::Repeat(ecmaRuntimeCallInfo);
769 ASSERT_TRUE(result.IsString());
770 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
771 JSHandle<EcmaString> test = factory->NewFromASCII("abcabcabcabcabc");
772 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
773 }
774
775 // 'The morning is upon us.'.slice(4, -2)
HWTEST_F_L0(BuiltinsStringTest,slice1)776 HWTEST_F_L0(BuiltinsStringTest, slice1)
777 {
778 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
779 JSHandle<EcmaString> thisStr = factory->NewFromASCII("The morning is upon us.");
780
781 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
782 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
783 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
784 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(4)));
785 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<double>(-2)));
786
787 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
788 JSTaggedValue result = BuiltinsString::Slice(ecmaRuntimeCallInfo);
789 ASSERT_TRUE(result.IsString());
790 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
791 JSHandle<EcmaString> test = factory->NewFromASCII("morning is upon u");
792 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
793 }
794
795 // 'The morning is upon us.'.slice(12)
HWTEST_F_L0(BuiltinsStringTest,slice2)796 HWTEST_F_L0(BuiltinsStringTest, slice2)
797 {
798 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
799 JSHandle<EcmaString> thisStr = factory->NewFromASCII("The morning is upon us.");
800
801 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
802 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
803 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
804 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(12)));
805
806 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
807 JSTaggedValue result = BuiltinsString::Slice(ecmaRuntimeCallInfo);
808 ASSERT_TRUE(result.IsString());
809 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
810 JSHandle<EcmaString> test = factory->NewFromASCII("is upon us.");
811 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
812 }
813
814 // 'Mozilla'.substring(3, -3)
HWTEST_F_L0(BuiltinsStringTest,substring1)815 HWTEST_F_L0(BuiltinsStringTest, substring1)
816 {
817 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
818 JSHandle<EcmaString> thisStr = factory->NewFromASCII("Mozilla");
819
820 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
821 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
822 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
823 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(3)));
824 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<double>(-3)));
825
826 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
827 JSTaggedValue result = BuiltinsString::Substring(ecmaRuntimeCallInfo);
828 ASSERT_TRUE(result.IsString());
829 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
830 JSHandle<EcmaString> test = factory->NewFromASCII("Moz");
831 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
832 }
833
834 // 'Mozilla'.substring(7, 4)
HWTEST_F_L0(BuiltinsStringTest,substring2)835 HWTEST_F_L0(BuiltinsStringTest, substring2)
836 {
837 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
838 JSHandle<EcmaString> thisStr = factory->NewFromASCII("Mozilla");
839
840 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
841 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
842 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
843 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(7)));
844 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<double>(4)));
845
846 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
847 JSTaggedValue result = BuiltinsString::Substring(ecmaRuntimeCallInfo);
848 ASSERT_TRUE(result.IsString());
849 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
850 JSHandle<EcmaString> test = factory->NewFromASCII("lla");
851 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
852 }
853
854 // " Hello world! ".trim()
HWTEST_F_L0(BuiltinsStringTest,trim1)855 HWTEST_F_L0(BuiltinsStringTest, trim1)
856 {
857 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
858 JSHandle<EcmaString> thisStr = factory->NewFromASCII(" Hello world! ");
859
860 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
861 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
862 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
863
864 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
865 JSTaggedValue result = BuiltinsString::Trim(ecmaRuntimeCallInfo);
866 ASSERT_TRUE(result.IsString());
867 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
868 JSHandle<EcmaString> test = factory->NewFromASCII("Hello world!");
869 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
870 }
871
HWTEST_F_L0(BuiltinsStringTest,trim2)872 HWTEST_F_L0(BuiltinsStringTest, trim2)
873 {
874 auto ecmaVM = thread->GetEcmaVM();
875 JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
876
877 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
878 JSHandle<EcmaString> thisStr = factory->NewFromASCII(" Hello world! ");
879 JSHandle<JSFunction> stringObject(env->GetStringFunction());
880 JSHandle<JSTaggedValue> value(thread, JSTaggedValue(thisStr.GetTaggedValue().GetTaggedObject()));
881 JSHandle<JSPrimitiveRef> str = factory->NewJSPrimitiveRef(stringObject, value);
882
883 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
884 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
885 ecmaRuntimeCallInfo->SetThis(str.GetTaggedValue());
886
887 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
888 JSTaggedValue result = BuiltinsString::Trim(ecmaRuntimeCallInfo);
889 ASSERT_TRUE(result.IsString());
890 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
891 JSHandle<EcmaString> test = factory->NewFromASCII("Hello world!");
892 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
893 }
894
HWTEST_F_L0(BuiltinsStringTest,trimRight)895 HWTEST_F_L0(BuiltinsStringTest, trimRight)
896 {
897 auto ecmaVM = thread->GetEcmaVM();
898 JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
899
900 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
901 JSHandle<EcmaString> thisStr = factory->NewFromASCII(" ");
902 JSHandle<JSFunction> stringObject(env->GetStringFunction());
903 JSHandle<JSTaggedValue> value(thread, JSTaggedValue(thisStr.GetTaggedValue().GetTaggedObject()));
904 JSHandle<JSPrimitiveRef> str = factory->NewJSPrimitiveRef(stringObject, value);
905
906 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
907 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
908 ecmaRuntimeCallInfo->SetThis(str.GetTaggedValue());
909
910 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
911 JSTaggedValue result = BuiltinsString::TrimRight(ecmaRuntimeCallInfo);
912 ASSERT_TRUE(result.IsString());
913 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
914 JSHandle<EcmaString> test = factory->NewFromASCII("");
915 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
916 }
917
HWTEST_F_L0(BuiltinsStringTest,ToString)918 HWTEST_F_L0(BuiltinsStringTest, ToString)
919 {
920 auto ecmaVM = thread->GetEcmaVM();
921 JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
922
923 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
924 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
925 JSHandle<JSFunction> stringObject(env->GetStringFunction());
926 JSHandle<JSTaggedValue> value(thread, JSTaggedValue(thisStr.GetTaggedValue().GetTaggedObject()));
927 JSHandle<JSPrimitiveRef> str = factory->NewJSPrimitiveRef(stringObject, value);
928
929 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
930 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
931 ecmaRuntimeCallInfo->SetThis(str.GetTaggedValue());
932
933 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
934 JSTaggedValue result = BuiltinsString::ToString(ecmaRuntimeCallInfo);
935 ASSERT_TRUE(result.IsString());
936 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
937 JSTaggedValue test = JSTaggedValue(*thisStr);
938 ASSERT_EQ(result.GetRawData(), test.GetRawData());
939 }
940
HWTEST_F_L0(BuiltinsStringTest,ValueOf)941 HWTEST_F_L0(BuiltinsStringTest, ValueOf)
942 {
943 auto ecmaVM = thread->GetEcmaVM();
944 JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
945
946 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
947 JSHandle<EcmaString> thisStr = factory->NewFromASCII("abcabcabc");
948 JSHandle<JSFunction> stringObject(env->GetStringFunction());
949 JSHandle<JSTaggedValue> value(thread, JSTaggedValue(thisStr.GetTaggedValue().GetTaggedObject()));
950 JSHandle<JSPrimitiveRef> str = factory->NewJSPrimitiveRef(stringObject, value);
951
952 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
953 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
954 ecmaRuntimeCallInfo->SetThis(str.GetTaggedValue());
955
956 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
957 JSTaggedValue result = BuiltinsString::ValueOf(ecmaRuntimeCallInfo);
958 ASSERT_TRUE(result.IsString());
959 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
960 JSTaggedValue test = JSTaggedValue(*thisStr);
961 ASSERT_EQ(result.GetRawData(), test.GetRawData());
962 }
963
BuiltinsStringTestCreate(JSThread * thread)964 static inline JSFunction *BuiltinsStringTestCreate(JSThread *thread)
965 {
966 EcmaVM *ecmaVM = thread->GetEcmaVM();
967 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
968 return globalEnv->GetObjectFunction().GetObject<JSFunction>();
969 }
970
HWTEST_F_L0(BuiltinsStringTest,Raw)971 HWTEST_F_L0(BuiltinsStringTest, Raw)
972 {
973 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
974 JSHandle<JSTaggedValue> foo(factory->NewFromASCII("foo"));
975 JSHandle<JSTaggedValue> bar(factory->NewFromASCII("bar"));
976 JSHandle<JSTaggedValue> baz(factory->NewFromASCII("baz"));
977 JSHandle<JSTaggedValue> rawArray = JSHandle<JSTaggedValue>::Cast(JSArray::ArrayCreate(thread, JSTaggedNumber(0)));
978 JSHandle<JSObject> obj(rawArray);
979 JSHandle<JSTaggedValue> key0(thread, JSTaggedValue(0));
980 PropertyDescriptor desc0(thread, foo);
981 JSArray::DefineOwnProperty(thread, obj, key0, desc0);
982 JSHandle<JSTaggedValue> key1(thread, JSTaggedValue(1));
983 PropertyDescriptor desc1(thread, bar);
984 JSArray::DefineOwnProperty(thread, obj, key1, desc1);
985 JSHandle<JSTaggedValue> key2(thread, JSTaggedValue(2));
986 PropertyDescriptor desc2(thread, baz);
987 JSArray::DefineOwnProperty(thread, obj, key2, desc2);
988
989 JSHandle<JSTaggedValue> constructor(thread, BuiltinsStringTestCreate(thread));
990 JSHandle<JSTaggedValue> templateString(
991 factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor));
992 JSHandle<JSTaggedValue> rawKey(factory->NewFromASCII("raw"));
993 JSObject::SetProperty(thread, templateString, rawKey, rawArray);
994 JSHandle<EcmaString> test = factory->NewFromASCII("foo5barJavaScriptbaz");
995
996 JSHandle<EcmaString> javascript = factory->NewFromASCII("JavaScript");
997
998 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
999 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1000 ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
1001 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(templateString.GetObject<EcmaString>()));
1002 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(5)));
1003 ecmaRuntimeCallInfo->SetCallArg(2, javascript.GetTaggedValue());
1004
1005 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1006 JSTaggedValue result = BuiltinsString::Raw(ecmaRuntimeCallInfo);
1007 ASSERT_TRUE(result.IsString());
1008 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(reinterpret_cast<EcmaString *>(result.GetRawData()), *test));
1009 }
1010
HWTEST_F_L0(BuiltinsStringTest,Replace)1011 HWTEST_F_L0(BuiltinsStringTest, Replace)
1012 {
1013 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1014 JSHandle<EcmaString> thisStr = factory->NewFromASCII("Twas the night before Xmas...");
1015 JSHandle<EcmaString> searchStr = factory->NewFromASCII("Xmas");
1016 JSHandle<EcmaString> replaceStr = factory->NewFromASCII("Christmas");
1017 JSHandle<EcmaString> expected = factory->NewFromASCII("Twas the night before Christmas...");
1018
1019 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1020 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1021 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
1022 ecmaRuntimeCallInfo->SetCallArg(0, searchStr.GetTaggedValue());
1023 ecmaRuntimeCallInfo->SetCallArg(1, replaceStr.GetTaggedValue());
1024
1025 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1026 JSTaggedValue result = BuiltinsString::Replace(ecmaRuntimeCallInfo);
1027 TestHelper::TearDownFrame(thread, prev);
1028
1029 ASSERT_TRUE(result.IsString());
1030 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(reinterpret_cast<EcmaString *>(result.GetRawData()), *expected));
1031
1032 JSHandle<EcmaString> replaceStr1 = factory->NewFromASCII("abc$$");
1033 JSHandle<EcmaString> expected1 = factory->NewFromASCII("Twas the night before abc$...");
1034
1035 auto ecmaRuntimeCallInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1036 ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
1037 ecmaRuntimeCallInfo1->SetThis(thisStr.GetTaggedValue());
1038 ecmaRuntimeCallInfo1->SetCallArg(0, searchStr.GetTaggedValue());
1039 ecmaRuntimeCallInfo1->SetCallArg(1, replaceStr1.GetTaggedValue());
1040
1041 prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
1042 JSTaggedValue result1 = BuiltinsString::Replace(ecmaRuntimeCallInfo1);
1043 TestHelper::TearDownFrame(thread, prev);
1044
1045 JSHandle<EcmaString> resultString1(thread, result1);
1046 ASSERT_TRUE(result1.IsString());
1047 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*resultString1, *expected1));
1048
1049 JSHandle<EcmaString> replaceStr2 = factory->NewFromASCII("abc$$dd");
1050 JSHandle<EcmaString> expected2 = factory->NewFromASCII("Twas the night before abc$dd...");
1051
1052 auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1053 ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
1054 ecmaRuntimeCallInfo2->SetThis(thisStr.GetTaggedValue());
1055 ecmaRuntimeCallInfo2->SetCallArg(0, searchStr.GetTaggedValue());
1056 ecmaRuntimeCallInfo2->SetCallArg(1, replaceStr2.GetTaggedValue());
1057
1058 prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
1059 JSTaggedValue result2 = BuiltinsString::Replace(ecmaRuntimeCallInfo2);
1060 TestHelper::TearDownFrame(thread, prev);
1061
1062 JSHandle<EcmaString> resultString2(thread, result2);
1063 ASSERT_TRUE(result2.IsString());
1064 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*resultString2, *expected2));
1065
1066 JSHandle<EcmaString> replaceStr3 = factory->NewFromASCII("abc$&dd");
1067 JSHandle<EcmaString> expected3 = factory->NewFromASCII("Twas the night before abcXmasdd...");
1068
1069 auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1070 ecmaRuntimeCallInfo3->SetFunction(JSTaggedValue::Undefined());
1071 ecmaRuntimeCallInfo3->SetThis(thisStr.GetTaggedValue());
1072 ecmaRuntimeCallInfo3->SetCallArg(0, searchStr.GetTaggedValue());
1073 ecmaRuntimeCallInfo3->SetCallArg(1, replaceStr3.GetTaggedValue());
1074
1075 prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
1076 JSTaggedValue result3 = BuiltinsString::Replace(ecmaRuntimeCallInfo3);
1077 TestHelper::TearDownFrame(thread, prev);
1078
1079 JSHandle<EcmaString> resultString3(thread, result3);
1080 ASSERT_TRUE(result3.IsString());
1081 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*resultString3, *expected3));
1082
1083 JSHandle<EcmaString> replaceStr4 = factory->NewFromASCII("abc$`dd");
1084 JSHandle<EcmaString> expected4 =
1085 factory->NewFromASCII("Twas the night before abcTwas the night before dd...");
1086
1087 auto ecmaRuntimeCallInfo4 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1088 ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
1089 ecmaRuntimeCallInfo4->SetThis(thisStr.GetTaggedValue());
1090 ecmaRuntimeCallInfo4->SetCallArg(0, searchStr.GetTaggedValue());
1091 ecmaRuntimeCallInfo4->SetCallArg(1, replaceStr4.GetTaggedValue());
1092
1093 prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
1094 JSTaggedValue result4 = BuiltinsString::Replace(ecmaRuntimeCallInfo4);
1095 TestHelper::TearDownFrame(thread, prev);
1096
1097 JSHandle<EcmaString> resultString4(thread, result4);
1098 ASSERT_TRUE(result4.IsString());
1099 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*resultString4, *expected4));
1100 }
1101
HWTEST_F_L0(BuiltinsStringTest,Replace2)1102 HWTEST_F_L0(BuiltinsStringTest, Replace2)
1103 {
1104 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1105 JSHandle<EcmaString> thisStr = factory->NewFromASCII("Twas the night before Xmas...");
1106 JSHandle<EcmaString> searchStr = factory->NewFromASCII("Xmas");
1107 JSHandle<EcmaString> replaceStr = factory->NewFromASCII("abc$\'dd");
1108 JSHandle<EcmaString> expected = factory->NewFromASCII("Twas the night before abc...dd...");
1109
1110 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1111 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1112 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
1113 ecmaRuntimeCallInfo->SetCallArg(0, searchStr.GetTaggedValue());
1114 ecmaRuntimeCallInfo->SetCallArg(1, replaceStr.GetTaggedValue());
1115
1116 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1117 JSTaggedValue result = BuiltinsString::Replace(ecmaRuntimeCallInfo);
1118 TestHelper::TearDownFrame(thread, prev);
1119
1120 ASSERT_TRUE(result.IsString());
1121 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(reinterpret_cast<EcmaString *>(result.GetRawData()), *expected));
1122
1123 JSHandle<EcmaString> replaceStr2 = factory->NewFromASCII("abc$`dd$\'$ff");
1124 JSHandle<EcmaString> expected2 =
1125 factory->NewFromASCII("Twas the night before abcTwas the night before dd...$ff...");
1126
1127 auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1128 ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
1129 ecmaRuntimeCallInfo2->SetThis(thisStr.GetTaggedValue());
1130 ecmaRuntimeCallInfo2->SetCallArg(0, searchStr.GetTaggedValue());
1131 ecmaRuntimeCallInfo2->SetCallArg(1, replaceStr2.GetTaggedValue());
1132
1133 prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
1134 JSTaggedValue result2 = BuiltinsString::Replace(ecmaRuntimeCallInfo2);
1135 TestHelper::TearDownFrame(thread, prev);
1136
1137 JSHandle<EcmaString> resultString2(thread, result2);
1138 ASSERT_TRUE(result2.IsString());
1139 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*resultString2, *expected2));
1140
1141 JSHandle<EcmaString> replaceStr3 = factory->NewFromASCII("abc$`dd$\'$");
1142 JSHandle<EcmaString> expected3 =
1143 factory->NewFromASCII("Twas the night before abcTwas the night before dd...$...");
1144
1145 auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1146 ecmaRuntimeCallInfo3->SetFunction(JSTaggedValue::Undefined());
1147 ecmaRuntimeCallInfo3->SetThis(thisStr.GetTaggedValue());
1148 ecmaRuntimeCallInfo3->SetCallArg(0, searchStr.GetTaggedValue());
1149 ecmaRuntimeCallInfo3->SetCallArg(1, replaceStr3.GetTaggedValue());
1150
1151 prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
1152 JSTaggedValue result3 = BuiltinsString::Replace(ecmaRuntimeCallInfo3);
1153 TestHelper::TearDownFrame(thread, prev);
1154
1155 JSHandle<EcmaString> resultString3(thread, result3);
1156 ASSERT_TRUE(result3.IsString());
1157 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*resultString3, *expected3));
1158
1159 JSHandle<EcmaString> replaceStr4 = factory->NewFromASCII("abc$`dd$$");
1160 JSHandle<EcmaString> expected4 =
1161 factory->NewFromASCII("Twas the night before abcTwas the night before dd$...");
1162
1163 auto ecmaRuntimeCallInfo4 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1164 ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
1165 ecmaRuntimeCallInfo4->SetThis(thisStr.GetTaggedValue());
1166 ecmaRuntimeCallInfo4->SetCallArg(0, searchStr.GetTaggedValue());
1167 ecmaRuntimeCallInfo4->SetCallArg(1, replaceStr4.GetTaggedValue());
1168
1169 prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
1170 JSTaggedValue result4 = BuiltinsString::Replace(ecmaRuntimeCallInfo4);
1171 TestHelper::TearDownFrame(thread, prev);
1172
1173 ASSERT_TRUE(result4.IsString());
1174 JSHandle<EcmaString> resultString4(thread, result4);
1175 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*resultString4, *expected4));
1176 }
1177
HWTEST_F_L0(BuiltinsStringTest,Replace3)1178 HWTEST_F_L0(BuiltinsStringTest, Replace3)
1179 {
1180 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1181 JSHandle<EcmaString> thisStr = factory->NewFromASCII("Twas the night before Xmas...");
1182 JSHandle<EcmaString> searchStr = factory->NewFromASCII("Xmas");
1183 JSHandle<EcmaString> replaceStr = factory->NewFromASCII("$&a $` $\' $2 $01 $$1 $21 $32 a");
1184 JSHandle<EcmaString> expected = factory->NewFromASCII(
1185 "Twas the night before Xmasa Twas the night before ... $2 $01 $1 $21 $32 a...");
1186
1187 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1188 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1189 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
1190 ecmaRuntimeCallInfo->SetCallArg(0, searchStr.GetTaggedValue());
1191 ecmaRuntimeCallInfo->SetCallArg(1, replaceStr.GetTaggedValue());
1192
1193 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1194 JSTaggedValue result = BuiltinsString::Replace(ecmaRuntimeCallInfo);
1195
1196 ASSERT_TRUE(result.IsString());
1197 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(reinterpret_cast<EcmaString *>(result.GetRawData()), *expected));
1198 }
1199
HWTEST_F_L0(BuiltinsStringTest,Replace4)1200 HWTEST_F_L0(BuiltinsStringTest, Replace4)
1201 {
1202 // invoke RegExpConstructor method
1203 JSHandle<EcmaString> pattern1 =
1204 thread->GetEcmaVM()->GetFactory()->NewFromASCII("quick\\s(brown).+?(jumps)");
1205 JSHandle<EcmaString> flags1 = thread->GetEcmaVM()->GetFactory()->NewFromASCII("iug");
1206 JSTaggedValue result1 = CreateBuiltinsStringRegExpObjByPatternAndFlags(thread, pattern1, flags1);
1207 JSHandle<JSRegExp> searchStr(thread, reinterpret_cast<JSRegExp *>(result1.GetRawData()));
1208 JSHandle<EcmaString> expected = thread->GetEcmaVM()->GetFactory()->NewFromASCII(
1209 "The Quick Brown Fox Jumpsa The Over The Lazy Dog Jumps Brown $1 Jumps1 $32 a Over The Lazy Dog");
1210
1211 // make ecma_runtime_call_info2
1212 JSHandle<EcmaString> thisStr =
1213 thread->GetEcmaVM()->GetFactory()->NewFromASCII("The Quick Brown Fox Jumps Over The Lazy Dog");
1214 JSHandle<EcmaString> replaceStr =
1215 thread->GetEcmaVM()->GetFactory()->NewFromASCII("$&a $` $\' $2 $01 $$1 $21 $32 a");
1216
1217 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1218 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1219 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
1220 ecmaRuntimeCallInfo->SetCallArg(0, searchStr.GetTaggedValue());
1221 ecmaRuntimeCallInfo->SetCallArg(1, replaceStr.GetTaggedValue());
1222
1223 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1224 JSTaggedValue result = BuiltinsString::Replace(ecmaRuntimeCallInfo);
1225
1226 ASSERT_TRUE(result.IsString());
1227 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(reinterpret_cast<EcmaString *>(result.GetRawData()), *expected));
1228 }
1229
HWTEST_F_L0(BuiltinsStringTest,Split)1230 HWTEST_F_L0(BuiltinsStringTest, Split)
1231 {
1232 // invoke RegExpConstructor method
1233 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1234 JSHandle<EcmaString> thisStr = factory->NewFromASCII("Hello World. How are you doing?");
1235 JSHandle<EcmaString> separatorStr = factory->NewFromASCII(" ");
1236 JSHandle<JSTaggedValue> limit(thread, JSTaggedValue(3));
1237 JSHandle<EcmaString> expected1 = factory->NewFromASCII("Hello");
1238 JSHandle<EcmaString> expected2 = factory->NewFromASCII("World.");
1239 JSHandle<EcmaString> expected3 = factory->NewFromASCII("How");
1240
1241 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1242 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1243 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
1244 ecmaRuntimeCallInfo->SetCallArg(0, separatorStr.GetTaggedValue());
1245 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(3)));
1246
1247 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1248 JSTaggedValue result = BuiltinsString::Split(ecmaRuntimeCallInfo);
1249
1250 ASSERT_TRUE(result.IsECMAObject());
1251 JSHandle<JSArray> resultArray(thread, reinterpret_cast<JSArray *>(result.GetRawData()));
1252 ASSERT_TRUE(resultArray->IsJSArray());
1253 JSHandle<JSTaggedValue> resultObj(resultArray);
1254 JSHandle<EcmaString> string1(
1255 JSObject::GetProperty(thread, resultObj, JSHandle<JSTaggedValue>(thread, JSTaggedValue(0))).GetValue());
1256 JSHandle<EcmaString> string2(
1257 JSObject::GetProperty(thread, resultObj, JSHandle<JSTaggedValue>(thread, JSTaggedValue(1))).GetValue());
1258 JSHandle<EcmaString> string3(
1259 JSObject::GetProperty(thread, resultObj, JSHandle<JSTaggedValue>(thread, JSTaggedValue(2))).GetValue());
1260 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*string1, *expected1));
1261 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*string2, *expected2));
1262 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*string3, *expected3));
1263 }
1264
HWTEST_F_L0(BuiltinsStringTest,Split2)1265 HWTEST_F_L0(BuiltinsStringTest, Split2)
1266 {
1267 // invoke RegExpConstructor method
1268 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1269 JSHandle<EcmaString> thisStr = factory->NewFromASCII("a-b-c");
1270 JSHandle<EcmaString> pattern1 = factory->NewFromASCII("-");
1271 JSHandle<EcmaString> flags1 = factory->NewFromASCII("iug");
1272 JSTaggedValue result1 = CreateBuiltinsStringRegExpObjByPatternAndFlags(thread, pattern1, flags1);
1273 JSHandle<JSRegExp> separatorObj(thread, result1);
1274
1275 JSHandle<JSTaggedValue> limit(thread, JSTaggedValue(3));
1276 JSHandle<EcmaString> expected1 = factory->NewFromASCII("a");
1277 JSHandle<EcmaString> expected2 = factory->NewFromASCII("b");
1278 JSHandle<EcmaString> expected3 = factory->NewFromASCII("c");
1279
1280 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
1281 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1282 ecmaRuntimeCallInfo->SetThis(thisStr.GetTaggedValue());
1283 ecmaRuntimeCallInfo->SetCallArg(0, separatorObj.GetTaggedValue());
1284 ecmaRuntimeCallInfo->SetCallArg(1, JSTaggedValue(static_cast<int32_t>(3)));
1285
1286 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1287 JSTaggedValue result = BuiltinsString::Split(ecmaRuntimeCallInfo);
1288
1289 ASSERT_TRUE(result.IsECMAObject());
1290 JSHandle<JSArray> resultArray(thread, result);
1291 ASSERT_TRUE(resultArray->IsJSArray());
1292 JSHandle<JSTaggedValue> resultObj(resultArray);
1293 JSHandle<EcmaString> string1(
1294 JSObject::GetProperty(thread, resultObj, JSHandle<JSTaggedValue>(thread, JSTaggedValue(0))).GetValue());
1295 JSHandle<EcmaString> string2(
1296 JSObject::GetProperty(thread, resultObj, JSHandle<JSTaggedValue>(thread, JSTaggedValue(1))).GetValue());
1297 JSHandle<EcmaString> string3(
1298 JSObject::GetProperty(thread, resultObj, JSHandle<JSTaggedValue>(thread, JSTaggedValue(2))).GetValue());
1299 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*string1, *expected1));
1300 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*string2, *expected2));
1301 ASSERT_TRUE(EcmaStringAccessor::StringsAreEqual(*string3, *expected3));
1302 }
1303
1304 // "一二三四".at(3)
HWTEST_F_L0(BuiltinsStringTest,at1)1305 HWTEST_F_L0(BuiltinsStringTest, at1)
1306 {
1307 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1308 JSHandle<EcmaString> thisVal = factory->NewFromUtf8("一二三四");
1309
1310 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1311 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1312 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
1313 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(3)));
1314
1315 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1316 JSTaggedValue result = BuiltinsString::At(ecmaRuntimeCallInfo);
1317 ASSERT_TRUE(result.IsString());
1318 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
1319 JSHandle<EcmaString> test = factory->NewFromUtf8("四");
1320 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
1321 }
1322
1323 // "一二三四".at(-2)
HWTEST_F_L0(BuiltinsStringTest,at2)1324 HWTEST_F_L0(BuiltinsStringTest, at2)
1325 {
1326 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1327 JSHandle<EcmaString> thisVal = factory->NewFromUtf8("一二三四");
1328
1329 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1330 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1331 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
1332 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(-2)));
1333
1334 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1335 JSTaggedValue result = BuiltinsString::At(ecmaRuntimeCallInfo);
1336 ASSERT_TRUE(result.IsString());
1337 JSHandle<EcmaString> resultHandle(thread, reinterpret_cast<EcmaString *>(result.GetRawData()));
1338 JSHandle<EcmaString> test = factory->NewFromUtf8("三");
1339 ASSERT_EQ(EcmaStringAccessor::Compare(instance, resultHandle, test), 0);
1340 }
1341
1342 // "一二三四".at(-5)
HWTEST_F_L0(BuiltinsStringTest,at3)1343 HWTEST_F_L0(BuiltinsStringTest, at3)
1344 {
1345 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1346 JSHandle<EcmaString> thisVal = factory->NewFromUtf8("一二三四");
1347
1348 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1349 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1350 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
1351 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(-5)));
1352
1353 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1354 JSTaggedValue result = BuiltinsString::At(ecmaRuntimeCallInfo);
1355 ASSERT_TRUE(result.IsUndefined());
1356 }
1357
1358 // "abcabcabc".at(9)
HWTEST_F_L0(BuiltinsStringTest,at4)1359 HWTEST_F_L0(BuiltinsStringTest, at4)
1360 {
1361 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1362 JSHandle<EcmaString> thisVal = factory->NewFromASCII("abcabcabc");
1363
1364 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1365 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
1366 ecmaRuntimeCallInfo->SetThis(thisVal.GetTaggedValue());
1367 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<double>(9)));
1368
1369 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
1370 JSTaggedValue result = BuiltinsString::At(ecmaRuntimeCallInfo);
1371 ASSERT_TRUE(result.IsUndefined());
1372 }
1373 } // namespace panda::test
1374