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