diff -r 000000000000 -r 6474c204b198 xpcom/tests/TestAutoRef.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xpcom/tests/TestAutoRef.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +// vim:cindent:ts=4:et:sw=4: +/* 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 "nsAutoRef.h" +#include "TestHarness.h" + +#define TEST(aCondition, aMsg) \ + if (!(aCondition)) { fail("TestAutoRef: "#aMsg); exit(1); } + +struct TestObjectA { +public: + TestObjectA() : mRefCnt(0) { + } + + ~TestObjectA() { + TEST(mRefCnt == 0, "mRefCnt in destructor"); + } + +public: + int mRefCnt; +}; + +template <> +class nsAutoRefTraits : public nsPointerRefTraits +{ +public: + static int mTotalRefsCnt; + + static void Release(TestObjectA *ptr) { + ptr->mRefCnt--; + if (ptr->mRefCnt == 0) { + delete ptr; + } + } + + static void AddRef(TestObjectA *ptr) { + ptr->mRefCnt++; + } +}; + +int nsAutoRefTraits::mTotalRefsCnt = 0; + +int main() +{ + { + nsCountedRef a(new TestObjectA()); + TEST(a->mRefCnt == 1, "nsCountedRef instantiation with valid RawRef"); + + nsCountedRef b; + TEST(b.get() == nullptr, "nsCountedRef instantiation with invalid RawRef"); + + a.swap(b); + TEST(b->mRefCnt, "nsAutoRef::swap() t1"); + TEST(a.get() == nullptr, "nsAutoRef::swap() t2"); + } + + TEST(true, "All tests pass"); + return 0; +}