Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Unified Diff: Source/wtf/HashSetTest.cpp

Issue 252633005: Enable WTF::HashSet<OwnPtr<> > (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Met comments from Erik Corry Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/wtf/HashSet.h ('k') | Source/wtf/HashTable.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/wtf/HashSet.h ('k') | Source/wtf/HashTable.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698