• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "arkcompiler/ets_runtime/ecmascript/containers/containers_bitvector.h"
17 #include "arkcompiler/ets_runtime/ecmascript/js_api/js_api_bitvector.h"
18 #include "arkcompiler/ets_runtime/ecmascript/js_api/js_api_bitvector_iterator.h"
19 #include "ecmascript/containers/containers_private.h"
20 #include "ecmascript/containers/tests/containers_test_helper.h"
21 #include "ecmascript/ecma_runtime_call_info.h"
22 #include "ecmascript/global_env.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 using namespace panda::ecmascript;
29 using namespace panda::ecmascript::containers;
30 namespace panda::test {
31 class ContainersBitVectorTest : public testing::Test {
32 public:
SetUpTestCase()33     static void SetUpTestCase()
34     {
35         GTEST_LOG_(INFO) << "SetUpTestCase";
36     }
TearDownTestCase()37     static void TearDownTestCase()
38     {
39         GTEST_LOG_(INFO) << "TearDownCase";
40     }
SetUp()41     void SetUp() override
42     {
43         TestHelper::CreateEcmaVMWithScope(instance, thread, scope);
44     }
TearDown()45     void TearDown() override
46     {
47         TestHelper::DestroyEcmaVMWithScope(instance, scope);
48     }
49     EcmaVM* instance { nullptr };
50     EcmaHandleScope* scope { nullptr };
51     JSThread* thread { nullptr };
52 
53 protected:
InitializeBitVectorConstructor()54     JSTaggedValue InitializeBitVectorConstructor()
55     {
56         ObjectFactory* factory = thread->GetEcmaVM()->GetFactory();
57         JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
58         JSHandle<JSTaggedValue> globalObject = env->GetJSGlobalObject();
59         JSHandle<JSTaggedValue> key(factory->NewFromASCII("ArkPrivate"));
60         JSHandle<JSTaggedValue> value =
61             JSObject::GetProperty(thread, JSHandle<JSTaggedValue>(globalObject), key).GetValue();
62         auto objCallInfo =
63             TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
64         objCallInfo->SetFunction(JSTaggedValue::Undefined());
65         objCallInfo->SetThis(value.GetTaggedValue());
66         objCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int>(ContainerTag::BitVector)));
67         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
68         JSTaggedValue result = ContainersPrivate::Load(objCallInfo);
69         TestHelper::TearDownFrame(thread, prev);
70         return result;
71     }
CreateJSAPIBitVector()72     JSHandle<JSAPIBitVector> CreateJSAPIBitVector()
73     {
74         JSHandle<JSFunction> newTarget(thread, InitializeBitVectorConstructor());
75         auto objCallInfo =
76             TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
77         objCallInfo->SetFunction(newTarget.GetTaggedValue());
78         objCallInfo->SetNewTarget(newTarget.GetTaggedValue());
79         objCallInfo->SetThis(JSTaggedValue::Undefined());
80         objCallInfo->SetCallArg(0, JSTaggedValue(0));
81         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
82         JSTaggedValue result = ContainersBitVector::BitVectorConstructor(objCallInfo);
83         TestHelper::TearDownFrame(thread, prev);
84         JSHandle<JSAPIBitVector> bitVector(thread, result);
85         return bitVector;
86     }
Push(JSHandle<JSAPIBitVector> bitVector)87     void Push(JSHandle<JSAPIBitVector> bitVector)
88     {
89         constexpr uint32_t NODE_NUMBERS = 64;
90         for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
91             if (i >= 32) { // 32 means half bitvector length
92                 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
93                 callInfo->SetFunction(JSTaggedValue::Undefined());
94                 callInfo->SetThis(bitVector.GetTaggedValue());
95                 callInfo->SetCallArg(0, JSTaggedValue(1));
96                 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
97                 ContainersBitVector::Push(callInfo);
98                 TestHelper::TearDownFrame(thread, prev);
99             } else {
100                 auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
101                 callInfo->SetFunction(JSTaggedValue::Undefined());
102                 callInfo->SetThis(bitVector.GetTaggedValue());
103                 callInfo->SetCallArg(0, JSTaggedValue(0));
104                 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
105                 ContainersBitVector::Push(callInfo);
106                 TestHelper::TearDownFrame(thread, prev);
107             }
108         }
109     }
Has(JSHandle<JSAPIBitVector> bitVector,int number,int startIndex,int endIndex)110     JSTaggedValue Has(JSHandle<JSAPIBitVector> bitVector, int number, int startIndex, int endIndex)
111     {
112         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
113         callInfo->SetFunction(JSTaggedValue::Undefined());
114         callInfo->SetThis(bitVector.GetTaggedValue());
115         callInfo->SetCallArg(0, JSTaggedValue(number));
116         callInfo->SetCallArg(1, JSTaggedValue(startIndex));
117         callInfo->SetCallArg(2, JSTaggedValue(endIndex)); // 2 means third args.
118         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
119         JSTaggedValue result = ContainersBitVector::Has(callInfo);
120         TestHelper::TearDownFrame(thread, prev);
121         return result;
122     }
123 };
124 /**
125    * @tc.number: _BitVector_BitVevtorConstructor_Func_001
126    * @tc.name: test_init_bitvector
127    * @tc.desc: A constructor used to create a BitVector object.
128    * @tc.size: MediumTest
129    * @tc.type: Function
130    * @tc.level: Level 0
131    */
HWTEST_F_L0(ContainersBitVectorTest,BitVectorConstructor)132 HWTEST_F_L0(ContainersBitVectorTest, BitVectorConstructor)
133 {
134     InitializeBitVectorConstructor();
135     JSHandle<JSFunction> newTarget(thread, InitializeBitVectorConstructor());
136     auto objCallInfo =
137         TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
138     objCallInfo->SetFunction(newTarget.GetTaggedValue());
139     objCallInfo->SetNewTarget(newTarget.GetTaggedValue());
140     objCallInfo->SetThis(JSTaggedValue::Undefined());
141     objCallInfo->SetCallArg(0, JSTaggedValue(10));
142     [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, objCallInfo);
143     JSTaggedValue result = ContainersBitVector::BitVectorConstructor(objCallInfo);
144     TestHelper::TearDownFrame(thread, prev);
145     ASSERT_TRUE(result.IsJSAPIBitVector());
146     JSHandle<JSAPIBitVector> bitVector(thread, result);
147     JSTaggedValue resultProto = JSObject::GetPrototype(JSHandle<JSObject>::Cast(bitVector));
148     JSTaggedValue funcProto = newTarget->GetFunctionPrototype();
149     ASSERT_EQ(resultProto, funcProto);
150     int length = bitVector->GetLength();
151     ASSERT_EQ(length, 10);
152     objCallInfo->SetNewTarget(JSTaggedValue::Undefined());
153     CONTAINERS_API_EXCEPTION_TEST(ContainersBitVector, BitVectorConstructor, objCallInfo);
154 }
155 /**
156    * @tc.number: _BitVector_push_Func_001
157    * @tc.name: test_push
158    * @tc.desc: Appends the bit element to the end of this bit vector.
159    * @tc.size: MediumTest
160    * @tc.type: Function
161    * @tc.level: Level 0
162    */
HWTEST_F_L0(ContainersBitVectorTest,Push_001)163 HWTEST_F_L0(ContainersBitVectorTest, Push_001)
164 {
165     constexpr uint32_t NODE_NUMBERS = 8;
166     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
167     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
168         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
169         callInfo->SetFunction(JSTaggedValue::Undefined());
170         callInfo->SetThis(bitVector.GetTaggedValue());
171         callInfo->SetCallArg(0, JSTaggedValue(1));
172         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
173         JSTaggedValue result = ContainersBitVector::Push(callInfo);
174         TestHelper::TearDownFrame(thread, prev);
175         EXPECT_EQ(result, JSTaggedValue::True());
176         EXPECT_EQ(bitVector->GetLength(), i + 1);
177     }
178 }
179 /**
180    * @tc.number: _BitVector_pop_Func_001
181    * @tc.name: test_pop
182    * @tc.desc: Retrieves and removes the bit element to the end of this bit vector.
183    * @tc.size: MediumTest
184    * @tc.type: Function
185    * @tc.level: Level 0
186    */
HWTEST_F_L0(ContainersBitVectorTest,Pop_001)187 HWTEST_F_L0(ContainersBitVectorTest, Pop_001)
188 {
189     constexpr uint32_t NODE_NUMBERS = 8;
190     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
191     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
192         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
193         callInfo->SetFunction(JSTaggedValue::Undefined());
194         callInfo->SetThis(bitVector.GetTaggedValue());
195         callInfo->SetCallArg(0, JSTaggedValue(1));
196         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
197         JSTaggedValue result = ContainersBitVector::Push(callInfo);
198         TestHelper::TearDownFrame(thread, prev);
199         EXPECT_EQ(result, JSTaggedValue::True());
200         EXPECT_EQ(bitVector->GetLength(), i + 1);
201     }
202     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
203         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
204         callInfo->SetFunction(JSTaggedValue::Undefined());
205         callInfo->SetThis(bitVector.GetTaggedValue());
206         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
207         JSTaggedValue result = ContainersBitVector::Pop(callInfo);
208         TestHelper::TearDownFrame(thread, prev);
209         EXPECT_EQ(result, JSTaggedValue(1));
210     }
211 }
212 /**
213    * @tc.number: _BitVector_has_Func_001
214    * @tc.name: test_has
215    * @tc.desc: Check if bit vector contains a particular bit element
216    * @tc.size: MediumTest
217    * @tc.type: Function
218    * @tc.level: Level 0
219    */
HWTEST_F_L0(ContainersBitVectorTest,Has_001)220 HWTEST_F_L0(ContainersBitVectorTest, Has_001)
221 {
222     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
223     {
224         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
225         callInfo->SetFunction(JSTaggedValue::Undefined());
226         callInfo->SetThis(bitVector.GetTaggedValue());
227         callInfo->SetCallArg(0, JSTaggedValue(1));
228         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
229         JSTaggedValue result = ContainersBitVector::Push(callInfo);
230         TestHelper::TearDownFrame(thread, prev);
231         EXPECT_EQ(result, JSTaggedValue::True());
232         EXPECT_EQ(bitVector->GetLength(), 1);
233     }
234     {
235         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
236         callInfo->SetFunction(JSTaggedValue::Undefined());
237         callInfo->SetThis(bitVector.GetTaggedValue());
238         callInfo->SetCallArg(0, JSTaggedValue(1));
239         callInfo->SetCallArg(1, JSTaggedValue(0));
240         callInfo->SetCallArg(2, JSTaggedValue(1));
241         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
242         JSTaggedValue result = ContainersBitVector::Has(callInfo);
243         TestHelper::TearDownFrame(thread, prev);
244         EXPECT_EQ(result, JSTaggedValue::True());
245     }
246 }
247 /**
248    * @tc.number: _BitVector_has_Func_002
249    * @tc.name: test_has
250    * @tc.desc: Check if bit vector contains a particular bit element
251    * @tc.size: MediumTest
252    * @tc.type: Function
253    * @tc.level: Level 2
254    */
HWTEST_F_L0(ContainersBitVectorTest,Has_002)255 HWTEST_F_L0(ContainersBitVectorTest, Has_002)
256 {
257     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
258     {
259         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
260         callInfo->SetFunction(JSTaggedValue::Undefined());
261         callInfo->SetThis(bitVector.GetTaggedValue());
262         callInfo->SetCallArg(0, JSTaggedValue(1));
263         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
264         JSTaggedValue result = ContainersBitVector::Push(callInfo);
265         TestHelper::TearDownFrame(thread, prev);
266         EXPECT_EQ(result, JSTaggedValue::True());
267         EXPECT_EQ(bitVector->GetLength(), 1);
268     }
269     {
270         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
271         callInfo->SetFunction(JSTaggedValue::Undefined());
272         callInfo->SetThis(bitVector.GetTaggedValue());
273         callInfo->SetCallArg(0, JSTaggedValue(1));
274         callInfo->SetCallArg(1, JSTaggedValue(1.1));
275         callInfo->SetCallArg(2, JSTaggedValue(1.1));
276         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
277         JSTaggedValue result = ContainersBitVector::Has(callInfo);
278         TestHelper::TearDownFrame(thread, prev);
279         EXPECT_TRUE(thread->HasPendingException());
280         EXPECT_EQ(result, JSTaggedValue::Exception());
281         thread->ClearException();
282     }
283 }
284 /**
285    * @tc.number: _BitVector_has_Func_003
286    * @tc.name: test_has
287    * @tc.desc: Check if bit vector contains a particular bit element
288    * @tc.size: MediumTest
289    * @tc.type: Function
290    * @tc.level: Level 1
291    */
HWTEST_F_L0(ContainersBitVectorTest,Has_003)292 HWTEST_F_L0(ContainersBitVectorTest, Has_003)
293 {
294     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
295     Push(bitVector);
296     JSTaggedValue result1 = Has(bitVector, 1, 0, 31);
297     EXPECT_EQ(result1, JSTaggedValue::False());
298     JSTaggedValue result2 = Has(bitVector, 0, 0, 32);
299     EXPECT_EQ(result2, JSTaggedValue::True());
300     JSTaggedValue result3 = Has(bitVector, 1, 32, 64);
301     EXPECT_EQ(result3, JSTaggedValue::True());
302     JSTaggedValue result4 = Has(bitVector, 0, 32, 63);
303     EXPECT_EQ(result4, JSTaggedValue::False());
304 }
305 /**
306    * @tc.number: _BitVector_setBitsByRange_Func_001
307    * @tc.name: test_setBitsByRange
308    * @tc.desc: Sets a range of bits in a bit vector to a particular element.
309    * @tc.size: MediumTest
310    * @tc.type: Function
311    * @tc.level: Level 0
312    */
HWTEST_F_L0(ContainersBitVectorTest,SetBitsByRange_001)313 HWTEST_F_L0(ContainersBitVectorTest, SetBitsByRange_001)
314 {
315     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
316     {
317         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
318         callInfo->SetFunction(JSTaggedValue::Undefined());
319         callInfo->SetThis(bitVector.GetTaggedValue());
320         callInfo->SetCallArg(0, JSTaggedValue(1));
321         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
322         JSTaggedValue result = ContainersBitVector::Push(callInfo);
323         TestHelper::TearDownFrame(thread, prev);
324         EXPECT_EQ(result, JSTaggedValue::True());
325         EXPECT_EQ(bitVector->GetLength(), 1);
326     }
327     {
328         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
329         callInfo->SetFunction(JSTaggedValue::Undefined());
330         callInfo->SetThis(bitVector.GetTaggedValue());
331         callInfo->SetCallArg(0, JSTaggedValue(0));
332         callInfo->SetCallArg(1, JSTaggedValue(0));
333         callInfo->SetCallArg(2, JSTaggedValue(1));
334         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
335         ContainersBitVector::SetBitsByRange(callInfo);
336         TestHelper::TearDownFrame(thread, prev);
337     }
338     {
339         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
340         callInfo->SetFunction(JSTaggedValue::Undefined());
341         callInfo->SetThis(bitVector.GetTaggedValue());
342         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
343         JSTaggedValue result = ContainersBitVector::Pop(callInfo);
344         TestHelper::TearDownFrame(thread, prev);
345         EXPECT_EQ(result, JSTaggedValue(0));
346     }
347 }
348 /**
349    * @tc.number: _BitVector_setBitsByRange_Func_002
350    * @tc.name: test_setBitsByRange
351    * @tc.desc: Sets a range of bits in a bit vector to a particular element.
352    * @tc.size: MediumTest
353    * @tc.type: Function
354    * @tc.level: Level 2
355    */
HWTEST_F_L0(ContainersBitVectorTest,SetBitsByRange_002)356 HWTEST_F_L0(ContainersBitVectorTest, SetBitsByRange_002)
357 {
358     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
359     {
360         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
361         callInfo->SetFunction(JSTaggedValue::Undefined());
362         callInfo->SetThis(bitVector.GetTaggedValue());
363         callInfo->SetCallArg(0, JSTaggedValue(1));
364         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
365         JSTaggedValue result = ContainersBitVector::Push(callInfo);
366         TestHelper::TearDownFrame(thread, prev);
367         EXPECT_EQ(result, JSTaggedValue::True());
368         EXPECT_EQ(bitVector->GetLength(), 1);
369     }
370     {
371         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
372         callInfo->SetFunction(JSTaggedValue::Undefined());
373         callInfo->SetThis(bitVector.GetTaggedValue());
374         callInfo->SetCallArg(0, JSTaggedValue(0));
375         callInfo->SetCallArg(1, JSTaggedValue(1.1));
376         callInfo->SetCallArg(2, JSTaggedValue(1));
377         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
378         JSTaggedValue result = ContainersBitVector::SetBitsByRange(callInfo);
379         TestHelper::TearDownFrame(thread, prev);
380         EXPECT_TRUE(thread->HasPendingException());
381         EXPECT_EQ(result, JSTaggedValue::Exception());
382         thread->ClearException();
383     }
384 }
385 /**
386    * @tc.number: _BitVector_setBitsByRange_Func_003
387    * @tc.name: test_setBitsByRange
388    * @tc.desc: Sets a range of bits in a bit vector to a particular element.
389    * @tc.size: MediumTest
390    * @tc.type: Function
391    * @tc.level: Level 1
392    */
HWTEST_F_L0(ContainersBitVectorTest,SetBitsByRange_003)393 HWTEST_F_L0(ContainersBitVectorTest, SetBitsByRange_003)
394 {
395     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
396     Push(bitVector);
397     {
398         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
399         callInfo->SetFunction(JSTaggedValue::Undefined());
400         callInfo->SetThis(bitVector.GetTaggedValue());
401         callInfo->SetCallArg(0, JSTaggedValue(1));
402         callInfo->SetCallArg(1, JSTaggedValue(0));
403         callInfo->SetCallArg(2, JSTaggedValue(32));
404         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
405         ContainersBitVector::SetBitsByRange(callInfo);
406         TestHelper::TearDownFrame(thread, prev);
407     }
408     {
409         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
410         callInfo->SetFunction(JSTaggedValue::Undefined());
411         callInfo->SetThis(bitVector.GetTaggedValue());
412         callInfo->SetCallArg(0, JSTaggedValue(0));
413         callInfo->SetCallArg(1, JSTaggedValue(32));
414         callInfo->SetCallArg(2, JSTaggedValue(64));
415         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
416         ContainersBitVector::SetBitsByRange(callInfo);
417         TestHelper::TearDownFrame(thread, prev);
418     }
419     constexpr uint32_t NODE_NUMBERS = 64;
420     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
421         if (i >= 32) { // 32 means half bitvector length
422             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
423             callInfo->SetFunction(JSTaggedValue::Undefined());
424             callInfo->SetThis(bitVector.GetTaggedValue());
425             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
426             JSTaggedValue result0 = ContainersBitVector::Pop(callInfo);
427             TestHelper::TearDownFrame(thread, prev);
428             EXPECT_EQ(result0, JSTaggedValue(1));
429         } else {
430             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
431             callInfo->SetFunction(JSTaggedValue::Undefined());
432             callInfo->SetThis(bitVector.GetTaggedValue());
433             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
434             JSTaggedValue result1 = ContainersBitVector::Pop(callInfo);
435             TestHelper::TearDownFrame(thread, prev);
436             EXPECT_EQ(result1, JSTaggedValue(0));
437         }
438     }
439 }
440 /**
441    * @tc.number: _BitVector_setAllBits_Func_001
442    * @tc.name: test_setAllBits
443    * @tc.desc: Sets all of bits in a bit vector to a particular element.
444    * @tc.size: MediumTest MediumTest
445    * @tc.type: Function
446    * @tc.level: Level 0
447    */
HWTEST_F_L0(ContainersBitVectorTest,SetAllBits_001)448 HWTEST_F_L0(ContainersBitVectorTest, SetAllBits_001)
449 {
450     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
451     {
452         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
453         callInfo->SetFunction(JSTaggedValue::Undefined());
454         callInfo->SetThis(bitVector.GetTaggedValue());
455         callInfo->SetCallArg(0, JSTaggedValue(0));
456         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
457         JSTaggedValue result = ContainersBitVector::Push(callInfo);
458         TestHelper::TearDownFrame(thread, prev);
459         EXPECT_EQ(result, JSTaggedValue::True());
460         EXPECT_EQ(bitVector->GetLength(), 1);
461     }
462     {
463         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
464         callInfo->SetFunction(JSTaggedValue::Undefined());
465         callInfo->SetThis(bitVector.GetTaggedValue());
466         callInfo->SetCallArg(0, JSTaggedValue(1));
467         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
468         ContainersBitVector::SetAllBits(callInfo);
469         TestHelper::TearDownFrame(thread, prev);
470         EXPECT_EQ(bitVector->GetSize(), 1);
471     }
472     {
473         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
474         callInfo->SetFunction(JSTaggedValue::Undefined());
475         callInfo->SetThis(bitVector.GetTaggedValue());
476         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
477         JSTaggedValue result = ContainersBitVector::Pop(callInfo);
478         TestHelper::TearDownFrame(thread, prev);
479         EXPECT_EQ(result, JSTaggedValue(1));
480     }
481 }
482 /**
483    * @tc.number: _BitVector_setAllBits_Func_002
484    * @tc.name: test_setAllBits
485    * @tc.desc: Sets all of bits in a bit vector to a particular element.
486    * @tc.size: MediumTest
487    * @tc.type: Function
488    * @tc.level: Level 1
489    */
HWTEST_F_L0(ContainersBitVectorTest,SetAllBits_002)490 HWTEST_F_L0(ContainersBitVectorTest, SetAllBits_002)
491 {
492     constexpr uint32_t NODE_NUMBERS = 64;
493     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
494     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
495         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
496         callInfo->SetFunction(JSTaggedValue::Undefined());
497         callInfo->SetThis(bitVector.GetTaggedValue());
498         callInfo->SetCallArg(0, JSTaggedValue(0));
499         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
500         ContainersBitVector::Push(callInfo);
501         TestHelper::TearDownFrame(thread, prev);
502     }
503     EXPECT_EQ(bitVector->GetSize(), 64);
504     {
505         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
506         callInfo->SetFunction(JSTaggedValue::Undefined());
507         callInfo->SetThis(bitVector.GetTaggedValue());
508         callInfo->SetCallArg(0, JSTaggedValue(1));
509         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
510         ContainersBitVector::SetAllBits(callInfo);
511         TestHelper::TearDownFrame(thread, prev);
512     }
513     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
514         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
515         callInfo->SetFunction(JSTaggedValue::Undefined());
516         callInfo->SetThis(bitVector.GetTaggedValue());
517         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
518         JSTaggedValue result = ContainersBitVector::Pop(callInfo);
519         TestHelper::TearDownFrame(thread, prev);
520         EXPECT_EQ(result, JSTaggedValue(1));
521     }
522 }
523 /**
524    * @tc.number: _BitVector_setAllBits_Func_003
525    * @tc.name: test_setAllBits
526    * @tc.desc: Sets all of bits in a bit vector to a particular element.
527    * @tc.size: MediumTest
528    * @tc.type: Function
529    * @tc.level: Level 1
530    */
HWTEST_F_L0(ContainersBitVectorTest,SetAllBits_003)531 HWTEST_F_L0(ContainersBitVectorTest, SetAllBits_003)
532 {
533     constexpr uint32_t NODE_NUMBERS = 64;
534     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
535     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
536         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
537         callInfo->SetFunction(JSTaggedValue::Undefined());
538         callInfo->SetThis(bitVector.GetTaggedValue());
539         callInfo->SetCallArg(0, JSTaggedValue(1));
540         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
541         ContainersBitVector::Push(callInfo);
542         TestHelper::TearDownFrame(thread, prev);
543     }
544     EXPECT_EQ(bitVector->GetSize(), 64);
545     {
546         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
547         callInfo->SetFunction(JSTaggedValue::Undefined());
548         callInfo->SetThis(bitVector.GetTaggedValue());
549         callInfo->SetCallArg(0, JSTaggedValue(0));
550         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
551         ContainersBitVector::SetAllBits(callInfo);
552         TestHelper::TearDownFrame(thread, prev);
553     }
554     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
555         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
556         callInfo->SetFunction(JSTaggedValue::Undefined());
557         callInfo->SetThis(bitVector.GetTaggedValue());
558         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
559         JSTaggedValue result = ContainersBitVector::Pop(callInfo);
560         TestHelper::TearDownFrame(thread, prev);
561         EXPECT_EQ(result, JSTaggedValue(0));
562     }
563 }
564 /**
565    * @tc.number: _BitVector_getBitsByRange_Func_001
566    * @tc.name: test_getBitsByRange
567    * @tc.desc: Returns the bit values in a range of indices in a bit vector.
568    * @tc.size: MediumTest
569    * @tc.type: Function
570    * @tc.level: Level 0
571    */
HWTEST_F_L0(ContainersBitVectorTest,GetBitsByRange_001)572 HWTEST_F_L0(ContainersBitVectorTest, GetBitsByRange_001)
573 {
574     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
575     {
576         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
577         callInfo->SetFunction(JSTaggedValue::Undefined());
578         callInfo->SetThis(bitVector.GetTaggedValue());
579         callInfo->SetCallArg(0, JSTaggedValue(1));
580         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
581         JSTaggedValue result = ContainersBitVector::Push(callInfo);
582         TestHelper::TearDownFrame(thread, prev);
583         EXPECT_EQ(result, JSTaggedValue::True());
584         EXPECT_EQ(bitVector->GetLength(), 1);
585     }
586     {
587         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
588         callInfo->SetFunction(JSTaggedValue::Undefined());
589         callInfo->SetThis(bitVector.GetTaggedValue());
590         callInfo->SetCallArg(0, JSTaggedValue(0));
591         callInfo->SetCallArg(1, JSTaggedValue(1));
592         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
593         JSTaggedValue result = ContainersBitVector::GetBitsByRange(callInfo);
594         TestHelper::TearDownFrame(thread, prev);
595 
596         JSHandle<JSNativePointer> np(thread, JSAPIBitVector::Cast(result.GetTaggedObject())->GetNativePointer());
597         auto elements =
598             reinterpret_cast<std::vector<std::bitset<JSAPIBitVector::BIT_SET_LENGTH>> *>(np->GetExternalPointer());
599         EXPECT_EQ((*elements)[0].test(0), 1);
600     }
601 }
602 /**
603    * @tc.number: _BitVector_getBitsByRange_Func_002
604    * @tc.name: test_getBitsByRange
605    * @tc.desc: Returns the bit values in a range of indices in a bit vector.
606    * @tc.size: MediumTest
607    * @tc.type: Function
608    * @tc.level: Level 2
609    */
HWTEST_F_L0(ContainersBitVectorTest,GetBitsByRange_002)610 HWTEST_F_L0(ContainersBitVectorTest, GetBitsByRange_002)
611 {
612     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
613     {
614         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
615         callInfo->SetFunction(JSTaggedValue::Undefined());
616         callInfo->SetThis(bitVector.GetTaggedValue());
617         callInfo->SetCallArg(0, JSTaggedValue(1));
618         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
619         JSTaggedValue result = ContainersBitVector::Push(callInfo);
620         TestHelper::TearDownFrame(thread, prev);
621         EXPECT_EQ(result, JSTaggedValue::True());
622         EXPECT_EQ(bitVector->GetLength(), 1);
623     }
624     {
625         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
626         callInfo->SetFunction(JSTaggedValue::Undefined());
627         callInfo->SetThis(bitVector.GetTaggedValue());
628         callInfo->SetCallArg(0, JSTaggedValue(1.1));
629         callInfo->SetCallArg(1, JSTaggedValue(1.1));
630         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
631         JSTaggedValue result = ContainersBitVector::GetBitsByRange(callInfo);
632         TestHelper::TearDownFrame(thread, prev);
633         EXPECT_TRUE(thread->HasPendingException());
634         EXPECT_EQ(result, JSTaggedValue::Exception());
635         thread->ClearException();
636     }
637 }
638 /**
639    * @tc.number: _BitVector_getBitsByRange_Func_003
640    * @tc.name: test_getBitsByRange
641    * @tc.desc: Returns the bit values in a range of indices in a bit vector.
642    * @tc.size: MediumTest
643    * @tc.type: Function
644    * @tc.level: Level 1
645    */
HWTEST_F_L0(ContainersBitVectorTest,GetBitsByRange_003)646 HWTEST_F_L0(ContainersBitVectorTest, GetBitsByRange_003)
647 {
648     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
649     Push(bitVector);
650     {
651         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
652         callInfo->SetFunction(JSTaggedValue::Undefined());
653         callInfo->SetThis(bitVector.GetTaggedValue());
654         callInfo->SetCallArg(0, JSTaggedValue(0)); //range 0 to 31
655         callInfo->SetCallArg(1, JSTaggedValue(31));
656 
657         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
658         JSTaggedValue result = ContainersBitVector::GetBitsByRange(callInfo);
659         TestHelper::TearDownFrame(thread, prev);
660 
661         JSHandle<JSNativePointer> np(thread, JSAPIBitVector::Cast(result.GetTaggedObject())->GetNativePointer());
662         auto elements =
663             reinterpret_cast<std::vector<std::bitset<JSAPIBitVector::BIT_SET_LENGTH>> *>(np->GetExternalPointer());
664         EXPECT_EQ((*elements)[0].test(0), 0);
665     }
666     {
667         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
668         callInfo->SetFunction(JSTaggedValue::Undefined());
669         callInfo->SetThis(bitVector.GetTaggedValue());
670         callInfo->SetCallArg(0, JSTaggedValue(32));
671         callInfo->SetCallArg(1, JSTaggedValue(64));
672         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
673         JSTaggedValue result = ContainersBitVector::GetBitsByRange(callInfo);
674         TestHelper::TearDownFrame(thread, prev);
675 
676         JSHandle<JSNativePointer> np(thread, JSAPIBitVector::Cast(result.GetTaggedObject())->GetNativePointer());
677         auto elements =
678             reinterpret_cast<std::vector<std::bitset<JSAPIBitVector::BIT_SET_LENGTH>> *>(np->GetExternalPointer());
679         EXPECT_EQ((*elements)[0].test(0), 1);
680     }
681 }
682 /**
683    * @tc.number: _BitVector_resize_Func_001
684    * @tc.name: test_resize
685    * @tc.desc: Resize the bitVector's length.
686    * @tc.size: MediumTest
687    * @tc.type: Function
688    * @tc.level: Level 0
689    */
HWTEST_F_L0(ContainersBitVectorTest,Resize_01)690 HWTEST_F_L0(ContainersBitVectorTest, Resize_01)
691 {
692     constexpr uint32_t NODE_NUMBERS = 8;
693     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
694     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
695         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
696         callInfo->SetFunction(JSTaggedValue::Undefined());
697         callInfo->SetThis(bitVector.GetTaggedValue());
698         callInfo->SetCallArg(0, JSTaggedValue(1));
699         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
700         JSTaggedValue result = ContainersBitVector::Push(callInfo);
701         TestHelper::TearDownFrame(thread, prev);
702         EXPECT_EQ(result, JSTaggedValue::True());
703         EXPECT_EQ(bitVector->GetLength(), i + 1);
704     }
705     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
706         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
707         callInfo->SetFunction(JSTaggedValue::Undefined());
708         callInfo->SetThis(bitVector.GetTaggedValue());
709         callInfo->SetCallArg(0, JSTaggedValue(5));
710         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
711         ContainersBitVector::Resize(callInfo);
712         TestHelper::TearDownFrame(thread, prev);
713     }
714     EXPECT_EQ(bitVector->GetLength(), 5);
715 }
716 /**
717    * @tc.number: _BitVector_resize_Func_002
718    * @tc.name: test_resize
719    * @tc.desc: Resize the bitVector's length.
720    * @tc.size: MediumTest
721    * @tc.type: Function
722    * @tc.level: Level 0
723    */
HWTEST_F_L0(ContainersBitVectorTest,Resize_02)724 HWTEST_F_L0(ContainersBitVectorTest, Resize_02)
725 {
726     constexpr uint32_t NODE_NUMBERS = 8;
727     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
728     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
729         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
730         callInfo->SetFunction(JSTaggedValue::Undefined());
731         callInfo->SetThis(bitVector.GetTaggedValue());
732         callInfo->SetCallArg(0, JSTaggedValue(1));
733         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
734         JSTaggedValue result = ContainersBitVector::Push(callInfo);
735         TestHelper::TearDownFrame(thread, prev);
736         EXPECT_EQ(result, JSTaggedValue::True());
737         EXPECT_EQ(bitVector->GetLength(), i + 1);
738     }
739     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
740         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
741         callInfo->SetFunction(JSTaggedValue::Undefined());
742         callInfo->SetThis(bitVector.GetTaggedValue());
743         callInfo->SetCallArg(0, JSTaggedValue(8));
744         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
745         ContainersBitVector::Resize(callInfo);
746         TestHelper::TearDownFrame(thread, prev);
747     }
748     EXPECT_EQ(bitVector->GetLength(), 8);
749 }
750 /**
751    * @tc.number: _BitVector_resize_Func_003
752    * @tc.name: test_resize
753    * @tc.desc: Resize the bitVector's length.
754    * @tc.size: MediumTest
755    * @tc.type: Function
756    * @tc.level: Level 0
757    */
HWTEST_F_L0(ContainersBitVectorTest,Resize_03)758 HWTEST_F_L0(ContainersBitVectorTest, Resize_03)
759 {
760     constexpr uint32_t NODE_NUMBERS = 8;
761     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
762     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
763         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
764         callInfo->SetFunction(JSTaggedValue::Undefined());
765         callInfo->SetThis(bitVector.GetTaggedValue());
766         callInfo->SetCallArg(0, JSTaggedValue(1));
767         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
768         JSTaggedValue result = ContainersBitVector::Push(callInfo);
769         TestHelper::TearDownFrame(thread, prev);
770         EXPECT_EQ(result, JSTaggedValue::True());
771         EXPECT_EQ(bitVector->GetLength(), i + 1);
772     }
773     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
774         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
775         callInfo->SetFunction(JSTaggedValue::Undefined());
776         callInfo->SetThis(bitVector.GetTaggedValue());
777         callInfo->SetCallArg(0, JSTaggedValue(10));
778         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
779         ContainersBitVector::Resize(callInfo);
780         TestHelper::TearDownFrame(thread, prev);
781     }
782     EXPECT_EQ(bitVector->GetLength(), 10);
783     for (uint32_t i = 0; i < 2; i++) {
784         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
785         callInfo->SetFunction(JSTaggedValue::Undefined());
786         callInfo->SetThis(bitVector.GetTaggedValue());
787         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
788         JSTaggedValue result = ContainersBitVector::Pop(callInfo);
789         TestHelper::TearDownFrame(thread, prev);
790         EXPECT_EQ(result, JSTaggedValue(0));
791     }
792 }
793 /**
794    * @tc.number: _BitVector_resize_Func_004
795    * @tc.name: test_resize
796    * @tc.desc: Resize the bitVector's length.
797    * @tc.size: MediumTest
798    * @tc.type: Function
799    * @tc.level: Level 2
800    */
HWTEST_F_L0(ContainersBitVectorTest,Resize_04)801 HWTEST_F_L0(ContainersBitVectorTest, Resize_04)
802 {
803     constexpr uint32_t NODE_NUMBERS = 8;
804     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
805     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
806         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
807         callInfo->SetFunction(JSTaggedValue::Undefined());
808         callInfo->SetThis(bitVector.GetTaggedValue());
809         callInfo->SetCallArg(0, JSTaggedValue(1));
810         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
811         JSTaggedValue result = ContainersBitVector::Push(callInfo);
812         TestHelper::TearDownFrame(thread, prev);
813         EXPECT_EQ(result, JSTaggedValue::True());
814         EXPECT_EQ(bitVector->GetLength(), i + 1);
815     }
816     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
817         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
818         callInfo->SetFunction(JSTaggedValue::Undefined());
819         callInfo->SetThis(bitVector.GetTaggedValue());
820         callInfo->SetCallArg(0, JSTaggedValue(1.1));
821         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
822         JSTaggedValue result = ContainersBitVector::Resize(callInfo);
823         TestHelper::TearDownFrame(thread, prev);
824         EXPECT_TRUE(thread->HasPendingException());
825         EXPECT_EQ(result, JSTaggedValue::Exception());
826         thread->ClearException();
827     }
828 }
829 /**
830    * @tc.number: _BitVector_getBitCountByRange_Func_001
831    * @tc.name: test_getBitCountByRange
832    * @tc.desc: Counts the number of times a certain bit element occurs within a range of bits in a bit vector.
833    * @tc.size: MediumTest
834    * @tc.type: Function
835    * @tc.level: Level 0
836    */
HWTEST_F_L0(ContainersBitVectorTest,GetBitCountByRange_001)837 HWTEST_F_L0(ContainersBitVectorTest, GetBitCountByRange_001)
838 {
839     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
840     {
841         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
842         callInfo->SetFunction(JSTaggedValue::Undefined());
843         callInfo->SetThis(bitVector.GetTaggedValue());
844         callInfo->SetCallArg(0, JSTaggedValue(1));
845         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
846         JSTaggedValue result = ContainersBitVector::Push(callInfo);
847         TestHelper::TearDownFrame(thread, prev);
848         EXPECT_EQ(result, JSTaggedValue::True());
849         EXPECT_EQ(bitVector->GetLength(), 1);
850     }
851     {
852         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
853         callInfo->SetFunction(JSTaggedValue::Undefined());
854         callInfo->SetThis(bitVector.GetTaggedValue());
855         callInfo->SetCallArg(0, JSTaggedValue(1));
856         callInfo->SetCallArg(1, JSTaggedValue(0));
857         callInfo->SetCallArg(2, JSTaggedValue(1));
858         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
859         JSTaggedValue result = ContainersBitVector::GetBitCountByRange(callInfo);
860         TestHelper::TearDownFrame(thread, prev);
861         EXPECT_EQ(result, JSTaggedValue(1));
862     }
863 }
864 /**
865    * @tc.number: _BitVector_getBitCountByRange_Func_002
866    * @tc.name: test_getBitCountByRange
867    * @tc.desc: Counts the number of times a certain bit element occurs within a range of bits in a bit vector.
868    * @tc.size: MediumTest
869    * @tc.type: Function
870    * @tc.level: Level 2
871    */
HWTEST_F_L0(ContainersBitVectorTest,GetBitCountByRange_002)872 HWTEST_F_L0(ContainersBitVectorTest, GetBitCountByRange_002)
873 {
874     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
875     {
876         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
877         callInfo->SetFunction(JSTaggedValue::Undefined());
878         callInfo->SetThis(bitVector.GetTaggedValue());
879         callInfo->SetCallArg(0, JSTaggedValue(1));
880         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
881         JSTaggedValue result = ContainersBitVector::Push(callInfo);
882         TestHelper::TearDownFrame(thread, prev);
883         EXPECT_EQ(result, JSTaggedValue::True());
884         EXPECT_EQ(bitVector->GetLength(), 1);
885     }
886     {
887         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
888         callInfo->SetFunction(JSTaggedValue::Undefined());
889         callInfo->SetThis(bitVector.GetTaggedValue());
890         callInfo->SetCallArg(0, JSTaggedValue(1));
891         callInfo->SetCallArg(1, JSTaggedValue(1.1));
892         callInfo->SetCallArg(2, JSTaggedValue(1));
893         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
894         JSTaggedValue result = ContainersBitVector::GetBitCountByRange(callInfo);
895         TestHelper::TearDownFrame(thread, prev);
896         EXPECT_TRUE(thread->HasPendingException());
897         EXPECT_EQ(result, JSTaggedValue::Exception());
898         thread->ClearException();
899     }
900 }
901 /**
902    * @tc.number: _BitVector_getBitCountByRange_Func_003
903    * @tc.name: test_getBitCountByRange
904    * @tc.desc: Counts the number of times a certain bit element occurs within a range of bits in a bit vector.
905    * @tc.size: MediumTest
906    * @tc.type: Function
907    * @tc.level: Level 1
908    */
HWTEST_F_L0(ContainersBitVectorTest,GetBitCountByRange_003)909 HWTEST_F_L0(ContainersBitVectorTest, GetBitCountByRange_003)
910 {
911     constexpr uint32_t NODE_NUMBERS = 64;
912     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
913     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
914         if (i >= 32) {
915             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
916             callInfo->SetFunction(JSTaggedValue::Undefined());
917             callInfo->SetThis(bitVector.GetTaggedValue());
918             callInfo->SetCallArg(0, JSTaggedValue(1));
919             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
920             ContainersBitVector::Push(callInfo);
921             TestHelper::TearDownFrame(thread, prev);
922         } else {
923             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
924             callInfo->SetFunction(JSTaggedValue::Undefined());
925             callInfo->SetThis(bitVector.GetTaggedValue());
926             callInfo->SetCallArg(0, JSTaggedValue(0));
927             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
928             ContainersBitVector::Push(callInfo);
929             TestHelper::TearDownFrame(thread, prev);
930         }
931     }
932     {
933         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
934         callInfo->SetFunction(JSTaggedValue::Undefined());
935         callInfo->SetThis(bitVector.GetTaggedValue());
936         callInfo->SetCallArg(0, JSTaggedValue(1));
937         callInfo->SetCallArg(1, JSTaggedValue(0));
938         callInfo->SetCallArg(2, JSTaggedValue(64));
939         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
940         JSTaggedValue result = ContainersBitVector::GetBitCountByRange(callInfo);
941         TestHelper::TearDownFrame(thread, prev);
942         EXPECT_EQ(result, JSTaggedValue(32));
943     }
944     {
945         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
946         callInfo->SetFunction(JSTaggedValue::Undefined());
947         callInfo->SetThis(bitVector.GetTaggedValue());
948         callInfo->SetCallArg(0, JSTaggedValue(0));
949         callInfo->SetCallArg(1, JSTaggedValue(0));
950         callInfo->SetCallArg(2, JSTaggedValue(64));
951         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
952         JSTaggedValue result = ContainersBitVector::GetBitCountByRange(callInfo);
953         TestHelper::TearDownFrame(thread, prev);
954         EXPECT_EQ(result, JSTaggedValue(32));
955     }
956 }
957 /**
958    * @tc.number: _BitVector_getIndexOf_Func_001
959    * @tc.name: test_getIndexOf
960    * @tc.desc: Locates the first occurrence of a certain bit value within a range of bits in a bit vector.
961    * @tc.size: MediumTest
962    * @tc.type: Function
963    * @tc.level: Level 0
964    */
HWTEST_F_L0(ContainersBitVectorTest,GetIndexOf_001)965 HWTEST_F_L0(ContainersBitVectorTest, GetIndexOf_001)
966 {
967     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
968     {
969         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
970         callInfo->SetFunction(JSTaggedValue::Undefined());
971         callInfo->SetThis(bitVector.GetTaggedValue());
972         callInfo->SetCallArg(0, JSTaggedValue(1));
973         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
974         JSTaggedValue result = ContainersBitVector::Push(callInfo);
975         TestHelper::TearDownFrame(thread, prev);
976         EXPECT_EQ(result, JSTaggedValue::True());
977         EXPECT_EQ(bitVector->GetLength(), 1);
978     }
979     {
980         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
981         callInfo->SetFunction(JSTaggedValue::Undefined());
982         callInfo->SetThis(bitVector.GetTaggedValue());
983         callInfo->SetCallArg(0, JSTaggedValue(1));
984         callInfo->SetCallArg(1, JSTaggedValue(0));
985         callInfo->SetCallArg(2, JSTaggedValue(1));
986         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
987         JSTaggedValue result = ContainersBitVector::GetIndexOf(callInfo);
988         TestHelper::TearDownFrame(thread, prev);
989         EXPECT_EQ(result, JSTaggedValue(0));
990     }
991 }
992 /**
993    * @tc.number: _BitVector_getIndexOf_Func_002
994    * @tc.name: test_getIndexOf
995    * @tc.desc: Locates the first occurrence of a certain bit value within a range of bits in a bit vector.
996    * @tc.size: MediumTest
997    * @tc.type: Function
998    * @tc.level: Level 2
999    */
HWTEST_F_L0(ContainersBitVectorTest,GetIndexOf_002)1000 HWTEST_F_L0(ContainersBitVectorTest, GetIndexOf_002)
1001 {
1002     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1003     {
1004         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1005         callInfo->SetFunction(JSTaggedValue::Undefined());
1006         callInfo->SetThis(bitVector.GetTaggedValue());
1007         callInfo->SetCallArg(0, JSTaggedValue(1));
1008         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1009         JSTaggedValue result = ContainersBitVector::Push(callInfo);
1010         TestHelper::TearDownFrame(thread, prev);
1011         EXPECT_EQ(result, JSTaggedValue::True());
1012         EXPECT_EQ(bitVector->GetLength(), 1);
1013     }
1014     {
1015         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1016         callInfo->SetFunction(JSTaggedValue::Undefined());
1017         callInfo->SetThis(bitVector.GetTaggedValue());
1018         callInfo->SetCallArg(0, JSTaggedValue(1));
1019         callInfo->SetCallArg(1, JSTaggedValue(1.1));
1020         callInfo->SetCallArg(2, JSTaggedValue(1));
1021         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1022         JSTaggedValue result = ContainersBitVector::GetIndexOf(callInfo);
1023         TestHelper::TearDownFrame(thread, prev);
1024         EXPECT_TRUE(thread->HasPendingException());
1025         EXPECT_EQ(result, JSTaggedValue::Exception());
1026         thread->ClearException();
1027     }
1028 }
1029 /**
1030    * @tc.number: _BitVector_getIndexOf_Func_003
1031    * @tc.name: test_getIndexOf
1032    * @tc.desc: Locates the first occurrence of a certain bit value within a range of bits in a bit vector.
1033    * @tc.size: MediumTest
1034    * @tc.type: Function
1035    * @tc.level: Level 1
1036    */
HWTEST_F_L0(ContainersBitVectorTest,GetIndexOf_003)1037 HWTEST_F_L0(ContainersBitVectorTest, GetIndexOf_003)
1038 {
1039     constexpr uint32_t NODE_NUMBERS = 64;
1040     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1041     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
1042         if (i >= 32) {
1043             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1044             callInfo->SetFunction(JSTaggedValue::Undefined());
1045             callInfo->SetThis(bitVector.GetTaggedValue());
1046             callInfo->SetCallArg(0, JSTaggedValue(1));
1047             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1048             ContainersBitVector::Push(callInfo);
1049             TestHelper::TearDownFrame(thread, prev);
1050         } else {
1051             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1052             callInfo->SetFunction(JSTaggedValue::Undefined());
1053             callInfo->SetThis(bitVector.GetTaggedValue());
1054             callInfo->SetCallArg(0, JSTaggedValue(0));
1055             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1056             ContainersBitVector::Push(callInfo);
1057             TestHelper::TearDownFrame(thread, prev);
1058         }
1059     }
1060     {
1061         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1062         callInfo->SetFunction(JSTaggedValue::Undefined());
1063         callInfo->SetThis(bitVector.GetTaggedValue());
1064         callInfo->SetCallArg(0, JSTaggedValue(1));
1065         callInfo->SetCallArg(1, JSTaggedValue(0));
1066         callInfo->SetCallArg(2, JSTaggedValue(64));
1067         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1068         JSTaggedValue result = ContainersBitVector::GetIndexOf(callInfo);
1069         TestHelper::TearDownFrame(thread, prev);
1070         EXPECT_EQ(result, JSTaggedValue(32));
1071     }
1072     {
1073         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1074         callInfo->SetFunction(JSTaggedValue::Undefined());
1075         callInfo->SetThis(bitVector.GetTaggedValue());
1076         callInfo->SetCallArg(0, JSTaggedValue(0));
1077         callInfo->SetCallArg(1, JSTaggedValue(0));
1078         callInfo->SetCallArg(2, JSTaggedValue(64));
1079         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1080         JSTaggedValue result = ContainersBitVector::GetIndexOf(callInfo);
1081         TestHelper::TearDownFrame(thread, prev);
1082         EXPECT_EQ(result, JSTaggedValue(0));
1083     }
1084 }
1085 /**
1086    * @tc.number: _BitVector_getLastIndexOf_Func_001
1087    * @tc.name: test_getLastIndexOf
1088    * @tc.desc: Locates the last occurrence of a certain bit value within a range of bits in a bit vector.
1089    * @tc.size: MediumTest
1090    * @tc.type: Function
1091    * @tc.level: Level 0
1092    */
HWTEST_F_L0(ContainersBitVectorTest,GetLastIndexOf_001)1093 HWTEST_F_L0(ContainersBitVectorTest, GetLastIndexOf_001)
1094 {
1095     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1096     {
1097         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1098         callInfo->SetFunction(JSTaggedValue::Undefined());
1099         callInfo->SetThis(bitVector.GetTaggedValue());
1100         callInfo->SetCallArg(0, JSTaggedValue(1));
1101         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1102         JSTaggedValue result = ContainersBitVector::Push(callInfo);
1103         TestHelper::TearDownFrame(thread, prev);
1104         EXPECT_EQ(result, JSTaggedValue::True());
1105         EXPECT_EQ(bitVector->GetLength(), 1);
1106     }
1107     {
1108         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1109         callInfo->SetFunction(JSTaggedValue::Undefined());
1110         callInfo->SetThis(bitVector.GetTaggedValue());
1111         callInfo->SetCallArg(0, JSTaggedValue(1));
1112         callInfo->SetCallArg(1, JSTaggedValue(0));
1113         callInfo->SetCallArg(2, JSTaggedValue(1));
1114         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1115         JSTaggedValue result = ContainersBitVector::GetLastIndexOf(callInfo);
1116         TestHelper::TearDownFrame(thread, prev);
1117         EXPECT_EQ(result, JSTaggedValue(0));
1118     }
1119 }
1120 /**
1121    * @tc.number: _BitVector_getLastIndexOf_Func_002
1122    * @tc.name: test_getLastIndexOf
1123    * @tc.desc: Locates the last occurrence of a certain bit value within a range of bits in a bit vector.
1124    * @tc.size: MediumTest
1125    * @tc.type: Function
1126    * @tc.level: Level 2
1127    */
HWTEST_F_L0(ContainersBitVectorTest,GetLastIndexOf_002)1128 HWTEST_F_L0(ContainersBitVectorTest, GetLastIndexOf_002)
1129 {
1130     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1131     {
1132         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1133         callInfo->SetFunction(JSTaggedValue::Undefined());
1134         callInfo->SetThis(bitVector.GetTaggedValue());
1135         callInfo->SetCallArg(0, JSTaggedValue(1));
1136         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1137         JSTaggedValue result = ContainersBitVector::Push(callInfo);
1138         TestHelper::TearDownFrame(thread, prev);
1139         EXPECT_EQ(result, JSTaggedValue::True());
1140         EXPECT_EQ(bitVector->GetLength(), 1);
1141     }
1142     {
1143         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1144         callInfo->SetFunction(JSTaggedValue::Undefined());
1145         callInfo->SetThis(bitVector.GetTaggedValue());
1146         callInfo->SetCallArg(0, JSTaggedValue(1));
1147         callInfo->SetCallArg(1, JSTaggedValue(1.1));
1148         callInfo->SetCallArg(2, JSTaggedValue(1));
1149         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1150         JSTaggedValue result = ContainersBitVector::GetLastIndexOf(callInfo);
1151         TestHelper::TearDownFrame(thread, prev);
1152         EXPECT_TRUE(thread->HasPendingException());
1153         EXPECT_EQ(result, JSTaggedValue::Exception());
1154         thread->ClearException();
1155     }
1156 }
1157 /**
1158    * @tc.number: _BitVector_getLastIndexOf_Func_003
1159    * @tc.name: test_getLastIndexOf
1160    * @tc.desc: Locates the last occurrence of a certain bit value within a range of bits in a bit vector.
1161    * @tc.size: MediumTest
1162    * @tc.type: Function
1163    * @tc.level: Level 1
1164    */
HWTEST_F_L0(ContainersBitVectorTest,GetLastIndexOf_003)1165 HWTEST_F_L0(ContainersBitVectorTest, GetLastIndexOf_003)
1166 {
1167     constexpr uint32_t NODE_NUMBERS = 64;
1168     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1169     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
1170         if (i >= 32) {
1171             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1172             callInfo->SetFunction(JSTaggedValue::Undefined());
1173             callInfo->SetThis(bitVector.GetTaggedValue());
1174             callInfo->SetCallArg(0, JSTaggedValue(1));
1175             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1176             ContainersBitVector::Push(callInfo);
1177             TestHelper::TearDownFrame(thread, prev);
1178         } else {
1179             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1180             callInfo->SetFunction(JSTaggedValue::Undefined());
1181             callInfo->SetThis(bitVector.GetTaggedValue());
1182             callInfo->SetCallArg(0, JSTaggedValue(0));
1183             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1184             ContainersBitVector::Push(callInfo);
1185             TestHelper::TearDownFrame(thread, prev);
1186         }
1187     }
1188     {
1189         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1190         callInfo->SetFunction(JSTaggedValue::Undefined());
1191         callInfo->SetThis(bitVector.GetTaggedValue());
1192         callInfo->SetCallArg(0, JSTaggedValue(1));
1193         callInfo->SetCallArg(1, JSTaggedValue(0));
1194         callInfo->SetCallArg(2, JSTaggedValue(64));
1195         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1196         JSTaggedValue result = ContainersBitVector::GetLastIndexOf(callInfo);
1197         TestHelper::TearDownFrame(thread, prev);
1198         EXPECT_EQ(result, JSTaggedValue(63));
1199     }
1200     {
1201         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1202         callInfo->SetFunction(JSTaggedValue::Undefined());
1203         callInfo->SetThis(bitVector.GetTaggedValue());
1204         callInfo->SetCallArg(0, JSTaggedValue(0));
1205         callInfo->SetCallArg(1, JSTaggedValue(0));
1206         callInfo->SetCallArg(2, JSTaggedValue(64));
1207         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1208         JSTaggedValue result = ContainersBitVector::GetLastIndexOf(callInfo);
1209         TestHelper::TearDownFrame(thread, prev);
1210         EXPECT_EQ(result, JSTaggedValue(31));
1211     }
1212 }
1213 /**
1214    * @tc.number: _BitVector_flipBitByIndex_Func_001
1215    * @tc.name: test_flipBitByIndex
1216    * @tc.desc: Flips the bit value by index in a bit vector.(Flip 0 to 1, flip 1 to 0).
1217    * @tc.size: MediumTest
1218    * @tc.type: Function
1219    * @tc.level: Level 0
1220    */
HWTEST_F_L0(ContainersBitVectorTest,FlipBitByIndex_001)1221 HWTEST_F_L0(ContainersBitVectorTest, FlipBitByIndex_001)
1222 {
1223     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1224     {
1225         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1226         callInfo->SetFunction(JSTaggedValue::Undefined());
1227         callInfo->SetThis(bitVector.GetTaggedValue());
1228         callInfo->SetCallArg(0, JSTaggedValue(1));
1229         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1230         JSTaggedValue result = ContainersBitVector::Push(callInfo);
1231         TestHelper::TearDownFrame(thread, prev);
1232         EXPECT_EQ(result, JSTaggedValue::True());
1233         EXPECT_EQ(bitVector->GetLength(), 1);
1234     }
1235     {
1236         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1237         callInfo->SetFunction(JSTaggedValue::Undefined());
1238         callInfo->SetThis(bitVector.GetTaggedValue());
1239         callInfo->SetCallArg(0, JSTaggedValue(0));
1240         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1241         ContainersBitVector::FlipBitByIndex(callInfo);
1242         TestHelper::TearDownFrame(thread, prev);
1243     }
1244     {
1245         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1246         callInfo->SetFunction(JSTaggedValue::Undefined());
1247         callInfo->SetThis(bitVector.GetTaggedValue());
1248         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1249         JSTaggedValue result = ContainersBitVector::Pop(callInfo);
1250         TestHelper::TearDownFrame(thread, prev);
1251         EXPECT_EQ(result, JSTaggedValue(0));
1252     }
1253 }
1254 /**
1255    * @tc.number: _BitVector_flipBitByIndex_Func_002
1256    * @tc.name: test_flipBitByIndex
1257    * @tc.desc: Flips the bit value by index in a bit vector.(Flip 0 to 1, flip 1 to 0).
1258    * @tc.size: MediumTest
1259    * @tc.type: Function
1260    * @tc.level: Level 2
1261    */
HWTEST_F_L0(ContainersBitVectorTest,FlipBitByIndex_2)1262 HWTEST_F_L0(ContainersBitVectorTest, FlipBitByIndex_2)
1263 {
1264     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1265     {
1266         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1267         callInfo->SetFunction(JSTaggedValue::Undefined());
1268         callInfo->SetThis(bitVector.GetTaggedValue());
1269         callInfo->SetCallArg(0, JSTaggedValue(1)); //input 1
1270 
1271         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1272         JSTaggedValue result = ContainersBitVector::Push(callInfo);
1273         TestHelper::TearDownFrame(thread, prev);
1274         EXPECT_EQ(result, JSTaggedValue::True());
1275         EXPECT_EQ(bitVector->GetLength(), 1);
1276     }
1277     {
1278         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1279         callInfo->SetFunction(JSTaggedValue::Undefined());
1280         callInfo->SetThis(bitVector.GetTaggedValue());
1281         callInfo->SetCallArg(0, JSTaggedValue(1.1));
1282         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1283         JSTaggedValue result = ContainersBitVector::FlipBitByIndex(callInfo);
1284         TestHelper::TearDownFrame(thread, prev);
1285         EXPECT_TRUE(thread->HasPendingException());
1286         EXPECT_EQ(result, JSTaggedValue::Exception());
1287         thread->ClearException();
1288     }
1289 }
1290 /**
1291    * @tc.number: _BitVector_flipBitByIndex_Func_003
1292    * @tc.name: test_flipBitByIndex
1293    * @tc.desc: Flips the bit value by index in a bit vector.(Flip 0 to 1, flip 1 to 0).
1294    * @tc.size: MediumTest
1295    * @tc.type: Function
1296    * @tc.level: Level 1
1297    */
HWTEST_F_L0(ContainersBitVectorTest,FlipBitByIndex_003)1298 HWTEST_F_L0(ContainersBitVectorTest, FlipBitByIndex_003)
1299 {
1300     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1301     Push(bitVector);
1302     constexpr uint32_t NODE_NUMBERS = 64;
1303     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
1304         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1305         callInfo->SetFunction(JSTaggedValue::Undefined());
1306         callInfo->SetThis(bitVector.GetTaggedValue());
1307         callInfo->SetCallArg(0, JSTaggedValue(i));
1308         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1309         ContainersBitVector::FlipBitByIndex(callInfo);
1310         TestHelper::TearDownFrame(thread, prev);
1311     }
1312     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
1313         if (i >= 32) {
1314             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1315             callInfo->SetFunction(JSTaggedValue::Undefined());
1316             callInfo->SetThis(bitVector.GetTaggedValue());
1317             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1318             JSTaggedValue result0 = ContainersBitVector::Pop(callInfo);
1319             TestHelper::TearDownFrame(thread, prev);
1320             EXPECT_EQ(result0, JSTaggedValue(1));
1321         } else {
1322             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1323             callInfo->SetFunction(JSTaggedValue::Undefined());
1324             callInfo->SetThis(bitVector.GetTaggedValue());
1325             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1326             JSTaggedValue result1 = ContainersBitVector::Pop(callInfo);
1327             TestHelper::TearDownFrame(thread, prev);
1328             EXPECT_EQ(result1, JSTaggedValue(0));
1329         }
1330     }
1331 }
1332 /**
1333    * @tc.number: _BitVector_flipBitsByRange_Func_001
1334    * @tc.name: test_flipBitsByRange
1335    * @tc.desc: Flips a range of bit values in a bit vector.(Flip 0 to 1, flip 1 to 0).
1336    * @tc.size: MediumTest
1337    * @tc.type: Function
1338    * @tc.level: Level 0
1339    */
HWTEST_F_L0(ContainersBitVectorTest,FlipBitsByRange_001)1340 HWTEST_F_L0(ContainersBitVectorTest, FlipBitsByRange_001)
1341 {
1342     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1343     {
1344         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1345         callInfo->SetFunction(JSTaggedValue::Undefined());
1346         callInfo->SetThis(bitVector.GetTaggedValue());
1347         callInfo->SetCallArg(0, JSTaggedValue(1));
1348         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1349         JSTaggedValue result = ContainersBitVector::Push(callInfo);
1350         TestHelper::TearDownFrame(thread, prev);
1351         EXPECT_EQ(result, JSTaggedValue::True());
1352         EXPECT_EQ(bitVector->GetLength(), 1);
1353     }
1354     {
1355         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1356         callInfo->SetFunction(JSTaggedValue::Undefined());
1357         callInfo->SetThis(bitVector.GetTaggedValue());
1358         callInfo->SetCallArg(0, JSTaggedValue(0));
1359         callInfo->SetCallArg(1, JSTaggedValue(1));
1360         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1361         ContainersBitVector::FlipBitsByRange(callInfo);
1362         TestHelper::TearDownFrame(thread, prev);
1363     }
1364     {
1365         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1366         callInfo->SetFunction(JSTaggedValue::Undefined());
1367         callInfo->SetThis(bitVector.GetTaggedValue());
1368         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1369         JSTaggedValue result = ContainersBitVector::Pop(callInfo);
1370         TestHelper::TearDownFrame(thread, prev);
1371         EXPECT_EQ(result, JSTaggedValue(0));
1372     }
1373 }
1374 /**
1375    * @tc.number: _BitVector_flipBitsByRange_Func_002
1376    * @tc.name: test_flipBitsByRange
1377    * @tc.desc: Flips a range of bit values in a bit vector.(Flip 0 to 1, flip 1 to 0).
1378    * @tc.size: MediumTest
1379    * @tc.type: Function
1380    * @tc.level: Level 2
1381    */
HWTEST_F_L0(ContainersBitVectorTest,FlipBitsByRange_002)1382 HWTEST_F_L0(ContainersBitVectorTest, FlipBitsByRange_002)
1383 {
1384     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1385     {
1386         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1387         callInfo->SetFunction(JSTaggedValue::Undefined());
1388         callInfo->SetThis(bitVector.GetTaggedValue());
1389         callInfo->SetCallArg(0, JSTaggedValue(1));
1390         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1391         JSTaggedValue result = ContainersBitVector::Push(callInfo);
1392         TestHelper::TearDownFrame(thread, prev);
1393         EXPECT_EQ(result, JSTaggedValue::True());
1394         EXPECT_EQ(bitVector->GetLength(), 1);
1395     }
1396     {
1397         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1398         callInfo->SetFunction(JSTaggedValue::Undefined());
1399         callInfo->SetThis(bitVector.GetTaggedValue());
1400         callInfo->SetCallArg(0, JSTaggedValue(1.1));
1401         callInfo->SetCallArg(1, JSTaggedValue(1));
1402         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1403         JSTaggedValue result = ContainersBitVector::FlipBitsByRange(callInfo);
1404         TestHelper::TearDownFrame(thread, prev);
1405         EXPECT_TRUE(thread->HasPendingException());
1406         EXPECT_EQ(result, JSTaggedValue::Exception());
1407         thread->ClearException();
1408     }
1409 }
1410 /**
1411    * @tc.number: _BitVector_flipBitsByRange_Func_003
1412    * @tc.name: test_flipBitsByRange
1413    * @tc.desc: Flips a range of bit values in a bit vector.(Flip 0 to 1, flip 1 to 0).
1414    * @tc.size: MediumTest
1415    * @tc.type: Function
1416    * @tc.level: Level 1
1417    */
HWTEST_F_L0(ContainersBitVectorTest,FlipBitsByRange_003)1418 HWTEST_F_L0(ContainersBitVectorTest, FlipBitsByRange_003)
1419 {
1420     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1421     Push(bitVector);
1422     {
1423         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1424         callInfo->SetFunction(JSTaggedValue::Undefined());
1425         callInfo->SetThis(bitVector.GetTaggedValue());
1426         callInfo->SetCallArg(0, JSTaggedValue(0));
1427         callInfo->SetCallArg(1, JSTaggedValue(32));
1428         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1429         ContainersBitVector::FlipBitsByRange(callInfo);
1430         TestHelper::TearDownFrame(thread, prev);
1431     }
1432     {
1433         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 10);
1434         callInfo->SetFunction(JSTaggedValue::Undefined());
1435         callInfo->SetThis(bitVector.GetTaggedValue());
1436         callInfo->SetCallArg(0, JSTaggedValue(32));
1437         callInfo->SetCallArg(1, JSTaggedValue(64));
1438         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1439         ContainersBitVector::FlipBitsByRange(callInfo);
1440         TestHelper::TearDownFrame(thread, prev);
1441     }
1442     constexpr uint32_t NODE_NUMBERS = 64;
1443     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
1444         if (i >= 32) {
1445             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1446             callInfo->SetFunction(JSTaggedValue::Undefined());
1447             callInfo->SetThis(bitVector.GetTaggedValue());
1448             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1449             JSTaggedValue result0 = ContainersBitVector::Pop(callInfo);
1450             TestHelper::TearDownFrame(thread, prev);
1451             EXPECT_EQ(result0, JSTaggedValue(1));
1452         } else {
1453             auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1454             callInfo->SetFunction(JSTaggedValue::Undefined());
1455             callInfo->SetThis(bitVector.GetTaggedValue());
1456             [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1457             JSTaggedValue result1 = ContainersBitVector::Pop(callInfo);
1458             TestHelper::TearDownFrame(thread, prev);
1459             EXPECT_EQ(result1, JSTaggedValue(0));
1460         }
1461     }
1462 }
1463 /**
1464    * @tc.number: _BitVector_GetIteratorObj_Func_001
1465    * @tc.name: test_GetIteratorObj
1466    * @tc.desc: Returns an iterator.Each item of the iterator is a Javascript Object.
1467    * @tc.size: MediumTest
1468    * @tc.type: Function
1469    * @tc.level: Level 0
1470    */
HWTEST_F_L0(ContainersBitVectorTest,GetIteratorObj)1471 HWTEST_F_L0(ContainersBitVectorTest, GetIteratorObj)
1472 {
1473     constexpr uint32_t NODE_NUMBERS = 8;
1474     JSHandle<JSAPIBitVector> bitVector = CreateJSAPIBitVector();
1475     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
1476         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
1477         callInfo->SetFunction(JSTaggedValue::Undefined());
1478         callInfo->SetThis(bitVector.GetTaggedValue());
1479         callInfo->SetCallArg(0, JSTaggedValue(1));
1480         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1481         JSTaggedValue result = ContainersBitVector::Push(callInfo);
1482         TestHelper::TearDownFrame(thread, prev);
1483         EXPECT_EQ(result, JSTaggedValue::True());
1484         EXPECT_EQ(bitVector->GetSize(), static_cast<int>(i + 1));
1485     }
1486     auto callInfo1 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
1487     callInfo1->SetFunction(JSTaggedValue::Undefined());
1488     callInfo1->SetThis(bitVector.GetTaggedValue());
1489     [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, callInfo1);
1490     JSHandle<JSTaggedValue> iterValues(thread, ContainersBitVector::GetIteratorObj(callInfo1));
1491     TestHelper::TearDownFrame(thread, prev1);
1492     JSMutableHandle<JSTaggedValue> result(thread, JSTaggedValue::Undefined());
1493     for (uint32_t i = 0; i < NODE_NUMBERS; i++) {
1494         auto callInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 4);
1495         callInfo->SetFunction(JSTaggedValue::Undefined());
1496         callInfo->SetThis(iterValues.GetTaggedValue());
1497         [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, callInfo);
1498         result.Update(JSAPIBitVectorIterator::Next(callInfo));
1499         TestHelper::TearDownFrame(thread, prev);
1500         EXPECT_EQ(static_cast<int>(1), JSIterator::IteratorValue(thread, result)->GetInt());
1501     }
1502 }
1503 };