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