1 /*
2  * Copyright (c) 2021 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 #include "sorted_vector.h"
16 
17 #include <gtest/gtest.h>
18 #include <iostream>
19 using namespace testing::ext;
20 using namespace std;
21 
22 namespace OHOS {
23 namespace {
24 class UtilsSortedVector : public testing::Test {
25 };
26 
27 HWTEST_F(UtilsSortedVector, testDefaultConsAndAddAndSort, TestSize.Level0)
28 {
29     SortedVector<int> svec;
30     std::vector<int> vec;
31 
32     for (int i = 0; i < 10; i++) {
33         vec.push_back(i);
34     }
35 
36     for (int i = 9; i >= 0; i--) {
37         svec.Add(i);
38     }
39 
40     auto it = svec.Begin();
41     auto it2 = vec.begin();
42 
43     for (; (it != svec.End()) and (it2 != vec.end()); it2++, it++) {
44         ASSERT_EQ(*it, *it2);
45     }
46 }
47 
48 HWTEST_F(UtilsSortedVector, testConsFromSortedAllowDup, TestSize.Level0)
49 {
50     SortedVector<int> svec;
51     std::vector<int> vec;
52 
53     for (int i = 0; i < 10; i++) {
54         vec.push_back(i);
55     }
56 
57     for (int i = 9; i >= 0; i--) {
58         svec.Add(i);
59     }
60 
61     SortedVector<int> newSvec(svec);
62 
63     auto it = newSvec.Begin();
64     auto it2 = vec.begin();
65 
66     for (; (it != newSvec.End()) and (it2 != vec.end()); it2++, it++) {
67         ASSERT_EQ(*it, *it2);
68     }
69 }
70 
71 HWTEST_F(UtilsSortedVector, testConsFromSortedNotAllowDuplicate, TestSize.Level0)
72 {
73     SortedVector<int> svec;
74     std::vector<int> vec;
75 
76     for (int i = 0; i < 20; i++) {
77         vec.push_back(i);
78     }
79 
80     for (int i = 9; i >= 0; i--) {
81         svec.Add(i);
82     }
83 
84     for (int i = 0; i < 20; i++) {
85         svec.Add(i);
86     }
87 
88     ASSERT_EQ(static_cast<size_t>(30), svec.Size());
89 
90     SortedVector<int, false> newSvec(svec);
91 
92     ASSERT_EQ(static_cast<size_t>(20), newSvec.Size());
93 
94     for (int i = 0; i < 20; i++) {
95         ASSERT_EQ(vec[i], newSvec[i]);
96     }
97 }
98 
99 HWTEST_F(UtilsSortedVector, testConsFromSortedNotAllowToAlloworNotAllow, TestSize.Level0)
100 {
101     SortedVector<int, false> svec;
102     std::vector<int> vec;
103 
104     for (int i = 0; i < 20; i++) {
105         vec.push_back(i);
106     }
107 
108     for (int i = 9; i >= 0; i--) {
109         svec.Add(i);
110     }
111 
112     for (int i = 0; i < 20; i++) {
113         svec.Add(i);
114     }
115 
116     ASSERT_EQ(static_cast<size_t>(20), svec.Size());
117 
118     SortedVector<int> newSvecTrue(svec);
119 
120     ASSERT_EQ(static_cast<size_t>(20), newSvecTrue.Size());
121 
122     for (int i = 0; i < 20; i++) {
123         ASSERT_EQ(vec[i], newSvecTrue[i]);
124     }
125 
126     SortedVector<int> newSvecFalse(svec);
127     ASSERT_EQ(static_cast<size_t>(20), newSvecFalse.Size());
128 
129     for (int i = 0; i < 20; i++) {
130         ASSERT_EQ(vec[i], newSvecFalse[i]);
131     }
132 }
133 
134 HWTEST_F(UtilsSortedVector, testoperatoreq, TestSize.Level0)
135 {
136     SortedVector<int> svec;
137     std::vector<int> vec;
138 
139     for (int i = 0; i < 10; i++) {
140         vec.push_back(i);
141     }
142 
143     for (int i = 9; i >= 0; i--) {
144         svec.Add(i);
145     }
146 
147     SortedVector<int> newSvec = svec;
148 
149     auto it = newSvec.Begin();
150     auto it2 = svec.Begin();
151 
152     for (; (it != newSvec.End()) and (it2 != svec.End()); it2++, it++) {
153         ASSERT_EQ(*it, *it2);
154     }
155 }
156 
157 HWTEST_F(UtilsSortedVector, testOperatorEqAllowToNotAllow, TestSize.Level0)
158 {
159     SortedVector<int> svec;
160     std::vector<int> vec;
161 
162     for (int i = 0; i < 20; i++) {
163         vec.push_back(i);
164     }
165 
166     for (int i = 9; i >= 0; i--) {
167         svec.Add(i);
168     }
169 
170     for (int i = 0; i < 20; i++) {
171         svec.Add(i);
172     }
173 
174     ASSERT_EQ(static_cast<size_t>(30), svec.Size());
175     SortedVector<int, false> newSvec = svec;
176 
177     ASSERT_EQ(static_cast<size_t>(20), newSvec.Size());
178 
179     for (int i = 0; i < 20; i++) {
180         ASSERT_EQ(vec[i], newSvec[i]);
181     }
182 }
183 
184 HWTEST_F(UtilsSortedVector, testOperatorEqNotAllowToAllowOrNotAllow, TestSize.Level0)
185 {
186     SortedVector<int, false> svec;
187     std::vector<int> vec;
188 
189     for (int i = 0; i < 20; i++) {
190         vec.push_back(i);
191     }
192 
193     for (int i = 9; i >= 0; i--) {
194         svec.Add(i);
195     }
196 
197     for (int i = 0; i < 20; i++) {
198         svec.Add(i);
199     }
200 
201     ASSERT_EQ(static_cast<size_t>(20), svec.Size());
202     SortedVector<int, false> newSvecFalse = svec;
203     SortedVector<int, true> newSvecTrue = svec;
204     ASSERT_EQ(static_cast<size_t>(20), newSvecFalse.Size());
205     ASSERT_EQ(static_cast<size_t>(20), newSvecTrue.Size());
206     for (int i = 0; i < 20; i++) {
207         ASSERT_EQ(vec[i], newSvecFalse[i]);
208         ASSERT_EQ(vec[i], newSvecTrue[i]);
209     }
210 }
211 
212 HWTEST_F(UtilsSortedVector, testOperatorEqAssignmentTwice, TestSize.Level0)
213 {
214     SortedVector<int, true> svec;
215 
216     std::vector<int> vec;
217     for (int i = 20; i < 30; i++) {
218         vec.push_back(i);
219     }
220 
221     for (int i = 0; i < 20; i++) {
222         svec.Add(i);
223     }
224 
225     SortedVector<int, false> newSvecFalse;
226 
227     for (int i = 20; i < 30; i++) {
228         newSvecFalse.Add(i);
229     }
230 
231     svec = newSvecFalse;
232 
233     ASSERT_EQ(static_cast<size_t>(10), svec.Size());
234     for (int i = 0; i < 10; i++) {
235         ASSERT_EQ(vec[i], svec[i]);
236     }
237 }
238 
239 HWTEST_F(UtilsSortedVector, testoperatorconsteq, TestSize.Level0)
240 {
241     SortedVector<int> svec;
242     std::vector<int> vec;
243 
244     for (int i = 0; i < 10; i++) {
245         vec.push_back(i);
246     }
247 
248     for (int i = 9; i >= 0; i--) {
249         svec.Add(i);
250     }
251 
252     const SortedVector<int> newSvec = svec;
253 
254     auto it = newSvec.Begin();
255     auto it2 = svec.Begin();
256 
257     for (; (it != newSvec.End()) and (it2 != svec.End()); it2++, it++) {
258         ASSERT_EQ(*it, *it2);
259     }
260 }
261 
262 HWTEST_F(UtilsSortedVector, testsizeclearIsEmpty, TestSize.Level0)
263 {
264     SortedVector<int> svec;
265 
266     ASSERT_TRUE(svec.IsEmpty());
267     ASSERT_EQ(svec.Size(), static_cast<size_t>(0));
268 
269     for (int i = 9; i >= 0; i--) {
270         svec.Add(i);
271     }
272 
273     ASSERT_EQ(svec.Size(), static_cast<const unsigned long>(10));
274 
275     ASSERT_FALSE(svec.IsEmpty());
276 
277     svec.Clear();
278 
279     ASSERT_TRUE(svec.IsEmpty());
280     ASSERT_EQ(svec.Size(), static_cast<size_t>(0));
281 }
282 
283 HWTEST_F(UtilsSortedVector, testCapasityandSetcapasity, TestSize.Level0)
284 {
285     SortedVector<int> svec;
286 
287     for (int i = 9; i >= 0; i--) {
288         svec.Add(i);
289     }
290 
291     svec.SetCapcity(1000);
292 
293     ASSERT_EQ(svec.Capacity(), static_cast<size_t>(1000));
294 
295     ASSERT_LT(svec.SetCapcity(500), static_cast<ssize_t>(0));
296     ASSERT_EQ(svec.Capacity(), static_cast<size_t>(1000));
297 }
298 
299 HWTEST_F(UtilsSortedVector, testconstArray, TestSize.Level0)
300 {
301     SortedVector<int> svec;
302 
303     for (int i = 9; i >= 0; i--) {
304         svec.Add(i);
305     }
306 
307     const int* pi = svec.Array();
308     int arraySize = svec.Size();
309 
310     auto it = svec.Begin();
311     int i = 0;
312     for (; (i < arraySize) && (it != svec.End()); ++it, ++i) {
313         ASSERT_EQ(pi[i], *it);
314     }
315 
316     ASSERT_EQ(i, arraySize);
317     ASSERT_EQ(it, svec.End());
318 }
319 
320 HWTEST_F(UtilsSortedVector, testeditArray, TestSize.Level0)
321 {
322     SortedVector<int> svec;
323 
324     for (int i = 9; i >= 0; i--) {
325         svec.Add(i);
326     }
327 
328     int* pi = svec.EditArray();
329     int arraySize = svec.Size();
330 
331     // compare and equal
332     auto it = svec.Begin();
333     int i = 0;
334     for (; (i < arraySize) && (it != svec.End()); ++it, ++i) {
335         ASSERT_EQ(pi[i], *it);
336     }
337 
338     SortedVector<int> copyvec;
339 
340     //  size equal
341     ASSERT_EQ(i, arraySize);
342     ASSERT_EQ(it, svec.End());
343 
344     //  fix value
345 
346     for (int t = 0; t < arraySize; ++t) {
347         pi[t] += 1;
348     }
349 
350     // compare  and equal add 1
351 
352     it = copyvec.Begin();
353     i = 0;
354     for (; (i < arraySize) && (it != copyvec.End()); ++it, ++i) {
355         ASSERT_EQ(pi[i], *it + 1);
356     }
357 
358     // all renewed
359     it = svec.Begin();
360     i = 0;
361     for (; (i < arraySize) && (it != svec.End()); ++it, ++i) {
362         ASSERT_EQ(pi[i], *it);
363     }
364 }
365 
366 HWTEST_F(UtilsSortedVector, testIndexOf, TestSize.Level0)
367 {
368     SortedVector<int> svec;
369 
370     for (int i = 9; i >= 0; i--) {
371         svec.Add(i);
372     }
373 
374     int arraySize = svec.Size();
375 
376     auto it = svec.Begin();
377     int i = 0;
378     for (; (i < arraySize) && (it != svec.End()); ++it, ++i) {
379         ASSERT_EQ(i, svec.IndexOf(i));
380     }
381 
382     ASSERT_EQ(-1, svec.IndexOf(10));
383 }
384 
385 HWTEST_F(UtilsSortedVector, testOrderof, TestSize.Level0)
386 {
387     SortedVector<int> svec;
388 
389     for (int i = 9; i >= 0; i--) {
390         svec.Add(i);
391     }
392 
393     size_t count = svec.Size();
394     size_t order = 0;
395     for (size_t i = 0; i < count; i++) {
396         order = svec.OrderOf(i);
397         ASSERT_EQ(i + 1, order);
398     }
399 
400     ASSERT_EQ(static_cast<size_t>(0), svec.OrderOf(-2));
401     ASSERT_EQ(static_cast<size_t>(0), svec.OrderOf(-1));
402     ASSERT_EQ(static_cast<size_t>(10), svec.OrderOf(9));
403     ASSERT_EQ(static_cast<size_t>(10), svec.OrderOf(10));
404 }
405 
406 HWTEST_F(UtilsSortedVector, testoperatorAccess, TestSize.Level0)
407 {
408     SortedVector<int> svec;
409 
410     for (int i = 9; i >= 0; i--) {
411         svec.Add(i);
412     }
413 
414     for (int i = 0; i <= 9; i++) {
415         ASSERT_EQ(i, svec[i]);
416     }
417 }
418 
419 HWTEST_F(UtilsSortedVector, testBack, TestSize.Level0)
420 {
421     SortedVector<int> svec;
422 
423     for (int i = 9; i >= 0; i--) {
424         svec.Add(i);
425     }
426 
427     ASSERT_EQ(9, svec.Back());
428 }
429 
430 HWTEST_F(UtilsSortedVector, testMirrorItemAt, TestSize.Level0)
431 {
432     SortedVector<int> svec;
433 
434     for (int i = 9; i >= 0; i--) {
435         svec.Add(i);
436     }
437 
438     for (ssize_t i = -1; i >= -10; i--) {
439         ASSERT_EQ(i + 10, svec.MirrorItemAt(i));
440     }
441 
442     for (ssize_t i = 0; i <= 9; i++) {
443         ASSERT_EQ(i, svec.MirrorItemAt(i));
444     }
445 }
446 
447 HWTEST_F(UtilsSortedVector, testEditItemAt, TestSize.Level0)
448 {
449     SortedVector<int> svec;
450 
451     for (int i = 9; i >= 0; i--) {
452         svec.Add(i);
453     }
454 
455     for (ssize_t i = 0; i <= 9; i++) {
456         svec.EditItemAt(i) += 1;
457         ASSERT_EQ(i + 1, svec.EditItemAt(i));
458     }
459 }
460 
461 HWTEST_F(UtilsSortedVector, testCopyCtorFromVector, TestSize.Level0)
462 {
463     std::vector<int> vec;
464 
465     for (int i = 9; i >= 0; i--) {
466         vec.push_back(i);
467     }
468 
469     SortedVector<int> svec(vec);
470 
471     for (ssize_t i = 0; i <= 9; i++) {
472         ASSERT_EQ(i, svec[i]);
473     }
474 }
475 
476 HWTEST_F(UtilsSortedVector, testConsFromVectorToNotAllowDuplicate, TestSize.Level0)
477 {
478     std::vector<int> vec;
479 
480     for (int i = 9; i >= 0; i--) {
481         vec.push_back(i);
482     }
483 
484     for (int i = 19; i >= 0; i--) {
485         vec.push_back(i);
486     }
487 
488     ASSERT_EQ(static_cast<size_t>(30), vec.size());
489     SortedVector<int, false> svec(vec);
490 
491     ASSERT_EQ(static_cast<size_t>(20), svec.Size());
492 
493     for (ssize_t i = 0; i <= 19; i++) {
494         ASSERT_EQ(i, svec[i]);
495     }
496 }
497 
498 HWTEST_F(UtilsSortedVector, testMergevector, TestSize.Level0)
499 {
500     SortedVector<int> svec;
501 
502     for (int i = 9; i >= 0; i--) {
503         svec.Add(i);
504     }
505 
506     std::vector<int> vec;
507     for (int i = 10; i < 20; i++) {
508         vec.push_back(i);
509     }
510 
511     svec.Merge(vec);
512 
513     for (ssize_t i = 0; i < 20; i++) {
514         ASSERT_EQ(i, svec[i]);
515     }
516 }
517 
518 HWTEST_F(UtilsSortedVector, testMergevectorNoduplicate, TestSize.Level0)
519 {
520 
521     SortedVector<int, false> svec;
522 
523     for (int i = 9; i >= 0; i--) {
524         svec.Add(i);
525     }
526 
527     std::vector<int> vec;
528     for (int i = 0; i < 20; i++) {
529         vec.push_back(i);
530     }
531 
532     for (int i = 10; i < 30; i++) {
533         vec.push_back(i);
534     }
535 
536     svec.Merge(vec);
537     ASSERT_EQ(svec.Size(), static_cast<size_t>(30));
538 
539     for (ssize_t i = 0; i < 30; i++) {
540         ASSERT_EQ(i, svec[i]);
541     }
542 }
543 
544 HWTEST_F(UtilsSortedVector, testMergesortedvectorNoduplicate, TestSize.Level0)
545 {
546     SortedVector<int, false> svec;
547     SortedVector<int, false> svec2;
548     for (int i = 9; i >= 0; i--) {
549         svec.Add(i);
550         svec2.Add(i);
551     }
552 
553     svec.Merge(svec2);
554     ASSERT_EQ(static_cast<size_t>(10), svec.Size());
555     // 0,1,2,3,4,5,6,7,8,9
556     for (ssize_t i = 0; i < 10; i++) {
557         ASSERT_EQ(i, svec[i]);
558     }
559 }
560 
561 HWTEST_F(UtilsSortedVector, testMergesortedvector, TestSize.Level0)
562 {
563     SortedVector<int> svec;
564     SortedVector<int> svec2;
565     for (int i = 9; i >= 0; i--) {
566         svec.Add(i);
567         svec2.Add(i);
568     }
569 
570     svec.Merge(svec2);
571 
572     // 0,0,1,1,2,2,3,3...
573     for (ssize_t i = 0; i < 20; i++) {
574         ASSERT_EQ(i / 2, svec[i]);
575     }
576 }
577 
578 HWTEST_F(UtilsSortedVector, testAddNotAllowDuplicate, TestSize.Level0)
579 {
580     SortedVector<int, false> svec;
581 
582     for (int i = 9; i >= 0; i--) {
583 
584         ASSERT_NE(svec.Add(i), static_cast<ssize_t>(-1));
585     }
586     ASSERT_EQ(static_cast<size_t>(10), svec.Size());
587 
588     // duplicate
589     for (int i = 9; i >= 0; i--) {
590         ASSERT_EQ(svec.Add(i), static_cast<ssize_t>(-1));
591         ASSERT_EQ(static_cast<size_t>(10), svec.Size());
592     }
593 
594     for (ssize_t i = 0; i < 10; i++) {
595         ASSERT_EQ(i, svec[i]);
596     }
597 }
598 }  // namespace
599 }  // namespace OHOS