| Index: base/containers/vector_buffer_unittest.cc
|
| diff --git a/base/containers/vector_buffer_unittest.cc b/base/containers/vector_buffer_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6d49505d40290b310b1e0684fe655566c269d9fe
|
| --- /dev/null
|
| +++ b/base/containers/vector_buffer_unittest.cc
|
| @@ -0,0 +1,89 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/containers/vector_buffer.h"
|
| +
|
| +#include "base/test/copy_only_int.h"
|
| +#include "base/test/move_only_int.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace base {
|
| +namespace internal {
|
| +
|
| +TEST(VectorBuffer, DeletePOD) {
|
| + constexpr int size = 10;
|
| + VectorBuffer<int> buffer(size);
|
| + for (int i = 0; i < size; i++)
|
| + buffer.begin()[i] = i + 1;
|
| +
|
| + buffer.DestructRange(buffer.begin(), buffer.end());
|
| +
|
| + // Delete should do nothing.
|
| + for (int i = 0; i < size; i++)
|
| + EXPECT_EQ(i + 1, buffer.begin()[i]);
|
| +}
|
| +
|
| +TEST(VectorBuffer, DeleteMoveOnly) {
|
| + constexpr int size = 10;
|
| + VectorBuffer<MoveOnlyInt> buffer(size);
|
| + for (int i = 0; i < size; i++)
|
| + new (buffer.begin() + i) MoveOnlyInt(i + 1);
|
| +
|
| + buffer.DestructRange(buffer.begin(), buffer.end());
|
| +
|
| + // Delete should have reset all of the values to 0.
|
| + for (int i = 0; i < size; i++)
|
| + EXPECT_EQ(0, buffer.begin()[i].data());
|
| +}
|
| +
|
| +TEST(VectorBuffer, PODMove) {
|
| + constexpr int size = 10;
|
| + VectorBuffer<int> dest(size);
|
| +
|
| + VectorBuffer<int> original(size);
|
| + for (int i = 0; i < size; i++)
|
| + original.begin()[i] = i + 1;
|
| +
|
| + original.MoveRange(original.begin(), original.end(), dest.begin());
|
| + for (int i = 0; i < size; i++)
|
| + EXPECT_EQ(i + 1, dest.begin()[i]);
|
| +}
|
| +
|
| +TEST(VectorBuffer, MovableMove) {
|
| + constexpr int size = 10;
|
| + VectorBuffer<MoveOnlyInt> dest(size);
|
| +
|
| + VectorBuffer<MoveOnlyInt> original(size);
|
| + for (int i = 0; i < size; i++)
|
| + new (original.begin() + i) MoveOnlyInt(i + 1);
|
| +
|
| + original.MoveRange(original.begin(), original.end(), dest.begin());
|
| +
|
| + // Moving from a MoveOnlyInt resets to 0.
|
| + for (int i = 0; i < size; i++) {
|
| + EXPECT_EQ(0, original.begin()[i].data());
|
| + EXPECT_EQ(i + 1, dest.begin()[i].data());
|
| + }
|
| +}
|
| +
|
| +TEST(VectorBuffer, CopyToMove) {
|
| + constexpr int size = 10;
|
| + VectorBuffer<CopyOnlyInt> dest(size);
|
| +
|
| + VectorBuffer<CopyOnlyInt> original(size);
|
| + for (int i = 0; i < size; i++)
|
| + new (original.begin() + i) CopyOnlyInt(i + 1);
|
| +
|
| + original.MoveRange(original.begin(), original.end(), dest.begin());
|
| +
|
| + // The original should have been destructed, which should reset the value to
|
| + // 0. Technically this dereferences the destructed object.
|
| + for (int i = 0; i < size; i++) {
|
| + EXPECT_EQ(0, original.begin()[i].data());
|
| + EXPECT_EQ(i + 1, dest.begin()[i].data());
|
| + }
|
| +}
|
| +
|
| +} // namespace internal
|
| +} // namespace base
|
|
|