Index: Source/wtf/VectorTest.cpp |
diff --git a/Source/wtf/VectorTest.cpp b/Source/wtf/VectorTest.cpp |
index 3c1e4783e83e071bf2d14d519c87c356422abfab..3cd32449fe050de2151552ae4b0a22a6025ffe0c 100644 |
--- a/Source/wtf/VectorTest.cpp |
+++ b/Source/wtf/VectorTest.cpp |
@@ -302,4 +302,106 @@ TEST(VectorTest, Compare) |
compare<Comparable>(); |
compare<WTF::String>(); |
} |
+ |
+class LivenessCounter { |
+public: |
+ void ref() { s_live++; } |
+ void deref() { s_live--; } |
+ |
+ static unsigned s_live; |
+}; |
+ |
+unsigned LivenessCounter::s_live = 0; |
+ |
+template<size_t inlineCapacity> |
+void theBigSwapTest() |
+{ |
+ LivenessCounter::s_live = 0; |
+ LivenessCounter counter; |
+ EXPECT_EQ(0u, LivenessCounter::s_live); |
+ |
+ Vector<RefPtr<LivenessCounter>, inlineCapacity> vector; |
+ Vector<RefPtr<LivenessCounter>, inlineCapacity> vector2; |
+ vector.append(&counter); |
+ vector2.append(&counter); |
+ EXPECT_EQ(2u, LivenessCounter::s_live); |
+ |
+ for (unsigned i = 0; i < 13; i++) { |
+ for (unsigned j = 0; j < 13; j++) { |
+ vector.clear(); |
+ vector2.clear(); |
+ EXPECT_EQ(0u, LivenessCounter::s_live); |
+ |
+ for (unsigned k = 0; k < j; k++) |
+ vector.append(&counter); |
+ EXPECT_EQ(j, LivenessCounter::s_live); |
+ EXPECT_EQ(j, vector.size()); |
+ |
+ for (unsigned k = 0; k < i; k++) |
+ vector2.append(&counter); |
+ EXPECT_EQ(i + j, LivenessCounter::s_live); |
+ EXPECT_EQ(i, vector2.size()); |
+ |
+ vector.swap(vector2); |
+ EXPECT_EQ(i + j, LivenessCounter::s_live); |
+ EXPECT_EQ(i, vector.size()); |
+ EXPECT_EQ(j, vector2.size()); |
+ |
+ unsigned size = vector.size(); |
+ unsigned size2 = vector2.size(); |
+ |
+ for (unsigned k = 0; k < 5; k++) { |
+ vector.swap(vector2); |
+ std::swap(size, size2); |
+ EXPECT_EQ(i + j, LivenessCounter::s_live); |
+ EXPECT_EQ(size, vector.size()); |
+ EXPECT_EQ(size2, vector2.size()); |
+ |
+ vector2.append(&counter); |
+ vector2.remove(0); |
+ } |
+ } |
+ } |
+ |
+} |
+ |
+TEST(VectorTest, BigSwapTest) |
+{ |
+ theBigSwapTest<0>(); |
+ theBigSwapTest<2>(); |
+ theBigSwapTest<10>(); |
+} |
+ |
+template<size_t inlineCapacity> |
+void swapValuesTest() |
+{ |
+ Vector<unsigned, inlineCapacity> vector; |
+ Vector<unsigned, inlineCapacity> vector2; |
+ |
+ for (unsigned size = 0; size < 13; size++) { |
+ for (unsigned size2 = 0; size2 < 13; size2++) { |
+ vector.clear(); |
+ vector2.clear(); |
+ for (unsigned i = 0; i < size; i++) |
+ vector.append(i); |
+ for (unsigned i = 0; i < size2; i++) |
+ vector2.append(i + 42); |
+ EXPECT_EQ(size, vector.size()); |
+ EXPECT_EQ(size2, vector2.size()); |
+ vector.swap(vector2); |
+ for (unsigned i = 0; i < size; i++) |
+ EXPECT_EQ(i, vector2[i]); |
+ for (unsigned i = 0; i < size2; i++) |
+ EXPECT_EQ(i + 42, vector[i]); |
+ } |
+ } |
+} |
+ |
+TEST(VectorTest, SwapValuesTest) |
+{ |
+ swapValuesTest<0>(); |
+ swapValuesTest<2>(); |
+ swapValuesTest<10>(); |
+} |
+ |
} // namespace |