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