Bug 1045920 (part 2) - Add mfbt/tests/TestRefPtr.cpp. r=froydnj.
authorNicholas Nethercote <nnethercote@mozilla.com>
Wed, 30 Jul 2014 06:59:52 -0700
changeset 196861 7c2de383cfef7c0538eae579a2981c2add488b83
parent 196860 c58acbd01f322b2aec5f4b3bf9ec785e613c7175
child 196862 93ac908b09ab482770e132d80ce9f66f1f5fde0a
push id1
push userroot
push dateMon, 20 Oct 2014 17:29:22 +0000
reviewersfroydnj
bugs1045920
milestone34.0a1
Bug 1045920 (part 2) - Add mfbt/tests/TestRefPtr.cpp. r=froydnj.
mfbt/RefPtr.h
mfbt/tests/TestRefPtr.cpp
mfbt/tests/moz.build
--- a/mfbt/RefPtr.h
+++ b/mfbt/RefPtr.h
@@ -387,166 +387,9 @@ template<typename T>
 OutParamRef<T>
 byRef(RefPtr<T>& aPtr)
 {
   return OutParamRef<T>(aPtr);
 }
 
 } // namespace mozilla
 
-#if 0
-
-// Command line that builds these tests
-//
-//   cp RefPtr.h test.cc && g++ -g -Wall -pedantic -DDEBUG -o test test.cc && ./test
-
-using namespace mozilla;
-
-struct Foo : public RefCounted<Foo>
-{
-  MOZ_DECLARE_REFCOUNTED_TYPENAME(Foo)
-  Foo() : mDead(false) {}
-  ~Foo()
-  {
-    MOZ_ASSERT(!mDead);
-    mDead = true;
-    sNumDestroyed++;
-  }
-
-  bool mDead;
-  static int sNumDestroyed;
-};
-int Foo::sNumDestroyed;
-
-struct Bar : public Foo {};
-
-TemporaryRef<Foo>
-NewFoo()
-{
-  return RefPtr<Foo>(new Foo());
-}
-
-TemporaryRef<Foo>
-NewBar()
-{
-  return new Bar();
-}
-
-void
-GetNewFoo(Foo** f)
-{
-  *f = new Bar();
-  // Kids, don't try this at home
-  (*f)->AddRef();
-}
-
-void
-GetPassedFoo(Foo** f)
-{
-  // Kids, don't try this at home
-  (*f)->AddRef();
-}
-
-void
-GetNewFoo(RefPtr<Foo>* f)
-{
-  *f = new Bar();
-}
-
-void
-GetPassedFoo(RefPtr<Foo>* f)
-{}
-
-TemporaryRef<Foo>
-GetNullFoo()
-{
-  return 0;
-}
-
-int
-main(int argc, char** argv)
-{
-  // This should blow up
-//    Foo* f = new Foo(); delete f;
-
-  MOZ_ASSERT(0 == Foo::sNumDestroyed);
-  {
-    RefPtr<Foo> f = new Foo();
-    MOZ_ASSERT(f->refCount() == 1);
-  }
-  MOZ_ASSERT(1 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> f1 = NewFoo();
-    RefPtr<Foo> f2(NewFoo());
-    MOZ_ASSERT(1 == Foo::sNumDestroyed);
-  }
-  MOZ_ASSERT(3 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> b = NewBar();
-    MOZ_ASSERT(3 == Foo::sNumDestroyed);
-  }
-  MOZ_ASSERT(4 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> f1;
-    {
-      f1 = new Foo();
-      RefPtr<Foo> f2(f1);
-      RefPtr<Foo> f3 = f2;
-      MOZ_ASSERT(4 == Foo::sNumDestroyed);
-    }
-    MOZ_ASSERT(4 == Foo::sNumDestroyed);
-  }
-  MOZ_ASSERT(5 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> f = new Foo();
-    f.forget();
-    MOZ_ASSERT(6 == Foo::sNumDestroyed);
-  }
-
-  {
-    RefPtr<Foo> f = new Foo();
-    GetNewFoo(byRef(f));
-    MOZ_ASSERT(7 == Foo::sNumDestroyed);
-  }
-  MOZ_ASSERT(8 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> f = new Foo();
-    GetPassedFoo(byRef(f));
-    MOZ_ASSERT(8 == Foo::sNumDestroyed);
-  }
-  MOZ_ASSERT(9 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> f = new Foo();
-    GetNewFoo(&f);
-    MOZ_ASSERT(10 == Foo::sNumDestroyed);
-  }
-  MOZ_ASSERT(11 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> f = new Foo();
-    GetPassedFoo(&f);
-    MOZ_ASSERT(11 == Foo::sNumDestroyed);
-  }
-  MOZ_ASSERT(12 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> f1 = new Bar();
-  }
-  MOZ_ASSERT(13 == Foo::sNumDestroyed);
-
-  {
-    RefPtr<Foo> f = GetNullFoo();
-    MOZ_ASSERT(13 == Foo::sNumDestroyed);
-  }
-  MOZ_ASSERT(13 == Foo::sNumDestroyed);
-
-  return 0;
-}
-
-#endif
-
 #endif /* mozilla_RefPtr_h */
