• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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