Home | History | Annotate | Download | only in containers
      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 
      5 #include "base/containers/vector_buffer.h"
      6 
      7 #include "base/test/copy_only_int.h"
      8 #include "base/test/move_only_int.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace base {
     12 namespace internal {
     13 
     14 TEST(VectorBuffer, DeletePOD) {
     15   constexpr int size = 10;
     16   VectorBuffer<int> buffer(size);
     17   for (int i = 0; i < size; i++)
     18     buffer.begin()[i] = i + 1;
     19 
     20   buffer.DestructRange(buffer.begin(), buffer.end());
     21 
     22   // Delete should do nothing.
     23   for (int i = 0; i < size; i++)
     24     EXPECT_EQ(i + 1, buffer.begin()[i]);
     25 }
     26 
     27 TEST(VectorBuffer, DeleteMoveOnly) {
     28   constexpr int size = 10;
     29   VectorBuffer<MoveOnlyInt> buffer(size);
     30   for (int i = 0; i < size; i++)
     31     new (buffer.begin() + i) MoveOnlyInt(i + 1);
     32 
     33   buffer.DestructRange(buffer.begin(), buffer.end());
     34 
     35   // Delete should have reset all of the values to 0.
     36   for (int i = 0; i < size; i++)
     37     EXPECT_EQ(0, buffer.begin()[i].data());
     38 }
     39 
     40 TEST(VectorBuffer, PODMove) {
     41   constexpr int size = 10;
     42   VectorBuffer<int> dest(size);
     43 
     44   VectorBuffer<int> original(size);
     45   for (int i = 0; i < size; i++)
     46     original.begin()[i] = i + 1;
     47 
     48   original.MoveRange(original.begin(), original.end(), dest.begin());
     49   for (int i = 0; i < size; i++)
     50     EXPECT_EQ(i + 1, dest.begin()[i]);
     51 }
     52 
     53 TEST(VectorBuffer, MovableMove) {
     54   constexpr int size = 10;
     55   VectorBuffer<MoveOnlyInt> dest(size);
     56 
     57   VectorBuffer<MoveOnlyInt> original(size);
     58   for (int i = 0; i < size; i++)
     59     new (original.begin() + i) MoveOnlyInt(i + 1);
     60 
     61   original.MoveRange(original.begin(), original.end(), dest.begin());
     62 
     63   // Moving from a MoveOnlyInt resets to 0.
     64   for (int i = 0; i < size; i++) {
     65     EXPECT_EQ(0, original.begin()[i].data());
     66     EXPECT_EQ(i + 1, dest.begin()[i].data());
     67   }
     68 }
     69 
     70 TEST(VectorBuffer, CopyToMove) {
     71   constexpr int size = 10;
     72   VectorBuffer<CopyOnlyInt> dest(size);
     73 
     74   VectorBuffer<CopyOnlyInt> original(size);
     75   for (int i = 0; i < size; i++)
     76     new (original.begin() + i) CopyOnlyInt(i + 1);
     77 
     78   original.MoveRange(original.begin(), original.end(), dest.begin());
     79 
     80   // The original should have been destructed, which should reset the value to
     81   // 0. Technically this dereferences the destructed object.
     82   for (int i = 0; i < size; i++) {
     83     EXPECT_EQ(0, original.begin()[i].data());
     84     EXPECT_EQ(i + 1, dest.begin()[i].data());
     85   }
     86 }
     87 
     88 }  // namespace internal
     89 }  // namespace base
     90