| Index: third_party/WebKit/Source/wtf/VectorTest.cpp
|
| diff --git a/third_party/WebKit/Source/wtf/VectorTest.cpp b/third_party/WebKit/Source/wtf/VectorTest.cpp
|
| index df283acd3a9e6a23cb0d46a8698c567d9e3572fc..15a4ed52cfa209f2a2221235c0f57f9d9b5c6c57 100644
|
| --- a/third_party/WebKit/Source/wtf/VectorTest.cpp
|
| +++ b/third_party/WebKit/Source/wtf/VectorTest.cpp
|
| @@ -190,7 +190,6 @@ TEST(VectorTest, OwnPtr)
|
| for (index = 0; index < vector.size(); index++) {
|
| OwnPtr<DestructCounter>& refCounter = vector[index];
|
| EXPECT_EQ(index, static_cast<size_t>(refCounter->get()));
|
| - index++;
|
| }
|
| EXPECT_EQ(0, destructNumber);
|
|
|
| @@ -229,6 +228,71 @@ TEST(VectorTest, OwnPtr)
|
| EXPECT_EQ(count, static_cast<size_t>(destructNumber));
|
| }
|
|
|
| +class MoveOnly {
|
| +public:
|
| + explicit MoveOnly(int i = 0)
|
| + : m_i(i)
|
| + { }
|
| +
|
| + MoveOnly(MoveOnly&& other)
|
| + : m_i(other.m_i)
|
| + {
|
| + other.m_i = 0;
|
| + }
|
| +
|
| + MoveOnly& operator=(MoveOnly&& other)
|
| + {
|
| + if (this != &other) {
|
| + m_i = other.m_i;
|
| + other.m_i = 0;
|
| + }
|
| + return *this;
|
| + }
|
| +
|
| + int value() const { return m_i; }
|
| +
|
| +private:
|
| + WTF_MAKE_NONCOPYABLE(MoveOnly);
|
| + int m_i;
|
| +};
|
| +
|
| +TEST(VectorTest, MoveOnlyType)
|
| +{
|
| + WTF::Vector<MoveOnly> vector;
|
| + vector.append(MoveOnly(1));
|
| + vector.append(MoveOnly(2));
|
| + EXPECT_EQ(2u, vector.size());
|
| +
|
| + ASSERT_EQ(1, vector.first().value());
|
| + ASSERT_EQ(2, vector.last().value());
|
| +
|
| + vector.remove(0);
|
| + EXPECT_EQ(2, vector[0].value());
|
| + EXPECT_EQ(1u, vector.size());
|
| +
|
| + MoveOnly moveOnly(std::move(vector[0]));
|
| + vector.remove(0);
|
| + ASSERT_EQ(2, moveOnly.value());
|
| + ASSERT_EQ(0u, vector.size());
|
| +
|
| + size_t count = vector.capacity() + 1;
|
| + for (size_t i = 0; i < count; i++)
|
| + vector.append(MoveOnly(i + 1)); // +1 to distinguish from default-constructed.
|
| +
|
| + // Reallocation did not affect the vector's content.
|
| + EXPECT_EQ(count, vector.size());
|
| + for (size_t i = 0; i < vector.size(); i++)
|
| + EXPECT_EQ(static_cast<int>(i + 1), vector[i].value());
|
| +
|
| + WTF::Vector<MoveOnly> otherVector;
|
| + vector.swap(otherVector);
|
| + EXPECT_EQ(count, otherVector.size());
|
| + EXPECT_EQ(0u, vector.size());
|
| +
|
| + vector = std::move(otherVector);
|
| + EXPECT_EQ(count, vector.size());
|
| +}
|
| +
|
| // WrappedInt class will fail if it was memmoved or memcpyed.
|
| static HashSet<void*> constructedWrappedInts;
|
| class WrappedInt {
|
| @@ -381,6 +445,21 @@ TEST(VectorTest, Compare)
|
| compare<WTF::String>();
|
| }
|
|
|
| +TEST(VectorTest, AppendFirst)
|
| +{
|
| + Vector<WTF::String> vector;
|
| + vector.append("string");
|
| + // Test passes if it does not crash (reallocation did not make
|
| + // the input reference stale).
|
| + size_t limit = vector.capacity() + 1;
|
| + for (size_t i = 0; i < limit; i++)
|
| + vector.append(vector.first());
|
| +
|
| + limit = vector.capacity() + 1;
|
| + for (size_t i = 0; i < limit; i++)
|
| + vector.append(const_cast<const WTF::String&>(vector.first()));
|
| +}
|
| +
|
| } // anonymous namespace
|
|
|
| } // namespace WTF
|
|
|