new file mode 100644
--- /dev/null
+++ b/mfbt/tests/TestRefPtr.cpp
@@ -0,0 +1,161 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/RefPtr.h"
+
+using mozilla::RefCounted;
+using mozilla::RefPtr;
+using mozilla::TemporaryRef;
+
+class Foo : public RefCounted<Foo>
+{
+public:
+  MOZ_DECLARE_REFCOUNTED_TYPENAME(Foo)
+
+  Foo() : mDead(false) {}
+
+  static int sNumDestroyed;
+
+  ~Foo()
+  {
+    MOZ_ASSERT(!mDead);
+    mDead = true;
+    sNumDestroyed++;
+  }
+
+private:
+  bool mDead;
+};
+int Foo::sNumDestroyed;
+
+struct Bar : public Foo {};
+
+TemporaryRef<Foo>
+NewFoo()
+{
+  return RefPtr<Foo>(new Foo());
+}
+
+TemporaryRef<Foo>
+NewBar()
+{
+  return new Bar();
+}
+
+void
+GetNewFoo(Foo** aFoo)
+{
+  *aFoo = new Bar();
+  // Kids, don't try this at home
+  (*aFoo)->AddRef();
+}
+
+void
+GetPassedFoo(Foo** aFoo)
+{
+  // Kids, don't try this at home
+  (*aFoo)->AddRef();
+}
+
+void
+GetNewFoo(RefPtr<Foo>* aFoo)
+{
+  *aFoo = new Bar();
+}
+
+void
+GetPassedFoo(RefPtr<Foo>* aFoo)
+{}
+
+TemporaryRef<Foo>
+GetNullFoo()
+{
+  return 0;
+}
+
+int
+main()
+{
+  MOZ_RELEASE_ASSERT(0 == Foo::sNumDestroyed);
+  {
+    RefPtr<Foo> f = new Foo();
+    MOZ_RELEASE_ASSERT(f->refCount() == 1);
+  }
+  MOZ_RELEASE_ASSERT(1 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> f1 = NewFoo();
+    RefPtr<Foo> f2(NewFoo());
+    MOZ_RELEASE_ASSERT(1 == Foo::sNumDestroyed);
+  }
+  MOZ_RELEASE_ASSERT(3 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> b = NewBar();
+    MOZ_RELEASE_ASSERT(3 == Foo::sNumDestroyed);
+  }
+  MOZ_RELEASE_ASSERT(4 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> f1;
+    {
+      f1 = new Foo();
+      RefPtr<Foo> f2(f1);
+      RefPtr<Foo> f3 = f2;
+      MOZ_RELEASE_ASSERT(4 == Foo::sNumDestroyed);
+    }
+    MOZ_RELEASE_ASSERT(4 == Foo::sNumDestroyed);
+  }
+  MOZ_RELEASE_ASSERT(5 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> f = new Foo();
+    f.forget();
+    MOZ_RELEASE_ASSERT(6 == Foo::sNumDestroyed);
+  }
+
+  {
+    RefPtr<Foo> f = new Foo();
+    GetNewFoo(byRef(f));
+    MOZ_RELEASE_ASSERT(7 == Foo::sNumDestroyed);
+  }
+  MOZ_RELEASE_ASSERT(8 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> f = new Foo();
+    GetPassedFoo(byRef(f));
+    MOZ_RELEASE_ASSERT(8 == Foo::sNumDestroyed);
+  }
+  MOZ_RELEASE_ASSERT(9 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> f = new Foo();
+    GetNewFoo(&f);
+    MOZ_RELEASE_ASSERT(10 == Foo::sNumDestroyed);
+  }
+  MOZ_RELEASE_ASSERT(11 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> f = new Foo();
+    GetPassedFoo(&f);
+    MOZ_RELEASE_ASSERT(11 == Foo::sNumDestroyed);
+  }
+  MOZ_RELEASE_ASSERT(12 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> f1 = new Bar();
+  }
+  MOZ_RELEASE_ASSERT(13 == Foo::sNumDestroyed);
+
+  {
+    RefPtr<Foo> f = GetNullFoo();
+    MOZ_RELEASE_ASSERT(13 == Foo::sNumDestroyed);
+  }
+  MOZ_RELEASE_ASSERT(13 == Foo::sNumDestroyed);
+
+  return 0;
+}
+
--- a/mfbt/tests/moz.build
+++ b/mfbt/tests/moz.build
@@ -16,16 +16,17 @@ CPP_UNIT_TESTS += [
     'TestCountZeroes',
     'TestEndian',
     'TestEnumSet',
     'TestFloatingPoint',
     'TestIntegerPrintfMacros',
     'TestMacroArgs',
     'TestMacroForEach',
     'TestPair',
+    'TestRefPtr',
     'TestRollingMean',
     'TestSHA1',
     'TestTypedEnum',
     'TestTypeTraits',
     'TestUniquePtr',
     'TestWeakPtr',
 ]