mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1045920 (part 2) - Add mfbt/tests/TestRefPtr.cpp. r=froydnj.
This commit is contained in:
parent
5829d5e336
commit
a4be05bebe
157
mfbt/RefPtr.h
157
mfbt/RefPtr.h
@ -392,161 +392,4 @@ byRef(RefPtr<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 */
|
||||
|
161
mfbt/tests/TestRefPtr.cpp
Normal file
161
mfbt/tests/TestRefPtr.cpp
Normal file
@ -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;
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ CPP_UNIT_TESTS += [
|
||||
'TestMacroArgs',
|
||||
'TestMacroForEach',
|
||||
'TestPair',
|
||||
'TestRefPtr',
|
||||
'TestRollingMean',
|
||||
'TestSHA1',
|
||||
'TestTypedEnum',
|
||||
|
Loading…
Reference in New Issue
Block a user