vector_buffer_unittest.cc 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/containers/vector_buffer.h"
  5. #include "base/test/copy_only_int.h"
  6. #include "base/test/move_only_int.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace base {
  9. namespace internal {
  10. TEST(VectorBuffer, DeletePOD) {
  11. constexpr int size = 10;
  12. VectorBuffer<int> buffer(size);
  13. for (int i = 0; i < size; i++)
  14. buffer.begin()[i] = i + 1;
  15. buffer.DestructRange(buffer.begin(), buffer.end());
  16. // Delete should do nothing.
  17. for (int i = 0; i < size; i++)
  18. EXPECT_EQ(i + 1, buffer.begin()[i]);
  19. }
  20. TEST(VectorBuffer, DeleteMoveOnly) {
  21. constexpr int size = 10;
  22. VectorBuffer<MoveOnlyInt> buffer(size);
  23. for (int i = 0; i < size; i++)
  24. new (buffer.begin() + i) MoveOnlyInt(i + 1);
  25. buffer.DestructRange(buffer.begin(), buffer.end());
  26. // Delete should have reset all of the values to 0.
  27. for (int i = 0; i < size; i++)
  28. EXPECT_EQ(0, buffer.begin()[i].data());
  29. }
  30. TEST(VectorBuffer, PODMove) {
  31. constexpr int size = 10;
  32. VectorBuffer<int> dest(size);
  33. VectorBuffer<int> original(size);
  34. for (int i = 0; i < size; i++)
  35. original.begin()[i] = i + 1;
  36. original.MoveRange(original.begin(), original.end(), dest.begin());
  37. for (int i = 0; i < size; i++)
  38. EXPECT_EQ(i + 1, dest.begin()[i]);
  39. }
  40. TEST(VectorBuffer, MovableMove) {
  41. constexpr int size = 10;
  42. VectorBuffer<MoveOnlyInt> dest(size);
  43. VectorBuffer<MoveOnlyInt> original(size);
  44. for (int i = 0; i < size; i++)
  45. new (original.begin() + i) MoveOnlyInt(i + 1);
  46. original.MoveRange(original.begin(), original.end(), dest.begin());
  47. // Moving from a MoveOnlyInt resets to 0.
  48. for (int i = 0; i < size; i++) {
  49. EXPECT_EQ(0, original.begin()[i].data());
  50. EXPECT_EQ(i + 1, dest.begin()[i].data());
  51. }
  52. }
  53. TEST(VectorBuffer, CopyToMove) {
  54. constexpr int size = 10;
  55. VectorBuffer<CopyOnlyInt> dest(size);
  56. VectorBuffer<CopyOnlyInt> original(size);
  57. for (int i = 0; i < size; i++)
  58. new (original.begin() + i) CopyOnlyInt(i + 1);
  59. original.MoveRange(original.begin(), original.end(), dest.begin());
  60. // The original should have been destructed, which should reset the value to
  61. // 0. Technically this dereferences the destructed object.
  62. for (int i = 0; i < size; i++) {
  63. EXPECT_EQ(0, original.begin()[i].data());
  64. EXPECT_EQ(i + 1, dest.begin()[i].data());
  65. }
  66. }
  67. } // namespace internal
  68. } // namespace base