| Index: Source/wtf/HashSetTest.cpp
|
| diff --git a/Source/wtf/HashSetTest.cpp b/Source/wtf/HashSetTest.cpp
|
| index 3b200f6994c8254128e7d0caaceb5f7386e41172..aed41a055ace4bb69d5f51fb62de549b85e900cc 100644
|
| --- a/Source/wtf/HashSetTest.cpp
|
| +++ b/Source/wtf/HashSetTest.cpp
|
| @@ -26,6 +26,9 @@
|
| #include "config.h"
|
|
|
| #include "wtf/HashSet.h"
|
| +#include "wtf/OwnPtr.h"
|
| +#include "wtf/PassOwnPtr.h"
|
| +#include "wtf/RefCounted.h"
|
| #include <gtest/gtest.h>
|
|
|
| namespace {
|
| @@ -77,4 +80,112 @@ TEST(HashSetTest, InitialCapacity)
|
| generateTestCapacityUpToSize<128>();
|
| }
|
|
|
| +struct Dummy {
|
| + Dummy(bool& deleted) : deleted(deleted) { }
|
| +
|
| + ~Dummy()
|
| + {
|
| + deleted = true;
|
| + }
|
| +
|
| + bool& deleted;
|
| +};
|
| +
|
| +TEST(HashSetTest, HashSetOwnPtr)
|
| +{
|
| + bool deleted1 = false, deleted2 = false;
|
| +
|
| + typedef HashSet<OwnPtr<Dummy> > OwnPtrSet;
|
| + OwnPtrSet set;
|
| +
|
| + Dummy* ptr1 = new Dummy(deleted1);
|
| + {
|
| + // AddResult in a separate scope to avoid assertion hit,
|
| + // since we modify the container further.
|
| + HashSet<OwnPtr<Dummy> >::AddResult res1 = set.add(adoptPtr(ptr1));
|
| + EXPECT_EQ(ptr1, res1.storedValue->get());
|
| + }
|
| +
|
| + EXPECT_FALSE(deleted1);
|
| + EXPECT_EQ(1UL, set.size());
|
| + OwnPtrSet::iterator it1 = set.find(ptr1);
|
| + EXPECT_NE(set.end(), it1);
|
| + EXPECT_EQ(ptr1, (*it1));
|
| +
|
| + Dummy* ptr2 = new Dummy(deleted2);
|
| + {
|
| + HashSet<OwnPtr<Dummy> >::AddResult res2 = set.add(adoptPtr(ptr2));
|
| + EXPECT_EQ(res2.storedValue->get(), ptr2);
|
| + }
|
| +
|
| + EXPECT_FALSE(deleted2);
|
| + EXPECT_EQ(2UL, set.size());
|
| + OwnPtrSet::iterator it2 = set.find(ptr2);
|
| + EXPECT_NE(set.end(), it2);
|
| + EXPECT_EQ(ptr2, (*it2));
|
| +
|
| + set.remove(ptr1);
|
| + EXPECT_TRUE(deleted1);
|
| +
|
| + set.clear();
|
| + EXPECT_TRUE(deleted2);
|
| + EXPECT_TRUE(set.isEmpty());
|
| +
|
| + deleted1 = false;
|
| + deleted2 = false;
|
| + {
|
| + OwnPtrSet set;
|
| + set.add(adoptPtr(new Dummy(deleted1)));
|
| + set.add(adoptPtr(new Dummy(deleted2)));
|
| + }
|
| + EXPECT_TRUE(deleted1);
|
| + EXPECT_TRUE(deleted2);
|
| +}
|
| +
|
| +class DummyRefCounted: public WTF::RefCounted<DummyRefCounted> {
|
| +public:
|
| + DummyRefCounted(bool& isDeleted) : m_isDeleted(isDeleted) { m_isDeleted = false; }
|
| + ~DummyRefCounted() { m_isDeleted = true; }
|
| +
|
| + void ref()
|
| + {
|
| + WTF::RefCounted<DummyRefCounted>::ref();
|
| + ++s_refInvokesCount;
|
| + }
|
| +
|
| + static int s_refInvokesCount;
|
| +
|
| +private:
|
| + bool& m_isDeleted;
|
| +};
|
| +
|
| +int DummyRefCounted::s_refInvokesCount = 0;
|
| +
|
| +TEST(HashSetTest, HashSetRefPtr)
|
| +{
|
| + bool isDeleted;
|
| + RefPtr<DummyRefCounted> ptr = adoptRef(new DummyRefCounted(isDeleted));
|
| + EXPECT_EQ(0, DummyRefCounted::s_refInvokesCount);
|
| + HashSet<RefPtr<DummyRefCounted> > set;
|
| + set.add(ptr);
|
| + // Referenced only once (to store a copy in the container).
|
| + EXPECT_EQ(1, DummyRefCounted::s_refInvokesCount);
|
| +
|
| + DummyRefCounted* rawPtr = ptr.get();
|
| +
|
| + EXPECT_TRUE(set.contains(rawPtr));
|
| + EXPECT_NE(set.end(), set.find(rawPtr));
|
| + EXPECT_TRUE(set.contains(ptr));
|
| + EXPECT_NE(set.end(), set.find(ptr));
|
| +
|
| + ptr.clear();
|
| + EXPECT_FALSE(isDeleted);
|
| +
|
| + set.remove(rawPtr);
|
| + EXPECT_TRUE(isDeleted);
|
| + EXPECT_TRUE(set.isEmpty());
|
| + EXPECT_EQ(1, DummyRefCounted::s_refInvokesCount);
|
| +}
|
| +
|
| +
|
| } // namespace
|
|
|