Index: Source/wtf/ListHashSetTest.cpp |
diff --git a/Source/wtf/ListHashSetTest.cpp b/Source/wtf/ListHashSetTest.cpp |
index f9e7644bd68511fae8df1c18c82803744cba96ad..315060a8bcbc5c72fa8781652d6929e262e98be3 100644 |
--- a/Source/wtf/ListHashSetTest.cpp |
+++ b/Source/wtf/ListHashSetTest.cpp |
@@ -25,6 +25,7 @@ |
#include "config.h" |
+#include "wtf/LinkedHashSet.h" |
#include "wtf/ListHashSet.h" |
#include "wtf/PassRefPtr.h" |
#include "wtf/RefCounted.h" |
@@ -33,147 +34,211 @@ |
namespace { |
-TEST(WTF, ListHashSetRemoveFirst) |
+template<typename Set> |
+void removeFirstHelper() |
{ |
- ListHashSet<int> list; |
+ Set list; |
+ list.add(-1); |
+ list.add(0); |
list.add(1); |
list.add(2); |
list.add(3); |
- ASSERT_EQ(1, list.first()); |
+ EXPECT_EQ(-1, list.first()); |
+ EXPECT_EQ(3, list.last()); |
+ |
+ list.removeFirst(); |
+ EXPECT_EQ(0, list.first()); |
+ |
+ list.removeLast(); |
+ EXPECT_EQ(2, list.last()); |
list.removeFirst(); |
- ASSERT_EQ(2, list.first()); |
+ EXPECT_EQ(1, list.first()); |
list.removeFirst(); |
- ASSERT_EQ(3, list.first()); |
+ EXPECT_EQ(2, list.first()); |
list.removeFirst(); |
- ASSERT_TRUE(list.isEmpty()); |
+ EXPECT_TRUE(list.isEmpty()); |
} |
-TEST(WTF, ListHashSetAppendOrMoveToLastNewItems) |
+TEST(WTF, ListHashSetRemoveFirst) |
+{ |
+ removeFirstHelper<ListHashSet<int> >(); |
+} |
+ |
+TEST(WTF, LinkedHashSetRemoveFirst) |
+{ |
+ removeFirstHelper<LinkedHashSet<int> >(); |
+} |
+ |
+template<typename Set> |
+void appendOrMoveToLastNewItems() |
{ |
- ListHashSet<int> list; |
- ListHashSet<int>::AddResult result = list.appendOrMoveToLast(1); |
- ASSERT_TRUE(result.isNewEntry); |
+ Set list; |
+ typename Set::AddResult result = list.appendOrMoveToLast(1); |
+ EXPECT_TRUE(result.isNewEntry); |
result = list.add(2); |
- ASSERT_TRUE(result.isNewEntry); |
+ EXPECT_TRUE(result.isNewEntry); |
result = list.appendOrMoveToLast(3); |
- ASSERT_TRUE(result.isNewEntry); |
+ EXPECT_TRUE(result.isNewEntry); |
- ASSERT_EQ(list.size(), 3UL); |
+ EXPECT_EQ(list.size(), 3UL); |
// The list should be in order 1, 2, 3. |
- ListHashSet<int>::iterator iterator = list.begin(); |
- ASSERT_EQ(1, *iterator); |
+ typename Set::iterator iterator = list.begin(); |
+ EXPECT_EQ(1, *iterator); |
++iterator; |
- ASSERT_EQ(2, *iterator); |
+ EXPECT_EQ(2, *iterator); |
++iterator; |
- ASSERT_EQ(3, *iterator); |
+ EXPECT_EQ(3, *iterator); |
++iterator; |
} |
-TEST(WTF, ListHashSetAppendOrMoveToLastWithDuplicates) |
+TEST(WTF, ListHashSetAppendOrMoveToLastNewItems) |
+{ |
+ appendOrMoveToLastNewItems<ListHashSet<int> >(); |
+} |
+ |
+TEST(WTF, LinkedHashSetAppendOrMoveToLastNewItems) |
+{ |
+ appendOrMoveToLastNewItems<LinkedHashSet<int> >(); |
+} |
+ |
+template<typename Set> |
+void appendOrMoveToLastWithDuplicates() |
{ |
- ListHashSet<int> list; |
+ Set list; |
// Add a single element twice. |
- ListHashSet<int>::AddResult result = list.add(1); |
- ASSERT_TRUE(result.isNewEntry); |
+ typename Set::AddResult result = list.add(1); |
+ EXPECT_TRUE(result.isNewEntry); |
result = list.appendOrMoveToLast(1); |
- ASSERT_FALSE(result.isNewEntry); |
- ASSERT_EQ(1UL, list.size()); |
+ EXPECT_FALSE(result.isNewEntry); |
+ EXPECT_EQ(1UL, list.size()); |
list.add(2); |
list.add(3); |
- ASSERT_EQ(3UL, list.size()); |
+ EXPECT_EQ(3UL, list.size()); |
// Appending 2 move it to the end. |
- ASSERT_EQ(3, list.last()); |
+ EXPECT_EQ(3, list.last()); |
result = list.appendOrMoveToLast(2); |
- ASSERT_FALSE(result.isNewEntry); |
- ASSERT_EQ(2, list.last()); |
+ EXPECT_FALSE(result.isNewEntry); |
+ EXPECT_EQ(2, list.last()); |
// Inverse the list by moving each element to end end. |
result = list.appendOrMoveToLast(3); |
- ASSERT_FALSE(result.isNewEntry); |
+ EXPECT_FALSE(result.isNewEntry); |
result = list.appendOrMoveToLast(2); |
- ASSERT_FALSE(result.isNewEntry); |
+ EXPECT_FALSE(result.isNewEntry); |
result = list.appendOrMoveToLast(1); |
- ASSERT_FALSE(result.isNewEntry); |
- ASSERT_EQ(3UL, list.size()); |
+ EXPECT_FALSE(result.isNewEntry); |
+ EXPECT_EQ(3UL, list.size()); |
- ListHashSet<int>::iterator iterator = list.begin(); |
- ASSERT_EQ(3, *iterator); |
+ typename Set::iterator iterator = list.begin(); |
+ EXPECT_EQ(3, *iterator); |
++iterator; |
- ASSERT_EQ(2, *iterator); |
+ EXPECT_EQ(2, *iterator); |
++iterator; |
- ASSERT_EQ(1, *iterator); |
+ EXPECT_EQ(1, *iterator); |
++iterator; |
} |
-TEST(WTF, ListHashSetPrependOrMoveToLastNewItems) |
+TEST(WTF, ListHashSetAppendOrMoveToLastWithDuplicates) |
+{ |
+ appendOrMoveToLastWithDuplicates<ListHashSet<int> >(); |
+} |
+ |
+TEST(WTF, LinkedHashSetAppendOrMoveToLastWithDuplicates) |
{ |
- ListHashSet<int> list; |
- ListHashSet<int>::AddResult result = list.prependOrMoveToFirst(1); |
- ASSERT_TRUE(result.isNewEntry); |
+ appendOrMoveToLastWithDuplicates<LinkedHashSet<int> >(); |
+} |
+ |
+template<typename Set> |
+void prependOrMoveToFirstNewItems() |
+{ |
+ Set list; |
+ typename Set::AddResult result = list.prependOrMoveToFirst(1); |
+ EXPECT_TRUE(result.isNewEntry); |
result = list.add(2); |
- ASSERT_TRUE(result.isNewEntry); |
+ EXPECT_TRUE(result.isNewEntry); |
result = list.prependOrMoveToFirst(3); |
- ASSERT_TRUE(result.isNewEntry); |
+ EXPECT_TRUE(result.isNewEntry); |
- ASSERT_EQ(list.size(), 3UL); |
+ EXPECT_EQ(list.size(), 3UL); |
// The list should be in order 3, 1, 2. |
- ListHashSet<int>::iterator iterator = list.begin(); |
- ASSERT_EQ(3, *iterator); |
+ typename Set::iterator iterator = list.begin(); |
+ EXPECT_EQ(3, *iterator); |
++iterator; |
- ASSERT_EQ(1, *iterator); |
+ EXPECT_EQ(1, *iterator); |
++iterator; |
- ASSERT_EQ(2, *iterator); |
+ EXPECT_EQ(2, *iterator); |
++iterator; |
} |
-TEST(WTF, ListHashSetPrependOrMoveToLastWithDuplicates) |
+TEST(WTF, ListHashSetPrependOrMoveToFirstNewItems) |
+{ |
+ prependOrMoveToFirstNewItems<ListHashSet<int> >(); |
+} |
+ |
+TEST(WTF, LinkedHashSetPrependOrMoveToFirstNewItems) |
+{ |
+ prependOrMoveToFirstNewItems<LinkedHashSet<int> >(); |
+} |
+ |
+template<typename Set> |
+void prependOrMoveToLastWithDuplicates() |
{ |
- ListHashSet<int> list; |
+ Set list; |
// Add a single element twice. |
- ListHashSet<int>::AddResult result = list.add(1); |
- ASSERT_TRUE(result.isNewEntry); |
+ typename Set::AddResult result = list.add(1); |
+ EXPECT_TRUE(result.isNewEntry); |
result = list.prependOrMoveToFirst(1); |
- ASSERT_FALSE(result.isNewEntry); |
- ASSERT_EQ(1UL, list.size()); |
+ EXPECT_FALSE(result.isNewEntry); |
+ EXPECT_EQ(1UL, list.size()); |
list.add(2); |
list.add(3); |
- ASSERT_EQ(3UL, list.size()); |
+ EXPECT_EQ(3UL, list.size()); |
// Prepending 2 move it to the beginning. |
- ASSERT_EQ(1, list.first()); |
+ EXPECT_EQ(1, list.first()); |
result = list.prependOrMoveToFirst(2); |
- ASSERT_FALSE(result.isNewEntry); |
- ASSERT_EQ(2, list.first()); |
+ EXPECT_FALSE(result.isNewEntry); |
+ EXPECT_EQ(2, list.first()); |
// Inverse the list by moving each element to the first position. |
result = list.prependOrMoveToFirst(1); |
- ASSERT_FALSE(result.isNewEntry); |
+ EXPECT_FALSE(result.isNewEntry); |
result = list.prependOrMoveToFirst(2); |
- ASSERT_FALSE(result.isNewEntry); |
+ EXPECT_FALSE(result.isNewEntry); |
result = list.prependOrMoveToFirst(3); |
- ASSERT_FALSE(result.isNewEntry); |
- ASSERT_EQ(3UL, list.size()); |
+ EXPECT_FALSE(result.isNewEntry); |
+ EXPECT_EQ(3UL, list.size()); |
- ListHashSet<int>::iterator iterator = list.begin(); |
- ASSERT_EQ(3, *iterator); |
+ typename Set::iterator iterator = list.begin(); |
+ EXPECT_EQ(3, *iterator); |
++iterator; |
- ASSERT_EQ(2, *iterator); |
+ EXPECT_EQ(2, *iterator); |
++iterator; |
- ASSERT_EQ(1, *iterator); |
+ EXPECT_EQ(1, *iterator); |
++iterator; |
} |
+TEST(WTF, ListHashSetPrependOrMoveToLastWithDuplicates) |
+{ |
+ prependOrMoveToLastWithDuplicates<ListHashSet<int> >(); |
+} |
+ |
+TEST(WTF, LinkedHashSetPrependOrMoveToLastWithDuplicates) |
+{ |
+ prependOrMoveToLastWithDuplicates<LinkedHashSet<int> >(); |
+} |
+ |
class DummyRefCounted: public WTF::RefCounted<DummyRefCounted> { |
public: |
DummyRefCounted(bool& isDeleted) : m_isDeleted(isDeleted) { m_isDeleted = false; } |
@@ -192,30 +257,237 @@ private: |
int DummyRefCounted::m_refInvokesCount = 0; |
-TEST(WTF, ListHashSetWithRefPtr) |
+template<typename Set> |
+void withRefPtr() |
{ |
bool isDeleted; |
+ DummyRefCounted::m_refInvokesCount = 0; |
RefPtr<DummyRefCounted> ptr = adoptRef(new DummyRefCounted(isDeleted)); |
- ASSERT_EQ(0, DummyRefCounted::m_refInvokesCount); |
+ EXPECT_EQ(0, DummyRefCounted::m_refInvokesCount); |
- ListHashSet<RefPtr<DummyRefCounted> > list; |
- list.add(ptr); |
+ Set set; |
+ set.add(ptr); |
// Referenced only once (to store a copy in the container). |
- ASSERT_EQ(1, DummyRefCounted::m_refInvokesCount); |
- ASSERT_EQ(ptr, list.first()); |
+ EXPECT_EQ(1, DummyRefCounted::m_refInvokesCount); |
+ EXPECT_EQ(ptr, set.first()); |
+ EXPECT_EQ(1, DummyRefCounted::m_refInvokesCount); |
DummyRefCounted* rawPtr = ptr.get(); |
- ASSERT_TRUE(list.contains(ptr)); |
- ASSERT_TRUE(list.contains(rawPtr)); |
+ EXPECT_TRUE(set.contains(ptr)); |
+ EXPECT_TRUE(set.contains(rawPtr)); |
+ EXPECT_EQ(1, DummyRefCounted::m_refInvokesCount); |
ptr.clear(); |
- ASSERT_FALSE(isDeleted); |
+ EXPECT_FALSE(isDeleted); |
+ EXPECT_EQ(1, DummyRefCounted::m_refInvokesCount); |
- list.remove(rawPtr); |
- ASSERT_TRUE(isDeleted); |
+ set.remove(rawPtr); |
+ EXPECT_TRUE(isDeleted); |
- ASSERT_EQ(1, DummyRefCounted::m_refInvokesCount); |
+ EXPECT_EQ(1, DummyRefCounted::m_refInvokesCount); |
+} |
+ |
+TEST(WTF, ListHashSetWithRefPtr) |
+{ |
+ withRefPtr<ListHashSet<RefPtr<DummyRefCounted> > >(); |
+} |
+ |
+TEST(WTF, LinkedHashSetWithRefPtr) |
+{ |
+ withRefPtr<LinkedHashSet<RefPtr<DummyRefCounted> > >(); |
+} |
+ |
+template<typename Set, typename SetRef, typename Iterator> |
+void findHelper() |
+{ |
+ Set set; |
+ set.add(-1); |
+ set.add(0); |
+ set.add(1); |
+ set.add(2); |
+ set.add(3); |
+ |
+ SetRef ref = set; |
+ Iterator it = ref.find(2); |
+ EXPECT_EQ(2, *it); |
+ ++it; |
+ EXPECT_EQ(3, *it); |
+ --it; |
+ --it; |
+ EXPECT_EQ(1, *it); |
+} |
+ |
+TEST(WTF, ListHashSetFind) |
+{ |
+ findHelper<ListHashSet<int>, const ListHashSet<int>&, ListHashSet<int>::const_iterator>(); |
+ findHelper<ListHashSet<int>, ListHashSet<int>&, ListHashSet<int>::iterator>(); |
+} |
+ |
+TEST(WTF, LinkedHashSetFind) |
+{ |
+ findHelper<LinkedHashSet<int>, const LinkedHashSet<int>&, LinkedHashSet<int>::const_iterator>(); |
+ findHelper<LinkedHashSet<int>, LinkedHashSet<int>&, LinkedHashSet<int>::iterator>(); |
+} |
+ |
+template<typename Set> |
+void insertBeforeHelper(bool canModifyWhileIterating) |
+{ |
+ Set set; |
+ set.add(-1); |
+ set.add(0); |
+ set.add(2); |
+ set.add(3); |
+ |
+ typename Set::iterator it = set.find(2); |
+ EXPECT_EQ(2, *it); |
+ set.insertBefore(it, 1); |
+ if (!canModifyWhileIterating) |
+ it = set.find(2); |
+ ++it; |
+ EXPECT_EQ(3, *it); |
+ EXPECT_EQ(5u, set.size()); |
+ --it; |
+ --it; |
+ EXPECT_EQ(1, *it); |
+ if (canModifyWhileIterating) { |
+ set.remove(-1); |
+ set.remove(0); |
+ set.remove(2); |
+ set.remove(3); |
+ EXPECT_EQ(1u, set.size()); |
+ EXPECT_EQ(1, *it); |
+ ++it; |
+ EXPECT_EQ(it, set.end()); |
+ --it; |
+ EXPECT_EQ(1, *it); |
+ set.insertBefore(it, -1); |
+ set.insertBefore(it, 0); |
+ set.add(2); |
+ set.add(3); |
+ } |
+ set.insertBefore(2, 42); |
+ set.insertBefore(-1, 103); |
+ EXPECT_EQ(103, set.first()); |
+ if (!canModifyWhileIterating) |
+ it = set.find(1); |
+ ++it; |
+ EXPECT_EQ(42, *it); |
+ EXPECT_EQ(7u, set.size()); |
+} |
+ |
+TEST(WTF, ListHashSetInsertBefore) |
+{ |
+ insertBeforeHelper<ListHashSet<int> >(true); |
+} |
+ |
+TEST(WTF, LinkedHashSetInsertBefore) |
+{ |
+ insertBeforeHelper<LinkedHashSet<int> >(false); |
+} |
+ |
+template<typename Set> |
+void addReturnIterator(bool canModifyWhileIterating) |
+{ |
+ Set set; |
+ set.add(-1); |
+ set.add(0); |
+ set.add(1); |
+ set.add(2); |
+ |
+ typename Set::iterator it = set.addReturnIterator(3); |
+ EXPECT_EQ(3, *it); |
+ --it; |
+ EXPECT_EQ(2, *it); |
+ EXPECT_EQ(5u, set.size()); |
+ --it; |
+ EXPECT_EQ(1, *it); |
+ --it; |
+ EXPECT_EQ(0, *it); |
+ it = set.addReturnIterator(4); |
+ if (canModifyWhileIterating) { |
+ set.remove(3); |
+ set.remove(2); |
+ set.remove(1); |
+ set.remove(0); |
+ set.remove(-1); |
+ EXPECT_EQ(1u, set.size()); |
+ } |
+ EXPECT_EQ(4, *it); |
+ ++it; |
+ EXPECT_EQ(it, set.end()); |
+ --it; |
+ EXPECT_EQ(4, *it); |
+ if (canModifyWhileIterating) { |
+ set.insertBefore(it, -1); |
+ set.insertBefore(it, 0); |
+ set.insertBefore(it, 1); |
+ set.insertBefore(it, 2); |
+ set.insertBefore(it, 3); |
+ } |
+ EXPECT_EQ(6u, set.size()); |
+ it = set.addReturnIterator(5); |
+ EXPECT_EQ(7u, set.size()); |
+ set.remove(it); |
+ EXPECT_EQ(6u, set.size()); |
+ EXPECT_EQ(4, set.last()); |
+} |
+ |
+TEST(WTF, ListHashSetAddReturnIterator) |
+{ |
+ addReturnIterator<ListHashSet<int> >(true); |
+} |
+ |
+TEST(WTF, LinkedHashSetAddReturnIterator) |
+{ |
+ addReturnIterator<LinkedHashSet<int> >(false); |
+} |
+ |
+template<typename Set> |
+void excerciseValuePeekInType() |
+{ |
+ Set set; |
+ bool isDeleted = false; |
+ bool isDeleted2 = false; |
+ |
+ RefPtr<DummyRefCounted> ptr = adoptRef(new DummyRefCounted(isDeleted)); |
+ RefPtr<DummyRefCounted> ptr2 = adoptRef(new DummyRefCounted(isDeleted2)); |
+ |
+ typename Set::AddResult addResult = set.add(ptr); |
+ EXPECT_TRUE(addResult.isNewEntry); |
+ set.find(ptr); |
+ const Set& constSet(set); |
+ constSet.find(ptr); |
+ EXPECT_TRUE(set.contains(ptr)); |
+ typename Set::iterator it = set.addReturnIterator(ptr); |
+ set.appendOrMoveToLast(ptr); |
+ set.prependOrMoveToFirst(ptr); |
+ set.insertBefore(ptr, ptr); |
+ set.insertBefore(it, ptr); |
+ EXPECT_EQ(1u, set.size()); |
+ set.add(ptr2); |
+ ptr2.clear(); |
+ set.remove(ptr); |
+ |
+ EXPECT_FALSE(isDeleted); |
+ ptr.clear(); |
+ EXPECT_TRUE(isDeleted); |
+ |
+ EXPECT_FALSE(isDeleted2); |
+ set.removeFirst(); |
+ EXPECT_TRUE(isDeleted2); |
+ |
+ EXPECT_EQ(0u, set.size()); |
+} |
+ |
+TEST(WTF, ListHashSetExcerciseValuePeekInType) |
+{ |
+ excerciseValuePeekInType<ListHashSet<RefPtr<DummyRefCounted> > >(); |
+} |
+ |
+TEST(WTF, LinkedHashSetExcerciseValuePeekInType) |
+{ |
+ excerciseValuePeekInType<LinkedHashSet<RefPtr<DummyRefCounted> > >(); |
} |
} // namespace |