1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "gtest/gtest.h" 18 19 #include "chre/util/dynamic_vector.h" 20 #include "chre/util/macros.h" 21 22 #include <stdint.h> 23 24 using chre::DynamicVector; 25 26 namespace { 27 constexpr int kMaxTestCapacity = 10; 28 int gDestructorCount[kMaxTestCapacity]; 29 30 class Dummy { 31 public: 32 ~Dummy() { 33 if (mValue >= 0) { 34 gDestructorCount[mValue]++; 35 } 36 }; 37 void setValue(int value) { 38 mValue = value; 39 } 40 int getValue() { 41 return mValue; 42 } 43 44 private: 45 int mValue = -1; 46 }; 47 48 void resetDestructorCounts() { 49 for (size_t i = 0; i < ARRAY_SIZE(gDestructorCount); i++) { 50 gDestructorCount[i] = 0; 51 } 52 } 53 } 54 55 TEST(DynamicVector, EmptyByDefault) { 56 DynamicVector<int> vector; 57 EXPECT_EQ(vector.data(), nullptr); 58 EXPECT_TRUE(vector.empty()); 59 EXPECT_EQ(vector.size(), 0); 60 EXPECT_EQ(vector.capacity(), 0); 61 vector.clear(); 62 } 63 64 TEST(DynamicVector, PushBackAndRead) { 65 DynamicVector<int> vector; 66 ASSERT_TRUE(vector.push_back(0x1337)); 67 EXPECT_EQ(vector.size(), 1); 68 EXPECT_EQ(vector.capacity(), 1); 69 EXPECT_EQ(vector.data(), &vector[0]); 70 EXPECT_FALSE(vector.empty()); 71 EXPECT_EQ(vector[0], 0x1337); 72 } 73 74 TEST(DynamicVector, PushBackReserveAndReadTrivialType) { 75 DynamicVector<int> vector; 76 ASSERT_TRUE(vector.emplace_back(0x1337)); 77 ASSERT_TRUE(vector.push_back(0xface)); 78 int x = 0xcafe; 79 ASSERT_TRUE(vector.push_back(std::move(x))); 80 ASSERT_TRUE(vector.insert(vector.size(), 0xd00d)); 81 EXPECT_EQ(vector.size(), 4); 82 EXPECT_EQ(vector.capacity(), 4); 83 EXPECT_EQ(vector[0], 0x1337); 84 EXPECT_EQ(vector[1], 0xface); 85 EXPECT_EQ(vector[2], 0xcafe); 86 EXPECT_EQ(vector[3], 0xd00d); 87 88 ASSERT_TRUE(vector.reserve(8)); 89 EXPECT_EQ(vector.size(), 4); 90 EXPECT_EQ(vector.capacity(), 8); 91 EXPECT_EQ(vector[0], 0x1337); 92 EXPECT_EQ(vector[1], 0xface); 93 EXPECT_EQ(vector[2], 0xcafe); 94 EXPECT_EQ(vector[3], 0xd00d); 95 } 96 97 TEST(DynamicVector, CompareEqual) { 98 DynamicVector<int> lhs; 99 ASSERT_TRUE(lhs.push_back(0x1337)); 100 ASSERT_TRUE(lhs.push_back(0xface)); 101 DynamicVector<int> rhs; 102 ASSERT_TRUE(rhs.push_back(0x1337)); 103 ASSERT_TRUE(rhs.push_back(0xface)); 104 105 ASSERT_EQ(lhs, rhs); // equal vectors 106 107 ASSERT_TRUE(lhs.push_back(0xb00c)); 108 ASSERT_FALSE(lhs == rhs); // different size 109 110 ASSERT_TRUE(rhs.push_back(0xc00b)); 111 ASSERT_FALSE(lhs == rhs); // equal size different elements 112 } 113 114 constexpr int kConstructedMagic = 0xdeadbeef; 115 116 class MovableButNonCopyable : public chre::NonCopyable { 117 public: 118 MovableButNonCopyable(int value) : mValue(value) {} 119 120 MovableButNonCopyable(MovableButNonCopyable&& other) { 121 mValue = other.mValue; 122 other.mValue = -1; 123 } 124 125 MovableButNonCopyable& operator=(MovableButNonCopyable&& other) { 126 assert(mMagic == kConstructedMagic); 127 mValue = other.mValue; 128 other.mValue = -1; 129 return *this; 130 } 131 132 int getValue() const { 133 return mValue; 134 } 135 136 private: 137 int mMagic = kConstructedMagic; 138 int mValue; 139 }; 140 141 TEST(DynamicVector, PushBackReserveAndReadMovableButNonCopyable) { 142 DynamicVector<MovableButNonCopyable> vector; 143 ASSERT_TRUE(vector.emplace_back(0x1337)); 144 ASSERT_TRUE(vector.emplace_back(0xface)); 145 MovableButNonCopyable mbnc(0xcafe); 146 ASSERT_TRUE(vector.push_back(std::move(mbnc))); 147 EXPECT_EQ(mbnc.getValue(), -1); 148 MovableButNonCopyable mbnc2(0xd00d); 149 ASSERT_TRUE(vector.insert(vector.size(), std::move(mbnc2))); 150 EXPECT_EQ(mbnc2.getValue(), -1); 151 152 ASSERT_TRUE(vector.reserve(8)); 153 EXPECT_EQ(vector[0].getValue(), 0x1337); 154 EXPECT_EQ(vector[1].getValue(), 0xface); 155 EXPECT_EQ(vector[2].getValue(), 0xcafe); 156 EXPECT_EQ(vector[3].getValue(), 0xd00d); 157 EXPECT_EQ(vector.size(), 4); 158 EXPECT_EQ(vector.capacity(), 8); 159 } 160 161 class CopyableButNonMovable { 162 public: 163 CopyableButNonMovable(int value) : mValue(value) {} 164 165 CopyableButNonMovable(const CopyableButNonMovable& other) { 166 mValue = other.mValue; 167 } 168 169 CopyableButNonMovable& operator=(const CopyableButNonMovable& other) { 170 assert(mMagic == kConstructedMagic); 171 mValue = other.mValue; 172 return *this; 173 } 174 175 CopyableButNonMovable(CopyableButNonMovable&& other) = delete; 176 CopyableButNonMovable& operator=(CopyableButNonMovable&& other) = delete; 177 178 int getValue() const { 179 return mValue; 180 } 181 182 private: 183 int mMagic = kConstructedMagic; 184 int mValue; 185 }; 186 187 TEST(DynamicVector, PushBackReserveAndReadCopyableButNonMovable) { 188 DynamicVector<CopyableButNonMovable> vector; 189 ASSERT_TRUE(vector.emplace_back(0x1337)); 190 ASSERT_TRUE(vector.emplace_back(0xface)); 191 CopyableButNonMovable cbnm(0xcafe); 192 ASSERT_TRUE(vector.push_back(cbnm)); 193 CopyableButNonMovable cbnm2(0xd00d); 194 ASSERT_TRUE(vector.insert(vector.size(), cbnm2)); 195 196 ASSERT_TRUE(vector.reserve(8)); 197 EXPECT_EQ(vector[0].getValue(), 0x1337); 198 EXPECT_EQ(vector[1].getValue(), 0xface); 199 EXPECT_EQ(vector[2].getValue(), 0xcafe); 200 EXPECT_EQ(vector[3].getValue(), 0xd00d); 201 EXPECT_EQ(vector.size(), 4); 202 EXPECT_EQ(vector.capacity(), 8); 203 } 204 205 class MovableAndCopyable { 206 public: 207 MovableAndCopyable(int value) : mValue(value) {} 208 209 MovableAndCopyable(const MovableAndCopyable& other) { 210 mValue = other.mValue; 211 } 212 213 MovableAndCopyable(MovableAndCopyable&& other) { 214 // The move constructor multiplies the value by 2 so that we can see that it 215 // was used 216 mValue = other.mValue * 2; 217 } 218 219 MovableAndCopyable& operator=(const MovableAndCopyable& other) { 220 assert(mMagic == kConstructedMagic); 221 mValue = other.mValue; 222 return *this; 223 } 224 225 MovableAndCopyable& operator=(MovableAndCopyable&& other) { 226 assert(mMagic == kConstructedMagic); 227 mValue = other.mValue * 2; 228 other.mValue = -1; 229 return *this; 230 } 231 232 int getValue() const { 233 return mValue; 234 } 235 236 private: 237 int mMagic = kConstructedMagic; 238 int mValue; 239 }; 240 241 TEST(DynamicVector, ReservePrefersMove) { 242 // Ensure that preference is given to std::move in reserve() 243 DynamicVector<MovableAndCopyable> vector; 244 245 // Reserve enough space for the first two elements. 246 ASSERT_TRUE(vector.reserve(2)); 247 ASSERT_TRUE(vector.emplace_back(1000)); 248 ASSERT_TRUE(vector.emplace_back(2000)); 249 250 // Reserve more than enough space causing a move to be required. 251 ASSERT_TRUE(vector.reserve(4)); 252 253 // Move on this type results in a multiplication by 2. Verify that all 254 // elements have been multiplied by 2. 255 EXPECT_EQ(vector[0].getValue(), 2000); 256 EXPECT_EQ(vector[1].getValue(), 4000); 257 } 258 259 /** 260 * A simple test helper object to count number of construction and destructions. 261 */ 262 class Foo { 263 public: 264 /** 265 * Construct an object storing a simple integer. Increment the number of 266 * objects that have been constructed of this type. 267 */ 268 Foo(int value) : value(value) { 269 sConstructedCounter++; 270 } 271 272 Foo(const Foo& other) { 273 value = other.value; 274 sConstructedCounter++; 275 } 276 277 Foo(Foo&& other) = delete; 278 279 /** 280 * Tear down the object, decrementing the number of objects that have been 281 * constructed of this type. 282 */ 283 ~Foo() { 284 sConstructedCounter--; 285 } 286 287 //! The number of objects of this type that have been constructed. 288 static ssize_t sConstructedCounter; 289 290 //! The value stored in the object to verify the contents of this object after 291 //! construction. 292 int value; 293 }; 294 295 //! Storage for the Foo reference counter. 296 ssize_t Foo::sConstructedCounter = 0; 297 298 TEST(DynamicVector, EmplaceBackAndDestruct) { 299 Foo::sConstructedCounter = 0; 300 { 301 DynamicVector<Foo> vector; 302 ASSERT_TRUE(vector.emplace_back(1000)); 303 ASSERT_TRUE(vector.emplace_back(2000)); 304 ASSERT_TRUE(vector.emplace_back(3000)); 305 ASSERT_TRUE(vector.emplace_back(4000)); 306 307 ASSERT_EQ(vector[0].value, 1000); 308 ASSERT_EQ(vector[1].value, 2000); 309 ASSERT_EQ(vector[2].value, 3000); 310 ASSERT_EQ(vector[3].value, 4000); 311 312 EXPECT_EQ(Foo::sConstructedCounter, 4); 313 } 314 315 EXPECT_EQ(Foo::sConstructedCounter, 0); 316 } 317 318 TEST(DynamicVector, InsertEmpty) { 319 DynamicVector<int> vector; 320 EXPECT_CHRE_ASSERT(EXPECT_FALSE(vector.insert(1, 0x1337))); 321 322 // Insert to empty vector 323 ASSERT_TRUE(vector.insert(0, 0x1337)); 324 EXPECT_EQ(vector[0], 0x1337); 325 326 // Insert at end triggering grow 327 ASSERT_EQ(vector.capacity(), 1); 328 EXPECT_TRUE(vector.insert(1, 0xface)); 329 EXPECT_EQ(vector[0], 0x1337); 330 EXPECT_EQ(vector[1], 0xface); 331 332 // Insert at beginning triggering grow 333 ASSERT_EQ(vector.capacity(), 2); 334 EXPECT_TRUE(vector.insert(0, 0xcafe)); 335 EXPECT_EQ(vector[0], 0xcafe); 336 EXPECT_EQ(vector[1], 0x1337); 337 EXPECT_EQ(vector[2], 0xface); 338 339 // Insert at middle with spare capacity 340 ASSERT_EQ(vector.capacity(), 4); 341 EXPECT_TRUE(vector.insert(1, 0xdead)); 342 EXPECT_EQ(vector[0], 0xcafe); 343 EXPECT_EQ(vector[1], 0xdead); 344 EXPECT_EQ(vector[2], 0x1337); 345 EXPECT_EQ(vector[3], 0xface); 346 347 // Insert at middle triggering grow 348 ASSERT_EQ(vector.capacity(), 4); 349 EXPECT_TRUE(vector.insert(2, 0xbeef)); 350 EXPECT_EQ(vector[0], 0xcafe); 351 EXPECT_EQ(vector[1], 0xdead); 352 EXPECT_EQ(vector[2], 0xbeef); 353 EXPECT_EQ(vector[3], 0x1337); 354 EXPECT_EQ(vector[4], 0xface); 355 356 // Insert at beginning with spare capacity 357 ASSERT_EQ(vector.capacity(), 8); 358 ASSERT_EQ(vector.size(), 5); 359 EXPECT_TRUE(vector.insert(0, 0xabad)); 360 EXPECT_EQ(vector[0], 0xabad); 361 EXPECT_EQ(vector[1], 0xcafe); 362 EXPECT_EQ(vector[2], 0xdead); 363 EXPECT_EQ(vector[3], 0xbeef); 364 EXPECT_EQ(vector[4], 0x1337); 365 EXPECT_EQ(vector[5], 0xface); 366 367 // Insert at end with spare capacity 368 ASSERT_EQ(vector.size(), 6); 369 EXPECT_TRUE(vector.insert(vector.size(), 0xc0de)); 370 EXPECT_EQ(vector[0], 0xabad); 371 EXPECT_EQ(vector[1], 0xcafe); 372 EXPECT_EQ(vector[2], 0xdead); 373 EXPECT_EQ(vector[3], 0xbeef); 374 EXPECT_EQ(vector[4], 0x1337); 375 EXPECT_EQ(vector[5], 0xface); 376 EXPECT_EQ(vector[6], 0xc0de); 377 } 378 379 TEST(DynamicVector, PushBackInsertInMiddleAndRead) { 380 DynamicVector<int> vector; 381 ASSERT_TRUE(vector.push_back(0x1337)); 382 ASSERT_TRUE(vector.push_back(0xface)); 383 ASSERT_TRUE(vector.push_back(0xcafe)); 384 ASSERT_TRUE(vector.insert(1, 0xbeef)); 385 386 ASSERT_EQ(vector[0], 0x1337); 387 ASSERT_EQ(vector[1], 0xbeef); 388 ASSERT_EQ(vector[2], 0xface); 389 ASSERT_EQ(vector[3], 0xcafe); 390 } 391 392 TEST(DynamicVector, PushBackAndErase) { 393 DynamicVector<int> vector; 394 ASSERT_TRUE(vector.push_back(0x1337)); 395 ASSERT_TRUE(vector.push_back(0xcafe)); 396 ASSERT_TRUE(vector.push_back(0xbeef)); 397 ASSERT_TRUE(vector.push_back(0xface)); 398 399 vector.erase(1); 400 401 ASSERT_EQ(vector[0], 0x1337); 402 ASSERT_EQ(vector[1], 0xbeef); 403 ASSERT_EQ(vector[2], 0xface); 404 ASSERT_EQ(vector.size(), 3); 405 } 406 407 TEST(DynamicVector, FindEmpty) { 408 DynamicVector<int> vector; 409 ASSERT_EQ(vector.find(0), 0); 410 } 411 412 TEST(DynamicVector, FindWithElements) { 413 DynamicVector<int> vector; 414 ASSERT_TRUE(vector.push_back(0x1337)); 415 ASSERT_TRUE(vector.push_back(0xcafe)); 416 ASSERT_TRUE(vector.push_back(0xbeef)); 417 418 ASSERT_EQ(vector.find(0x1337), 0); 419 ASSERT_EQ(vector.find(0xcafe), 1); 420 ASSERT_EQ(vector.find(0xbeef), 2); 421 ASSERT_EQ(vector.find(1000), 3); 422 } 423 424 TEST(DynamicVector, EraseDestructorCalled) { 425 resetDestructorCounts(); 426 427 DynamicVector<Dummy> vector; 428 vector.reserve(4); 429 for (size_t i = 0; i < 4; ++i) { 430 vector.emplace_back(); 431 vector[i].setValue(i); 432 } 433 434 // last item before erase is '3'. 435 vector.erase(1); 436 EXPECT_EQ(0, gDestructorCount[0]); 437 EXPECT_EQ(0, gDestructorCount[1]); 438 EXPECT_EQ(0, gDestructorCount[2]); 439 EXPECT_EQ(1, gDestructorCount[3]); 440 441 // last item before erase is still '3'. 442 vector.erase(2); 443 EXPECT_EQ(0, gDestructorCount[0]); 444 EXPECT_EQ(0, gDestructorCount[1]); 445 EXPECT_EQ(0, gDestructorCount[2]); 446 EXPECT_EQ(2, gDestructorCount[3]); 447 448 // last item before erase is now '2'. 449 vector.erase(0); 450 EXPECT_EQ(0, gDestructorCount[0]); 451 EXPECT_EQ(0, gDestructorCount[1]); 452 EXPECT_EQ(1, gDestructorCount[2]); 453 EXPECT_EQ(2, gDestructorCount[3]); 454 } 455 456 TEST(DynamicVector, Clear) { 457 resetDestructorCounts(); 458 459 DynamicVector<Dummy> vector; 460 vector.reserve(4); 461 for (size_t i = 0; i < 4; ++i) { 462 vector.emplace_back(); 463 vector[i].setValue(i); 464 } 465 466 vector.clear(); 467 EXPECT_EQ(vector.size(), 0); 468 EXPECT_EQ(vector.capacity(), 4); 469 470 for (size_t i = 0; i < 4; ++i) { 471 EXPECT_EQ(gDestructorCount[i], 1); 472 } 473 } 474 475 // Make sure that a vector wrapping an array doesn't call the destructor when 476 // the vector is destructed 477 TEST(DynamicVector, WrapDoesntCallDestructor) { 478 resetDestructorCounts(); 479 480 Dummy array[4]; 481 for (size_t i = 0; i < 4; ++i) { 482 array[i].setValue(i); 483 } 484 485 { 486 DynamicVector<Dummy> vector; 487 vector.wrap(array, ARRAY_SIZE(array)); 488 } 489 490 for (size_t i = 0; i < 4; ++i) { 491 EXPECT_EQ(gDestructorCount[i], 0); 492 } 493 } 494 495 // Make sure that a wrapped vector does call the destructor when it's expected 496 // as part of an API call 497 TEST(DynamicVector, WrapExplicitlyCallsDestructor) { 498 resetDestructorCounts(); 499 500 Dummy array[4]; 501 constexpr size_t kSize = ARRAY_SIZE(array); 502 static_assert(ARRAY_SIZE(array) <= ARRAY_SIZE(gDestructorCount), 503 "gDestructorCount array must fit test array"); 504 for (size_t i = 0; i < kSize; ++i) { 505 array[i].setValue(i); 506 } 507 DynamicVector<Dummy> vector; 508 vector.wrap(array, ARRAY_SIZE(array)); 509 510 vector.erase(kSize - 1); 511 for (size_t i = 0; i < kSize - 1; i++) { 512 EXPECT_EQ(gDestructorCount[i], 0); 513 } 514 EXPECT_EQ(gDestructorCount[kSize - 1], 1); 515 516 vector.clear(); 517 for (size_t i = 0; i < kSize; ++i) { 518 EXPECT_EQ(gDestructorCount[i], 1); 519 } 520 } 521 522 TEST(DynamicVectorDeathTest, SwapWithInvalidIndex) { 523 DynamicVector<int> vector; 524 vector.push_back(0x1337); 525 vector.push_back(0xcafe); 526 EXPECT_DEATH(vector.swap(0, 2), ""); 527 } 528 529 TEST(DynamicVectorDeathTest, SwapWithInvalidIndices) { 530 DynamicVector<int> vector; 531 vector.push_back(0x1337); 532 vector.push_back(0xcafe); 533 EXPECT_DEATH(vector.swap(2, 3), ""); 534 } 535 536 TEST(DynamicVector, Swap) { 537 DynamicVector<int> vector; 538 vector.push_back(0x1337); 539 vector.push_back(0xcafe); 540 541 vector.swap(0, 1); 542 EXPECT_EQ(vector[0], 0xcafe); 543 EXPECT_EQ(vector[1], 0x1337); 544 } 545 546 TEST(DynamicVector, BackFront) { 547 DynamicVector<int> vector; 548 vector.push_back(0x1337); 549 EXPECT_EQ(vector.front(), 0x1337); 550 EXPECT_EQ(vector.back(), 0x1337); 551 vector.push_back(0xcafe); 552 EXPECT_EQ(vector.front(), 0x1337); 553 EXPECT_EQ(vector.back(), 0xcafe); 554 vector.erase(0); 555 EXPECT_EQ(vector.front(), 0xcafe); 556 EXPECT_EQ(vector.back(), 0xcafe); 557 } 558 559 TEST(DynamicVector, Iterator) { 560 DynamicVector<int> vector; 561 vector.push_back(0); 562 vector.push_back(1); 563 vector.push_back(2); 564 565 size_t index = 0; 566 for (DynamicVector<int>::iterator it = vector.begin(); 567 it != vector.end(); ++it) { 568 EXPECT_EQ(vector[index++], *it); 569 } 570 571 DynamicVector<int>::iterator it = vector.begin() + vector.size() - 1; 572 EXPECT_EQ(vector[vector.size() - 1], *it); 573 574 it = vector.begin() + vector.size(); 575 EXPECT_TRUE(it == vector.end()); 576 } 577 578 TEST(DynamicVector, ConstIterator) { 579 DynamicVector<int> vector; 580 vector.push_back(0); 581 vector.push_back(1); 582 vector.push_back(2); 583 584 size_t index = 0; 585 for (DynamicVector<int>::const_iterator cit = vector.cbegin(); 586 cit != vector.cend(); ++cit) { 587 EXPECT_EQ(vector[index++], *cit); 588 } 589 590 DynamicVector<int>::const_iterator cit = vector.cbegin() + vector.size() - 1; 591 EXPECT_EQ(vector[vector.size() - 1], *cit); 592 593 cit = vector.cbegin() + vector.size(); 594 EXPECT_TRUE(cit == vector.cend()); 595 } 596 597 TEST(DynamicVector, IteratorAndPushBack) { 598 DynamicVector<int> vector; 599 vector.push_back(0); 600 vector.push_back(1); 601 vector.push_back(2); 602 size_t oldCapacity = vector.capacity(); 603 604 DynamicVector<int>::iterator it_b = vector.begin(); 605 DynamicVector<int>::iterator it_e = vector.end(); 606 607 vector.push_back(3); 608 ASSERT_TRUE(oldCapacity == vector.capacity()); 609 610 size_t index = 0; 611 for (; it_b != it_e; ++it_b) { 612 EXPECT_EQ(vector[index++], *it_b); 613 } 614 } 615 616 TEST(DynamicVector, IteratorAndEmplaceBack) { 617 DynamicVector<int> vector; 618 vector.push_back(0); 619 vector.push_back(1); 620 vector.push_back(2); 621 size_t oldCapacity = vector.capacity(); 622 623 DynamicVector<int>::iterator it_b = vector.begin(); 624 DynamicVector<int>::iterator it_e = vector.end(); 625 626 vector.emplace_back(3); 627 ASSERT_TRUE(oldCapacity == vector.capacity()); 628 629 size_t index = 0; 630 for (; it_b != it_e; ++it_b) { 631 EXPECT_EQ(vector[index++], *it_b); 632 } 633 } 634 635 TEST(DynamicVector, IteratorAndReserve) { 636 DynamicVector<int> vector; 637 vector.push_back(0); 638 vector.push_back(1); 639 vector.push_back(2); 640 size_t oldCapacity = vector.capacity(); 641 642 DynamicVector<int>::iterator it_b = vector.begin(); 643 DynamicVector<int>::iterator it_e = vector.end(); 644 645 vector.reserve(oldCapacity); 646 ASSERT_TRUE(oldCapacity == vector.capacity()); 647 648 size_t index = 0; 649 for (; it_b != it_e; ++it_b) { 650 EXPECT_EQ(vector[index++], *it_b); 651 } 652 } 653 654 TEST(DynamicVector, IteratorAndInsert) { 655 DynamicVector<int> vector; 656 vector.push_back(0); 657 vector.push_back(1); 658 vector.push_back(2); 659 size_t oldCapacity = vector.capacity(); 660 661 DynamicVector<int>::iterator it_b = vector.begin(); 662 663 vector.insert(2, 3); 664 ASSERT_TRUE(oldCapacity == vector.capacity()); 665 666 size_t index = 0; 667 while (index < 2) { 668 EXPECT_EQ(vector[index++], *it_b++); 669 } 670 } 671 672 TEST(DynamicVector, IteratorAndErase) { 673 DynamicVector<int> vector; 674 vector.push_back(0); 675 vector.push_back(1); 676 vector.push_back(2); 677 678 DynamicVector<int>::iterator it_b = vector.begin(); 679 680 vector.erase(2); 681 682 size_t index = 0; 683 while (index < 2) { 684 EXPECT_EQ(vector[index++], *it_b++); 685 } 686 } 687 688 TEST(DynamicVector, IteratorAndSwap) { 689 DynamicVector<int> vector; 690 vector.push_back(0); 691 vector.push_back(1); 692 vector.push_back(2); 693 vector.push_back(3); 694 695 DynamicVector<int>::iterator it_b = vector.begin(); 696 697 vector.swap(1, 3); 698 699 size_t index = 0; 700 while (index < 4) { 701 if (index != 1 && index != 3) { 702 EXPECT_EQ(vector[index], *it_b); 703 } 704 index++; 705 it_b++; 706 } 707 } 708 709 TEST(DynamicVector, MoveConstruct) { 710 DynamicVector<int> vector; 711 ASSERT_TRUE(vector.push_back(0)); 712 ASSERT_TRUE(vector.push_back(1)); 713 ASSERT_TRUE(vector.push_back(2)); 714 715 DynamicVector<int> movedVector(std::move(vector)); 716 EXPECT_EQ(vector.data(), nullptr); 717 EXPECT_NE(movedVector.data(), nullptr); 718 EXPECT_EQ(vector.size(), 0); 719 EXPECT_EQ(movedVector.size(), 3); 720 EXPECT_EQ(vector.capacity(), 0); 721 EXPECT_EQ(movedVector.capacity(), 4); 722 } 723 724 TEST(DynamicVector, MoveAssignmentConstruct) { 725 DynamicVector<int> vector; 726 ASSERT_TRUE(vector.push_back(0)); 727 ASSERT_TRUE(vector.push_back(1)); 728 ASSERT_TRUE(vector.push_back(2)); 729 730 DynamicVector<int> movedVector; 731 movedVector = std::move(vector); 732 EXPECT_EQ(vector.data(), nullptr); 733 EXPECT_NE(movedVector.data(), nullptr); 734 EXPECT_EQ(vector.size(), 0); 735 EXPECT_EQ(movedVector.size(), 3); 736 EXPECT_EQ(vector.capacity(), 0); 737 EXPECT_EQ(movedVector.capacity(), 4); 738 } 739 740 // Tests basic functionality of a vector wrapping an array 741 TEST(DynamicVector, Wrap) { 742 constexpr size_t kSize = 4; 743 int buf[kSize]; 744 for (size_t i = 0; i < kSize; i++) { 745 buf[i] = i; 746 } 747 748 DynamicVector<int> vector; 749 EXPECT_TRUE(vector.owns_data()); 750 vector.wrap(buf, kSize); 751 EXPECT_FALSE(vector.owns_data()); 752 EXPECT_EQ(vector.size(), kSize); 753 EXPECT_EQ(vector.capacity(), kSize); 754 EXPECT_EQ(vector.data(), buf); 755 756 EXPECT_CHRE_ASSERT(EXPECT_FALSE(vector.reserve(8))); 757 EXPECT_CHRE_ASSERT(EXPECT_FALSE(vector.push_back(-1))); 758 EXPECT_CHRE_ASSERT(EXPECT_FALSE(vector.emplace_back(-1))); 759 EXPECT_CHRE_ASSERT(EXPECT_FALSE(vector.insert(1, -1))); 760 EXPECT_CHRE_ASSERT(EXPECT_FALSE(vector.copy_array(buf, kSize))); 761 762 for (size_t i = 0; i < kSize; i++) { 763 EXPECT_EQ(vector[i], i); 764 } 765 766 vector.erase(0); 767 for (size_t i = 0; i < kSize - 1; i++) { 768 EXPECT_EQ(vector[i], i + 1); 769 } 770 771 EXPECT_TRUE(vector.push_back(kSize + 1)); 772 EXPECT_EQ(vector.back(), kSize + 1); 773 } 774 775 TEST(DynamicVector, MoveWrappedVector) { 776 constexpr size_t kSize = 4; 777 int buf[kSize]; 778 for (size_t i = 0; i < kSize; i++) { 779 buf[i] = i; 780 } 781 782 DynamicVector<int> vector1; 783 vector1.wrap(buf, kSize); 784 785 DynamicVector<int> vector2 = std::move(vector1); 786 EXPECT_TRUE(vector1.owns_data()); 787 EXPECT_EQ(vector1.size(), 0); 788 EXPECT_EQ(vector1.capacity(), 0); 789 EXPECT_EQ(vector1.data(), nullptr); 790 791 EXPECT_FALSE(vector2.owns_data()); 792 EXPECT_EQ(vector2.size(), kSize); 793 EXPECT_EQ(vector2.capacity(), kSize); 794 EXPECT_EQ(vector2.data(), buf); 795 } 796 797 TEST(DynamicVector, Unwrap) { 798 constexpr size_t kSize = 4; 799 int buf[kSize]; 800 for (size_t i = 0; i < kSize; i++) { 801 buf[i] = i; 802 } 803 804 DynamicVector<int> vec; 805 vec.wrap(buf, kSize); 806 ASSERT_FALSE(vec.owns_data()); 807 808 vec.unwrap(); 809 EXPECT_TRUE(vec.owns_data()); 810 EXPECT_EQ(vec.size(), 0); 811 EXPECT_EQ(vec.capacity(), 0); 812 EXPECT_EQ(vec.data(), nullptr); 813 814 EXPECT_TRUE(vec.push_back(1)); 815 } 816 817 TEST(DynamicVector, CopyArray) { 818 constexpr size_t kSize = 4; 819 int buf[kSize]; 820 for (size_t i = 0; i < kSize; i++) { 821 buf[i] = i; 822 } 823 824 DynamicVector<int> vec; 825 ASSERT_TRUE(vec.copy_array(buf, kSize)); 826 EXPECT_TRUE(vec.owns_data()); 827 828 EXPECT_EQ(vec.size(), kSize); 829 EXPECT_EQ(vec.capacity(), kSize); 830 EXPECT_NE(vec.data(), buf); 831 832 EXPECT_TRUE(vec.push_back(kSize)); 833 EXPECT_EQ(vec.size(), kSize + 1); 834 EXPECT_GE(vec.capacity(), kSize + 1); 835 836 for (size_t i = 0; i < kSize + 1; i++) { 837 EXPECT_EQ(vec[i], i); 838 } 839 } 840 841 TEST(DynamicVector, CopyArrayHandlesDestructor) { 842 resetDestructorCounts(); 843 constexpr size_t kSize = 4; 844 845 { 846 DynamicVector<Dummy> vec; 847 { 848 Dummy array[kSize]; 849 for (size_t i = 0; i < kSize; i++) { 850 array[i].setValue(i); 851 } 852 853 ASSERT_TRUE(vec.copy_array(array, kSize)); 854 } 855 856 for (size_t i = 0; i < kSize; i++) { 857 EXPECT_EQ(gDestructorCount[i], 1); 858 } 859 860 for (size_t i = 0; i < kSize; i++) { 861 ASSERT_TRUE(vec[i].getValue() == i); 862 } 863 } 864 865 for (size_t i = 0; i < kSize; i++) { 866 EXPECT_EQ(gDestructorCount[i], 2); 867 } 868 } 869 870 TEST(DynamicVector, CopyEmptyArray) { 871 DynamicVector<int> vec; 872 873 EXPECT_TRUE(vec.copy_array(nullptr, 0)); 874 EXPECT_EQ(vec.size(), 0); 875 876 vec.emplace_back(1); 877 EXPECT_TRUE(vec.copy_array(nullptr, 0)); 878 EXPECT_EQ(vec.size(), 0); 879 } 880 881 TEST(DynamicVector, PrepareForPush) { 882 DynamicVector<int> vector; 883 EXPECT_EQ(vector.size(), 0); 884 EXPECT_EQ(vector.capacity(), 0); 885 886 // Perform an initial prepareForPush operation which causes a size of one. 887 ASSERT_TRUE(vector.prepareForPush()); 888 EXPECT_EQ(vector.size(), 0); 889 EXPECT_EQ(vector.capacity(), 1); 890 ASSERT_TRUE(vector.push_back(0xcafe)); 891 EXPECT_EQ(vector.size(), 1); 892 EXPECT_EQ(vector.capacity(), 1); 893 894 // Verify that it becomes larger 895 ASSERT_TRUE(vector.prepareForPush()); 896 EXPECT_EQ(vector[0], 0xcafe); 897 EXPECT_EQ(vector.size(), 1); 898 EXPECT_EQ(vector.capacity(), 2); 899 900 // The vector should not become any larger than necessary. 901 ASSERT_TRUE(vector.prepareForPush()); 902 EXPECT_EQ(vector[0], 0xcafe); 903 EXPECT_EQ(vector.size(), 1); 904 EXPECT_EQ(vector.capacity(), 2); 905 } 906 907 TEST(DynamicVector, RidiculouslyHugeReserveFails) { 908 DynamicVector<int> vector; 909 ASSERT_FALSE(vector.reserve(SIZE_MAX)); 910 } 911 912 TEST(DynamicVector, PopBack) { 913 DynamicVector<int> vector; 914 constexpr size_t kSize = 4; 915 for (int i = 0; i < kSize; i++) { 916 vector.push_back(i); 917 } 918 919 for (int i = kSize - 1; i >= 0; i--) { 920 EXPECT_EQ(vector.back(), i); 921 vector.pop_back(); 922 } 923 EXPECT_TRUE(vector.empty()); 924 } 925 926 /** 927 * A test class to default construct an integer with an incrementing value. 928 */ 929 struct FancyInt { 930 static int index; 931 int value; 932 933 FancyInt() : value(index++) {} 934 }; 935 936 int FancyInt::index = 0; 937 938 TEST(DynamicVector, Resize) { 939 DynamicVector<FancyInt> vector; 940 ASSERT_TRUE(vector.resize(4)); 941 ASSERT_EQ(vector.size(), 4); 942 943 EXPECT_EQ(vector[0].value, 0); 944 EXPECT_EQ(vector[1].value, 1); 945 EXPECT_EQ(vector[2].value, 2); 946 EXPECT_EQ(vector[3].value, 3); 947 948 ASSERT_TRUE(vector.resize(2)); 949 ASSERT_EQ(vector.size(), 2); 950 951 EXPECT_EQ(vector[0].value, 0); 952 EXPECT_EQ(vector[1].value, 1); 953 954 ASSERT_TRUE(vector.resize(4)); 955 ASSERT_EQ(vector.size(), 4); 956 957 EXPECT_EQ(vector[0].value, 0); 958 EXPECT_EQ(vector[1].value, 1); 959 EXPECT_EQ(vector[2].value, 4); 960 EXPECT_EQ(vector[3].value, 5); 961 } 962