1 /*
2 * Copyright (c) 2022-2024 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/containers/containers_private.h"
17 #include "ecmascript/containers/containers_vector.h"
18 #include "ecmascript/ecma_runtime_call_info.h"
19 #include "ecmascript/global_env.h"
20 #include "ecmascript/js_api/js_api_vector.h"
21 #include "ecmascript/js_api/js_api_vector_iterator.h"
22 #include "ecmascript/js_array.h"
23 #include "ecmascript/js_handle.h"
24 #include "ecmascript/js_object-inl.h"
25 #include "ecmascript/js_tagged_value-inl.h"
26 #include "ecmascript/js_thread.h"
27 #include "ecmascript/object_factory.h"
28 #include "ecmascript/tests/test_helper.h"
29 #include "ecmascript/containers/tests/containers_test_helper.h"
30
31 using namespace panda::ecmascript;
32 using namespace panda::ecmascript::containers;
33
34 namespace panda::test {
35 class ContainersVectorTest : 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 TestHelper::CreateEcmaVMWithScope(instance, thread, scope);
50 }
51
TearDown()52 void TearDown() override
53 {
54 TestHelper::DestroyEcmaVMWithScope(instance, scope);
55 }
56
57 EcmaVM *instance {nullptr};
58 EcmaHandleScope *scope {nullptr};
59 JSThread *thread {nullptr};
60
61 class TestClass : public base::BuiltinsBase {
62 public:
TestForEachFunc(EcmaRuntimeCallInfo * argv)63 static JSTaggedValue TestForEachFunc(EcmaRuntimeCallInfo *argv)
64 {
65 JSHandle<JSTaggedValue> value = GetCallArg(argv, 0);
66 JSHandle<JSTaggedValue> key = GetCallArg(argv, 1);
67 JSHandle<JSTaggedValue> vector = GetCallArg(argv, 2); // 2 means the secode arg
68 if (!vector->IsUndefined()) {
69 if (value->IsNumber()) {
70 TaggedArray *elements = TaggedArray::Cast(JSAPIVector::Cast(vector.GetTaggedValue().
71 GetTaggedObject())->GetElements().GetTaggedObject());
72 JSTaggedValue result = elements->Get(key->GetInt());
73 EXPECT_EQ(result, value.GetTaggedValue());
74 }
75 }
76 return JSTaggedValue::Undefined();
77 }
78
TestReplaceAllElementsFunc(EcmaRuntimeCallInfo * argv)79 static JSTaggedValue TestReplaceAllElementsFunc(EcmaRuntimeCallInfo *argv)
80 {
81 JSThread *thread = argv->GetThread();
82 JSHandle<JSTaggedValue> value = GetCallArg(argv, 0);
83 JSHandle<JSTaggedValue> index = GetCallArg(argv, 1);
84 JSHandle<JSTaggedValue> vector = GetCallArg(argv, 2); // 2 means the secode arg
85 if (!vector->IsUndefined()) {
86 if (value->IsNumber()) {
87 JSHandle<JSTaggedValue> newValue(thread, JSTaggedValue(value->GetInt() * 2)); // 2 means mul by 2
88 JSHandle<JSAPIVector>::Cast(vector)->Set(thread, index->GetNumber(), newValue.GetTaggedValue());
89 return newValue.GetTaggedValue();
90 }
91 }
92 return JSTaggedValue::Undefined();
93 }
94 };
95 protected:
InitializeVectorConstructor()96 JSTaggedValue InitializeVectorConstructor()
97 {
98 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
99 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
100
101 JSHandle<JSTaggedValue> globalObject = env->GetJSGlobalObject();
102 JSHandle<JSTaggedValue> key(factory->NewFromASCII("ArkPrivate"));
103 JSHandle<JSTaggedValue> value =
104 JSObject::GetProperty(thread, JSHandle<JSTaggedValue>(globalObject), key).GetValue();
105
106 auto objCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
107 objCallInfo->SetFunction(JSTaggedValue::Undefined());
108 objCallInfo->SetThis(value.GetTaggedValue());
109 objCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int>(ContainerTag::Vector)));
110 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
111 JSTaggedValue result = ContainersPrivate::Load(objCallInfo);
112 TestHelper::TearDownFrame(thread, prev);
113
114 return result;
115 }
116
CreateJSAPIVector(JSTaggedValue compare=JSTaggedValue::Undefined ())117 JSHandle<JSAPIVector> CreateJSAPIVector(JSTaggedValue compare = JSTaggedValue::Undefined())
118 {
119 JSHandle<JSTaggedValue> compareHandle(thread, compare);
120 JSHandle<JSFunction> newTarget(thread, InitializeVectorConstructor());
121 auto objCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
122 objCallInfo->SetFunction(newTarget.GetTaggedValue());
123 objCallInfo->SetNewTarget(newTarget.GetTaggedValue());
124 objCallInfo->SetThis(JSTaggedValue::Undefined());
125 objCallInfo->SetCallArg(0, compareHandle.GetTaggedValue());
126
127 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
128 JSTaggedValue result = ContainersVector::VectorConstructor(objCallInfo);
129 TestHelper::TearDownFrame(thread, prev);
130 JSHandle<JSAPIVector> vector(thread, result);
131 return vector;
132 }
133 };
134
135 // new vector
HWTEST_F_L0(ContainersVectorTest,VectorConstructor)136 HWTEST_F_L0(ContainersVectorTest, VectorConstructor)
137 {
138 // Initialize twice and return directly the second time
139 InitializeVectorConstructor();
140 JSHandle<JSFunction> newTarget(thread, InitializeVectorConstructor());
141
142 auto objCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
143 objCallInfo->SetFunction(newTarget.GetTaggedValue());
144 objCallInfo->SetNewTarget(newTarget.GetTaggedValue());
145 objCallInfo->SetThis(JSTaggedValue::Undefined());
146
147 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
148 JSTaggedValue result = ContainersVector::VectorConstructor(objCallInfo);
149 TestHelper::TearDownFrame(thread, prev);
150 ASSERT_TRUE(result.IsJSAPIVector());
151
152 JSHandle<JSAPIVector> setHandle(thread, result);
153 JSTaggedValue resultProto = JSTaggedValue::GetPrototype(thread, JSHandle<JSTaggedValue>(setHandle));
154 JSTaggedValue funcProto = newTarget->GetFunctionPrototype();
155 ASSERT_EQ(resultProto, funcProto);
156 int size = setHandle->GetSize();
157 ASSERT_EQ(size, 0);
158
159 // test VectorConstructor exception
160 objCallInfo->SetNewTarget(JSTaggedValue::Undefined());
161 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, VectorConstructor, objCallInfo);
162 }
163
164 // add has
HWTEST_F_L0(ContainersVectorTest,AddAndHas)165 HWTEST_F_L0(ContainersVectorTest, AddAndHas)
166 {
167 constexpr int32_t ELEMENT_NUMS = 8;
168 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
169 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
170 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
171 callInfo->SetFunction(JSTaggedValue::Undefined());
172 callInfo->SetThis(vector.GetTaggedValue());
173 callInfo->SetCallArg(0, JSTaggedValue(i));
174
175 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
176 JSTaggedValue result = ContainersVector::Add(callInfo);
177 TestHelper::TearDownFrame(thread, prev);
178 EXPECT_TRUE(result.IsTrue());
179 EXPECT_EQ(vector->GetSize(), i + 1);
180 }
181 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS);
182
183 // test add insert string
184 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
185 JSMutableHandle<JSTaggedValue> key(thread, JSTaggedValue::Undefined());
186 std::string myKey("mykey");
187 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
188 std::string ikey = myKey + std::to_string(i);
189 key.Update(factory->NewFromStdString(ikey).GetTaggedValue());
190
191 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
192 callInfo->SetFunction(JSTaggedValue::Undefined());
193 callInfo->SetThis(vector.GetTaggedValue());
194 callInfo->SetCallArg(0, key.GetTaggedValue());
195
196 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
197 JSTaggedValue result = ContainersVector::Add(callInfo);
198 TestHelper::TearDownFrame(thread, prev);
199 EXPECT_TRUE(result.IsTrue());
200 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS + i + 1);
201 }
202 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS * 2);
203
204 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
205 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
206 callInfo->SetFunction(JSTaggedValue::Undefined());
207 callInfo->SetThis(vector.GetTaggedValue());
208 callInfo->SetCallArg(0, JSTaggedValue(i));
209 callInfo->SetCallArg(1, JSTaggedValue(i));
210
211 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
212 ContainersVector::Insert(callInfo);
213 TestHelper::TearDownFrame(thread, prev);
214 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS * 2 + i + 1);
215 }
216 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS * 3);
217
218 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
219 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
220 callInfo->SetFunction(JSTaggedValue::Undefined());
221 callInfo->SetThis(vector.GetTaggedValue());
222 callInfo->SetCallArg(0, JSTaggedValue(i));
223
224 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
225 JSTaggedValue result = ContainersVector::Has(callInfo);
226 TestHelper::TearDownFrame(thread, prev);
227 EXPECT_TRUE(result.IsTrue());
228 }
229 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
230 std::string ikey = myKey + std::to_string(i);
231 key.Update(factory->NewFromStdString(ikey).GetTaggedValue());
232
233 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
234 callInfo->SetFunction(JSTaggedValue::Undefined());
235 callInfo->SetThis(vector.GetTaggedValue());
236 callInfo->SetCallArg(0, key.GetTaggedValue());
237
238 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
239 JSTaggedValue result = ContainersVector::Has(callInfo);
240 TestHelper::TearDownFrame(thread, prev);
241 EXPECT_TRUE(result.IsTrue());
242 }
243 }
244
245 // getIndexOf getLastIndexOf
HWTEST_F_L0(ContainersVectorTest,GetFirstValueAndGetLastValue)246 HWTEST_F_L0(ContainersVectorTest, GetFirstValueAndGetLastValue)
247 {
248 constexpr int32_t ELEMENT_NUMS = 8;
249 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
250 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
251 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
252 callInfo->SetFunction(JSTaggedValue::Undefined());
253 callInfo->SetThis(vector.GetTaggedValue());
254 callInfo->SetCallArg(0, JSTaggedValue(i));
255
256 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
257 JSTaggedValue result = ContainersVector::Add(callInfo);
258 TestHelper::TearDownFrame(thread, prev);
259 EXPECT_TRUE(result.IsTrue());
260 // double
261 result = ContainersVector::Add(callInfo);
262 TestHelper::TearDownFrame(thread, prev);
263 EXPECT_TRUE(result.IsTrue());
264 EXPECT_EQ(vector->GetSize(), 2 * (i + 1));
265 }
266 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS * 2);
267
268 // getIndexOf
269 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
270 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
271 callInfo->SetFunction(JSTaggedValue::Undefined());
272 callInfo->SetThis(vector.GetTaggedValue());
273 callInfo->SetCallArg(0, JSTaggedValue(i));
274
275 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
276 JSTaggedValue result = ContainersVector::GetIndexOf(callInfo);
277 TestHelper::TearDownFrame(thread, prev);
278 EXPECT_EQ(result, JSTaggedValue(2 * i));
279 }
280 // getLastIndexOf
281 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
282 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
283 callInfo->SetFunction(JSTaggedValue::Undefined());
284 callInfo->SetThis(vector.GetTaggedValue());
285 callInfo->SetCallArg(0, JSTaggedValue(i));
286
287 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
288 JSTaggedValue result = ContainersVector::GetLastIndexOf(callInfo);
289 TestHelper::TearDownFrame(thread, prev);
290 EXPECT_EQ(result, JSTaggedValue(2 * i + 1));
291 }
292 // getFirstElement
293 {
294 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
295 callInfo->SetFunction(JSTaggedValue::Undefined());
296 callInfo->SetThis(vector.GetTaggedValue());
297
298 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
299 JSTaggedValue result = ContainersVector::GetFirstElement(callInfo);
300 TestHelper::TearDownFrame(thread, prev);
301 EXPECT_EQ(result, JSTaggedValue(0));
302 }
303 // getLastElement
304 {
305 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
306 callInfo->SetFunction(JSTaggedValue::Undefined());
307 callInfo->SetThis(vector.GetTaggedValue());
308
309 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
310 JSTaggedValue result = ContainersVector::GetLastElement(callInfo);
311 TestHelper::TearDownFrame(thread, prev);
312 EXPECT_EQ(result, JSTaggedValue(7));
313 }
314 }
315
316 // removeByIndex remove removeByRange clear isEmpty
HWTEST_F_L0(ContainersVectorTest,RemoveByIndexAndRemoveAndRemoveRangeAndClear)317 HWTEST_F_L0(ContainersVectorTest, RemoveByIndexAndRemoveAndRemoveRangeAndClear)
318 {
319 // add
320 constexpr int32_t ELEMENT_NUMS = 8;
321 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
322 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
323 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
324 callInfo->SetFunction(JSTaggedValue::Undefined());
325 callInfo->SetThis(vector.GetTaggedValue());
326 callInfo->SetCallArg(0, JSTaggedValue(i));
327
328 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
329 JSTaggedValue result = ContainersVector::Add(callInfo);
330 TestHelper::TearDownFrame(thread, prev);
331 EXPECT_TRUE(result.IsTrue());
332 EXPECT_EQ(vector->GetSize(), i + 1);
333 }
334
335 // removeByIndex
336 {
337 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
338 callInfo->SetFunction(JSTaggedValue::Undefined());
339 callInfo->SetThis(vector.GetTaggedValue());
340 callInfo->SetCallArg(0, JSTaggedValue(0));
341
342 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
343 JSTaggedValue result = ContainersVector::RemoveByIndex(callInfo);
344 TestHelper::TearDownFrame(thread, prev);
345 EXPECT_EQ(result, JSTaggedValue(0));
346 EXPECT_EQ(vector->GetSize(), 7);
347 }
348 // remove fail
349 {
350 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
351 callInfo->SetFunction(JSTaggedValue::Undefined());
352 callInfo->SetThis(vector.GetTaggedValue());
353 callInfo->SetCallArg(0, JSTaggedValue(0));
354
355 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
356 JSTaggedValue result = ContainersVector::Remove(callInfo);
357 TestHelper::TearDownFrame(thread, prev);
358 EXPECT_TRUE(result.IsFalse());
359 EXPECT_EQ(vector->GetSize(), 7);
360 }
361 // remove success
362 {
363 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
364 callInfo->SetFunction(JSTaggedValue::Undefined());
365 callInfo->SetThis(vector.GetTaggedValue());
366 callInfo->SetCallArg(0, JSTaggedValue(1));
367
368 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
369 JSTaggedValue result = ContainersVector::Remove(callInfo);
370 TestHelper::TearDownFrame(thread, prev);
371 EXPECT_TRUE(result.IsTrue());
372 EXPECT_EQ(vector->GetSize(), 6);
373 }
374 // removeByRange
375 {
376 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
377 callInfo->SetFunction(JSTaggedValue::Undefined());
378 callInfo->SetThis(vector.GetTaggedValue());
379 callInfo->SetCallArg(0, JSTaggedValue(4));
380 callInfo->SetCallArg(1, JSTaggedValue(2));
381
382 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
383 ContainersVector::RemoveByRange(callInfo);
384 TestHelper::TearDownFrame(thread, prev);
385 EXPECT_EQ(vector->GetSize(), 6);
386 }
387 // isEmpty
388 {
389 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
390 callInfo->SetFunction(JSTaggedValue::Undefined());
391 callInfo->SetThis(vector.GetTaggedValue());
392
393 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
394 JSTaggedValue result = ContainersVector::IsEmpty(callInfo);
395 TestHelper::TearDownFrame(thread, prev);
396 EXPECT_TRUE(result.IsFalse());
397 }
398 // clear
399 {
400 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
401 callInfo->SetFunction(JSTaggedValue::Undefined());
402 callInfo->SetThis(vector.GetTaggedValue());
403
404 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
405 ContainersVector::Clear(callInfo);
406 TestHelper::TearDownFrame(thread, prev);
407 EXPECT_EQ(vector->GetSize(), 0);
408 }
409 // isEmpty
410 {
411 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
412 callInfo->SetFunction(JSTaggedValue::Undefined());
413 callInfo->SetThis(vector.GetTaggedValue());
414
415 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
416 JSTaggedValue result = ContainersVector::IsEmpty(callInfo);
417 TestHelper::TearDownFrame(thread, prev);
418 EXPECT_TRUE(result.IsTrue());
419 }
420 }
421
422 // replaceAllElements forEach
HWTEST_F_L0(ContainersVectorTest,ReplaceAllElementsAndForEach)423 HWTEST_F_L0(ContainersVectorTest, ReplaceAllElementsAndForEach)
424 {
425 constexpr int32_t ELEMENT_NUMS = 8;
426 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
427 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
428 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
429 callInfo->SetFunction(JSTaggedValue::Undefined());
430 callInfo->SetThis(vector.GetTaggedValue());
431 callInfo->SetCallArg(0, JSTaggedValue(i));
432
433 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
434 JSTaggedValue result = ContainersVector::Add(callInfo);
435 TestHelper::TearDownFrame(thread, prev);
436 EXPECT_TRUE(result.IsTrue());
437 EXPECT_EQ(vector->GetSize(), i + 1);
438 }
439 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS);
440
441 // forEach
442 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
443 JSHandle<JSAPIVector> vec = CreateJSAPIVector();
444 {
445 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
446 JSHandle<JSFunction> func = factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestForEachFunc));
447 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
448 callInfo->SetFunction(JSTaggedValue::Undefined());
449 callInfo->SetThis(vector.GetTaggedValue());
450 callInfo->SetCallArg(0, func.GetTaggedValue());
451 callInfo->SetCallArg(1, vec.GetTaggedValue());
452
453 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
454 ContainersVector::ForEach(callInfo);
455 TestHelper::TearDownFrame(thread, prev);
456 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
457 auto callInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
458 callInfo1->SetFunction(JSTaggedValue::Undefined());
459 callInfo1->SetThis(vector.GetTaggedValue());
460 callInfo1->SetCallArg(0, JSTaggedValue(i));
461
462 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo1);
463 JSTaggedValue result = ContainersVector::Get(callInfo1);
464 TestHelper::TearDownFrame(thread, prev1);
465 EXPECT_EQ(result, JSTaggedValue(i));
466 }
467 }
468
469 // replaceAllElements
470 {
471 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
472 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
473 JSHandle<JSFunction> func =
474 factory->NewJSFunction(env, reinterpret_cast<void *>(TestClass::TestReplaceAllElementsFunc));
475 callInfo->SetFunction(JSTaggedValue::Undefined());
476 callInfo->SetThis(vector.GetTaggedValue());
477 callInfo->SetCallArg(0, func.GetTaggedValue());
478
479 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
480 ContainersVector::ReplaceAllElements(callInfo);
481 TestHelper::TearDownFrame(thread, prev);
482 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
483 auto callInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
484 callInfo1->SetFunction(JSTaggedValue::Undefined());
485 callInfo1->SetThis(vector.GetTaggedValue());
486 callInfo1->SetCallArg(0, JSTaggedValue(i));
487
488 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo1);
489 JSTaggedValue result = ContainersVector::Get(callInfo1);
490 TestHelper::TearDownFrame(thread, prev1);
491 EXPECT_EQ(result, JSTaggedValue(i * 2));
492 }
493 }
494 }
495
496 // sort
HWTEST_F_L0(ContainersVectorTest,Sort)497 HWTEST_F_L0(ContainersVectorTest, Sort)
498 {
499 constexpr int32_t ELEMENT_NUMS = 8;
500 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
501 for (int32_t i = ELEMENT_NUMS - 1; i >= 0; i--) {
502 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
503 callInfo->SetFunction(JSTaggedValue::Undefined());
504 callInfo->SetThis(vector.GetTaggedValue());
505 callInfo->SetCallArg(0, JSTaggedValue(i));
506
507 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
508 JSTaggedValue result = ContainersVector::Add(callInfo);
509 TestHelper::TearDownFrame(thread, prev);
510 EXPECT_TRUE(result.IsTrue());
511 }
512 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS);
513
514 // sort
515 {
516 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
517 callInfo->SetFunction(JSTaggedValue::Undefined());
518 callInfo->SetThis(vector.GetTaggedValue());
519 callInfo->SetCallArg(0, JSTaggedValue::Undefined());
520
521 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
522 ContainersVector::Sort(callInfo);
523 TestHelper::TearDownFrame(thread, prev);
524
525 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
526 auto callInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
527 callInfo1->SetFunction(JSTaggedValue::Undefined());
528 callInfo1->SetThis(vector.GetTaggedValue());
529 callInfo1->SetCallArg(0, JSTaggedValue(i));
530
531 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo1);
532 JSTaggedValue result = ContainersVector::Get(callInfo1);
533 TestHelper::TearDownFrame(thread, prev1);
534 EXPECT_EQ(result, JSTaggedValue(i));
535 }
536 }
537 }
538
539 // clone convertToArray copyToArray
HWTEST_F_L0(ContainersVectorTest,CloneAndConvertToArrayAndCopyToArray)540 HWTEST_F_L0(ContainersVectorTest, CloneAndConvertToArrayAndCopyToArray)
541 {
542 constexpr int32_t ELEMENT_NUMS = 8;
543 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
544 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
545 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
546 callInfo->SetFunction(JSTaggedValue::Undefined());
547 callInfo->SetThis(vector.GetTaggedValue());
548 callInfo->SetCallArg(0, JSTaggedValue(i));
549
550 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
551 JSTaggedValue result = ContainersVector::Add(callInfo);
552 TestHelper::TearDownFrame(thread, prev);
553 EXPECT_TRUE(result.IsTrue());
554 EXPECT_EQ(vector->GetSize(), i + 1);
555 }
556 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS);
557 // clone
558 {
559 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
560 callInfo->SetFunction(JSTaggedValue::Undefined());
561 callInfo->SetThis(vector.GetTaggedValue());
562
563 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
564 JSTaggedValue vec = ContainersVector::Clone(callInfo);
565 TestHelper::TearDownFrame(thread, prev);
566 JSHandle<JSAPIVector> handleVec(thread, vec);
567 EXPECT_EQ(handleVec->GetSize(), vector->GetSize());
568
569 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
570 auto callInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
571 callInfo1->SetFunction(JSTaggedValue::Undefined());
572 callInfo1->SetThis(vec);
573 callInfo1->SetCallArg(0, JSTaggedValue(i));
574
575 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo1);
576 JSTaggedValue result = ContainersVector::Get(callInfo1);
577 TestHelper::TearDownFrame(thread, prev1);
578 EXPECT_EQ(result, JSTaggedValue(i));
579 }
580 }
581 // convertToArray
582 {
583 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
584 callInfo->SetFunction(JSTaggedValue::Undefined());
585 callInfo->SetThis(vector.GetTaggedValue());
586
587 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
588 JSTaggedValue arr = ContainersVector::ConvertToArray(callInfo);
589 TestHelper::TearDownFrame(thread, prev);
590 EXPECT_TRUE(arr.IsJSArray());
591 JSHandle<JSTaggedValue> handleArr(thread, arr);
592 JSHandle<TaggedArray> taggedArr = JSArray::ToTaggedArray(thread, handleArr);
593 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
594 JSTaggedValue result = taggedArr->Get(i);
595 EXPECT_EQ(result, JSTaggedValue(i));
596 }
597 }
598 // copyToArray
599 {
600 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
601 JSHandle<JSArray> array = factory->NewJSArray();
602 JSHandle<TaggedArray> arrayElement = factory->NewTaggedArray(ELEMENT_NUMS, JSTaggedValue::Hole());
603 array->SetElements(thread, arrayElement);
604 array->SetArrayLength(thread, static_cast<uint32_t>(ELEMENT_NUMS));
605 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
606 callInfo->SetFunction(JSTaggedValue::Undefined());
607 callInfo->SetThis(vector.GetTaggedValue());
608 callInfo->SetCallArg(0, array.GetTaggedValue());
609
610 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
611 ContainersVector::CopyToArray(callInfo);
612 TestHelper::TearDownFrame(thread, prev);
613 EXPECT_TRUE(array->IsJSArray());
614 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
615 auto callInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
616 callInfo1->SetFunction(JSTaggedValue::Undefined());
617 callInfo1->SetThis(array.GetTaggedValue());
618 callInfo1->SetCallArg(0, JSTaggedValue(i));
619
620 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo1);
621 int result = JSArray::GetProperty(thread, JSHandle<JSTaggedValue>(array), i).GetValue()->GetInt();
622 TestHelper::TearDownFrame(thread, prev1);
623 EXPECT_EQ(result, i);
624 }
625
626 JSHandle<JSArray> longArray = factory->NewJSArray();
627 JSHandle<TaggedArray> longArrayElement = factory->NewTaggedArray(ELEMENT_NUMS * 2, JSTaggedValue::Hole());
628 longArray->SetElements(thread, longArrayElement);
629 longArray->SetArrayLength(thread, static_cast<uint32_t>(ELEMENT_NUMS * 2));
630 auto callInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
631 callInfo2->SetFunction(JSTaggedValue::Undefined());
632 callInfo2->SetThis(vector.GetTaggedValue());
633 callInfo2->SetCallArg(0, longArray.GetTaggedValue());
634
635 [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, callInfo2);
636 ContainersVector::CopyToArray(callInfo2);
637 TestHelper::TearDownFrame(thread, prev2);
638 EXPECT_TRUE(longArray->IsJSArray());
639 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
640 auto callInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
641 callInfo3->SetFunction(JSTaggedValue::Undefined());
642 callInfo3->SetThis(longArray.GetTaggedValue());
643 callInfo3->SetCallArg(0, JSTaggedValue(i));
644
645 [[maybe_unused]] auto prev4 = TestHelper::SetupFrame(thread, callInfo3);
646 int result1 = JSArray::GetProperty(thread, JSHandle<JSTaggedValue>(longArray), i).GetValue()->GetInt();
647 TestHelper::TearDownFrame(thread, prev4);
648 EXPECT_EQ(result1, i);
649 }
650 for (int32_t i = ELEMENT_NUMS; i < ELEMENT_NUMS * 2; i++) {
651 auto callInfo4 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
652 callInfo4->SetFunction(JSTaggedValue::Undefined());
653 callInfo4->SetThis(longArray.GetTaggedValue());
654 callInfo4->SetCallArg(0, JSTaggedValue(i));
655
656 [[maybe_unused]] auto prev5 = TestHelper::SetupFrame(thread, callInfo4);
657 JSHandle<JSTaggedValue> result2 = JSArray::GetProperty(thread,
658 JSHandle<JSTaggedValue>(longArray), i).GetValue();
659 TestHelper::TearDownFrame(thread, prev5);
660 EXPECT_EQ(result2.GetTaggedValue(), JSTaggedValue::Undefined());
661 }
662 }
663 }
664
665 // subVector getCapacity trimToCurrentLength increaseCapacityTo
HWTEST_F_L0(ContainersVectorTest,SubVectorAndGetCapacityAndTrimToCurrentLengthAndIncreaseCapacityTo)666 HWTEST_F_L0(ContainersVectorTest, SubVectorAndGetCapacityAndTrimToCurrentLengthAndIncreaseCapacityTo)
667 {
668 constexpr int32_t ELEMENT_NUMS = 8;
669 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
670 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
671 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
672 callInfo->SetFunction(JSTaggedValue::Undefined());
673 callInfo->SetThis(vector.GetTaggedValue());
674 callInfo->SetCallArg(0, JSTaggedValue(i));
675
676 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
677 JSTaggedValue result = ContainersVector::Add(callInfo);
678 TestHelper::TearDownFrame(thread, prev);
679 EXPECT_TRUE(result.IsTrue());
680 EXPECT_EQ(vector->GetSize(), i + 1);
681 }
682 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS);
683
684 // getCapacity
685 {
686 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
687 callInfo->SetFunction(JSTaggedValue::Undefined());
688 callInfo->SetThis(vector.GetTaggedValue());
689
690 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
691 int32_t capacity = ContainersVector::GetCapacity(callInfo).GetInt();
692 TestHelper::TearDownFrame(thread, prev);
693 EXPECT_EQ(capacity, 10);
694 }
695 // increaseCapacityTo
696 {
697 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
698 callInfo->SetFunction(JSTaggedValue::Undefined());
699 callInfo->SetThis(vector.GetTaggedValue());
700 callInfo->SetCallArg(0, JSTaggedValue(20));
701
702 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
703 ContainersVector::IncreaseCapacityTo(callInfo);
704 TestHelper::TearDownFrame(thread, prev);
705 }
706 // getCapacity
707 {
708 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
709 callInfo->SetFunction(JSTaggedValue::Undefined());
710 callInfo->SetThis(vector.GetTaggedValue());
711
712 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
713 int32_t newCapacity1 = ContainersVector::GetCapacity(callInfo).GetInt();
714 TestHelper::TearDownFrame(thread, prev);
715 EXPECT_EQ(newCapacity1, 20);
716 }
717 // trimToCurrentLength
718 {
719 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
720 callInfo->SetFunction(JSTaggedValue::Undefined());
721 callInfo->SetThis(vector.GetTaggedValue());
722
723 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
724 ContainersVector::TrimToCurrentLength(callInfo);
725 TestHelper::TearDownFrame(thread, prev);
726 }
727 // getCapacity
728 {
729 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
730 callInfo->SetFunction(JSTaggedValue::Undefined());
731 callInfo->SetThis(vector.GetTaggedValue());
732
733 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
734 int32_t newCapacity2 = ContainersVector::GetCapacity(callInfo).GetInt();
735 TestHelper::TearDownFrame(thread, prev);
736 EXPECT_EQ(newCapacity2, 8);
737 }
738 // subVector
739 {
740 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
741 callInfo->SetFunction(JSTaggedValue::Undefined());
742 callInfo->SetThis(vector.GetTaggedValue());
743 callInfo->SetCallArg(0, JSTaggedValue(0));
744 callInfo->SetCallArg(1, JSTaggedValue(2));
745
746 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
747 JSTaggedValue vec = ContainersVector::SubVector(callInfo);
748 for (int32_t i = 0; i < 2; i++) {
749 auto callInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
750 callInfo1->SetFunction(JSTaggedValue::Undefined());
751 callInfo1->SetThis(vec);
752 callInfo1->SetCallArg(0, JSTaggedValue(i));
753
754 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo1);
755 JSTaggedValue result = ContainersVector::Get(callInfo1);
756 TestHelper::TearDownFrame(thread, prev);
757 EXPECT_EQ(result, JSTaggedValue(i));
758 }
759 }
760 }
761
762 // toString getLastIndexFrom getIndexFrom
HWTEST_F_L0(ContainersVectorTest,ToStringAndGetLastIndexFromAndGetIndexFrom)763 HWTEST_F_L0(ContainersVectorTest, ToStringAndGetLastIndexFromAndGetIndexFrom)
764 {
765 constexpr int32_t ELEMENT_NUMS = 8;
766 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
767 for (int32_t i = 0; i < ELEMENT_NUMS; i++) {
768 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
769 callInfo->SetFunction(JSTaggedValue::Undefined());
770 callInfo->SetThis(vector.GetTaggedValue());
771 callInfo->SetCallArg(0, JSTaggedValue(i));
772
773 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
774 JSTaggedValue result = ContainersVector::Add(callInfo);
775 TestHelper::TearDownFrame(thread, prev);
776 EXPECT_TRUE(result.IsTrue());
777 EXPECT_EQ(vector->GetSize(), i + 1);
778 }
779 EXPECT_EQ(vector->GetSize(), ELEMENT_NUMS);
780 // toString
781 {
782 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
783 callInfo->SetFunction(JSTaggedValue::Undefined());
784 callInfo->SetThis(vector.GetTaggedValue());
785 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
786 JSTaggedValue result = ContainersVector::ToString(callInfo);
787
788 EXPECT_TRUE(result.IsString());
789 }
790 // getLastIndexFrom
791 {
792 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
793 callInfo->SetFunction(JSTaggedValue::Undefined());
794 callInfo->SetThis(vector.GetTaggedValue());
795 callInfo->SetCallArg(0, JSTaggedValue(1));
796 callInfo->SetCallArg(1, JSTaggedValue(3));
797
798 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
799 JSTaggedValue result = ContainersVector::GetLastIndexFrom(callInfo);
800 TestHelper::TearDownFrame(thread, prev);
801 EXPECT_TRUE(JSTaggedValue::SameValue(result, JSTaggedValue(1)));
802 }
803 // getIndexFrom
804 {
805 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
806 callInfo->SetFunction(JSTaggedValue::Undefined());
807 callInfo->SetThis(vector.GetTaggedValue());
808 callInfo->SetCallArg(0, JSTaggedValue(1));
809 callInfo->SetCallArg(1, JSTaggedValue(3));
810
811 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
812 JSTaggedValue result = ContainersVector::GetIndexFrom(callInfo);
813 TestHelper::TearDownFrame(thread, prev);
814 EXPECT_TRUE(JSTaggedValue::SameValue(result, JSTaggedValue(-1)));
815 }
816 // getIndexFrom
817 {
818 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
819 callInfo->SetFunction(JSTaggedValue::Undefined());
820 callInfo->SetThis(vector.GetTaggedValue());
821 callInfo->SetCallArg(0, JSTaggedValue(10));
822 callInfo->SetCallArg(1, JSTaggedValue(0));
823
824 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
825 JSTaggedValue result = ContainersVector::GetIndexFrom(callInfo);
826 TestHelper::TearDownFrame(thread, prev);
827 EXPECT_TRUE(JSTaggedValue::SameValue(result, JSTaggedValue(-1)));
828 }
829 }
830
HWTEST_F_L0(ContainersVectorTest,ProxyOfGetSizeSetLength)831 HWTEST_F_L0(ContainersVectorTest, ProxyOfGetSizeSetLength)
832 {
833 constexpr uint32_t NODE_NUMBERS = 8;
834 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
835 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
836 callInfo->SetFunction(JSTaggedValue::Undefined());
837 JSHandle<JSProxy> proxy = CreateJSProxyHandle(thread);
838 proxy->SetTarget(thread, vector.GetTaggedValue());
839 callInfo->SetThis(proxy.GetTaggedValue());
840
841 for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
842 callInfo->SetCallArg(0, JSTaggedValue(i));
843 callInfo->SetCallArg(1, JSTaggedValue(i + 1));
844 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
845 ContainersVector::Add(callInfo);
846 TestHelper::TearDownFrame(thread, prev);
847
848 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo);
849 JSTaggedValue retult = ContainersVector::GetSize(callInfo);
850 TestHelper::TearDownFrame(thread, prev1);
851 EXPECT_EQ(retult, JSTaggedValue(i + 1));
852 }
853
854
855 // SetLength
856 {
857 callInfo->SetCallArg(0, JSTaggedValue(NODE_NUMBERS * 2));
858
859 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
860 ContainersVector::SetLength(callInfo);
861 TestHelper::TearDownFrame(thread, prev);
862
863 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo);
864 JSTaggedValue result = ContainersVector::GetSize(callInfo);
865 TestHelper::TearDownFrame(thread, prev1);
866
867 EXPECT_TRUE(JSTaggedValue::SameValue(result, JSTaggedValue(NODE_NUMBERS * 2)));
868 }
869
870 // SetLength
871 {
872 callInfo->SetCallArg(0, JSTaggedValue(NODE_NUMBERS / 2));
873
874 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
875 ContainersVector::SetLength(callInfo);
876 TestHelper::TearDownFrame(thread, prev);
877
878 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo);
879 JSTaggedValue result = ContainersVector::GetSize(callInfo);
880 TestHelper::TearDownFrame(thread, prev1);
881
882 EXPECT_TRUE(JSTaggedValue::SameValue(result, JSTaggedValue(NODE_NUMBERS / 2)));
883 }
884 }
885
HWTEST_F_L0(ContainersVectorTest,ExceptionReturn1)886 HWTEST_F_L0(ContainersVectorTest, ExceptionReturn1)
887 {
888 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Insert);
889 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, SetLength);
890 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, IncreaseCapacityTo);
891 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Get);
892 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetIndexFrom);
893 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Add);
894 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetCapacity);
895 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetIndexOf);
896 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, IsEmpty);
897
898 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
899 {
900 auto callInfo = NewEmptyCallInfo(thread);
901 callInfo->SetThis(vector.GetTaggedValue());
902 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, Insert, callInfo);
903 }
904 {
905 auto callInfo = NewEmptyCallInfo(thread);
906 callInfo->SetThis(vector.GetTaggedValue());
907 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, SetLength, callInfo);
908 }
909 {
910 auto callInfo = NewEmptyCallInfo(thread);
911 callInfo->SetThis(vector.GetTaggedValue());
912 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, IncreaseCapacityTo, callInfo);
913 }
914 {
915 auto callInfo = NewEmptyCallInfo(thread);
916 callInfo->SetThis(vector.GetTaggedValue());
917 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, Get, callInfo);
918 }
919 {
920 auto callInfo = NewEmptyCallInfo(thread);
921 callInfo->SetThis(vector.GetTaggedValue());
922 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, GetIndexFrom, callInfo);
923 }
924 {
925 auto callInfo = NewEmptyCallInfo(thread);
926 callInfo->SetThis(vector.GetTaggedValue());
927 callInfo->SetCallArg(0, JSTaggedValue(-1));
928 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, SetLength, callInfo);
929 }
930 }
931
HWTEST_F_L0(ContainersVectorTest,ExceptionReturn2)932 HWTEST_F_L0(ContainersVectorTest, ExceptionReturn2)
933 {
934 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetLastIndexFrom);
935 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, RemoveByIndex);
936 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, RemoveByRange);
937 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetLastElement);
938 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetLastIndexOf);
939 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Remove);
940
941 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
942 {
943 auto callInfo = NewEmptyCallInfo(thread);
944 callInfo->SetThis(vector.GetTaggedValue());
945 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, GetLastIndexFrom, callInfo);
946 }
947 {
948 auto callInfo = NewEmptyCallInfo(thread);
949 callInfo->SetThis(vector.GetTaggedValue());
950 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, RemoveByIndex, callInfo);
951 }
952 {
953 auto callInfo = NewEmptyCallInfo(thread);
954 callInfo->SetThis(vector.GetTaggedValue());
955 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, RemoveByRange, callInfo);
956 }
957 }
958
HWTEST_F_L0(ContainersVectorTest,ExceptionReturn3)959 HWTEST_F_L0(ContainersVectorTest, ExceptionReturn3)
960 {
961 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Set);
962 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, SubVector);
963 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, ReplaceAllElements);
964 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, ToString);
965 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetSize);
966 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, ForEach);
967 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, TrimToCurrentLength);
968 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Clear);
969
970 JSHandle<JSAPIVector> vector = CreateJSAPIVector();
971 {
972 auto callInfo = NewEmptyCallInfo(thread);
973 callInfo->SetThis(vector.GetTaggedValue());
974 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, Set, callInfo);
975 }
976 {
977 auto callInfo = NewEmptyCallInfo(thread);
978 callInfo->SetThis(vector.GetTaggedValue());
979 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, SubVector, callInfo);
980 }
981 {
982 auto callInfo = NewEmptyCallInfo(thread);
983 callInfo->SetThis(vector.GetTaggedValue());
984 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, ReplaceAllElements, callInfo);
985 }
986 {
987 auto callInfo = NewEmptyCallInfo(thread);
988 callInfo->SetThis(vector.GetTaggedValue());
989 callInfo->SetCallArg(0, JSTaggedValue(-1));
990 CONTAINERS_API_EXCEPTION_TEST(ContainersVector, Set, callInfo);
991 }
992 }
993
HWTEST_F_L0(ContainersVectorTest,ExceptionReturn4)994 HWTEST_F_L0(ContainersVectorTest, ExceptionReturn4)
995 {
996 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Clone);
997 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Has);
998 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, CopyToArray);
999 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, ConvertToArray);
1000 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetFirstElement);
1001 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, Sort);
1002 CONTAINERS_API_TYPE_MISMATCH_EXCEPTION_TEST(ContainersVector, GetIteratorObj);
1003 }
1004 } // namespace panda::test