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