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