diff options
Diffstat (limited to 'tests/utility/smartPtrTest.cpp')
-rw-r--r-- | tests/utility/smartPtrTest.cpp | 345 |
1 files changed, 164 insertions, 181 deletions
diff --git a/tests/utility/smartPtrTest.cpp b/tests/utility/smartPtrTest.cpp index 9a7eb539..35824f42 100644 --- a/tests/utility/smartPtrTest.cpp +++ b/tests/utility/smartPtrTest.cpp @@ -17,242 +17,225 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -#include "../lib/unit++/unit++.h" - -#include <iostream> -#include <ostream> -#include <vector> - -#include "vmime/vmime.hpp" -#include "vmime/platforms/posix/posixHandler.hpp" +#include "tests/testUtils.hpp" #include "vmime/utility/smartPtr.hpp" -using namespace unitpp; +#define VMIME_TEST_SUITE smartPtrTest +#define VMIME_TEST_SUITE_MODULE "Utility" -namespace -{ - class smartPtrTest : public suite - { - struct A : public vmime::object - { - const int strongCount() const { return getStrongRefCount(); } - const int weakCount() const { return getWeakRefCount(); } - }; - struct B : public virtual A { }; - struct C : public virtual A { }; - struct D : public B, public C { }; +VMIME_TEST_SUITE_BEGIN - class R : public A - { - public: + VMIME_TEST_LIST_BEGIN + VMIME_TEST(testNull) + VMIME_TEST(testRefCounting) + VMIME_TEST(testWeakRef) + VMIME_TEST(testCast) + VMIME_TEST(testContainer) + VMIME_TEST(testCompare) + VMIME_TEST_LIST_END - R(bool* aliveFlag) : m_aliveFlag(aliveFlag) { *m_aliveFlag = true; } - ~R() { *m_aliveFlag = false; } - private: - - bool* m_aliveFlag; - }; + struct A : public vmime::object + { + const int strongCount() const { return getStrongRefCount(); } + const int weakCount() const { return getWeakRefCount(); } + }; + struct B : public virtual A { }; + struct C : public virtual A { }; + struct D : public B, public C { }; - void testNull() - { - vmime::ref <A> r1; - - assert_true("1", r1 == NULL); - assert_true("2", r1 == 0); - assert_true("3", NULL == r1); - assert_true("4", 0 == r1); - assert_true("5", !r1); - assert_true("6", r1 == vmime::null); - assert_true("7", vmime::null == r1); - assert_eq("8", static_cast <A*>(0), r1.get()); - } + class R : public A + { + public: - void testRefCounting() - { - bool o1_alive; - vmime::ref <R> r1 = vmime::create <R>(&o1_alive); + R(bool* aliveFlag) : m_aliveFlag(aliveFlag) { *m_aliveFlag = true; } + ~R() { *m_aliveFlag = false; } - assert_true("1", r1.get() != 0); - assert_true("2", o1_alive); - assert_eq("3", 1, r1->strongCount()); - assert_eq("4", 0, r1->weakCount()); + private: - vmime::ref <R> r2 = r1; + bool* m_aliveFlag; + }; - assert_true("5", o1_alive); - assert_eq("6", 2, r1->strongCount()); - assert_eq("7", 0, r1->weakCount()); - bool o2_alive; - vmime::ref <R> r3 = vmime::create <R>(&o2_alive); + void testNull() + { + vmime::ref <A> r1; + + VASSERT("1", r1 == NULL); + VASSERT("2", r1 == 0); + VASSERT("3", NULL == r1); + VASSERT("4", 0 == r1); + VASSERT("5", !r1); + VASSERT("6", r1 == vmime::null); + VASSERT("7", vmime::null == r1); + VASSERT_EQ("8", static_cast <A*>(0), r1.get()); + } + + void testRefCounting() + { + bool o1_alive; + vmime::ref <R> r1 = vmime::create <R>(&o1_alive); - r2 = r3; + VASSERT("1", r1.get() != 0); + VASSERT("2", o1_alive); + VASSERT_EQ("3", 1, r1->strongCount()); + VASSERT_EQ("4", 0, r1->weakCount()); - assert_true("8", o1_alive); - assert_true("9", o2_alive); - assert_eq("10", 1, r1->strongCount()); - assert_eq("11", 2, r2->strongCount()); - assert_eq("12", 2, r3->strongCount()); + vmime::ref <R> r2 = r1; - { - vmime::ref <R> r4; + VASSERT("5", o1_alive); + VASSERT_EQ("6", 2, r1->strongCount()); + VASSERT_EQ("7", 0, r1->weakCount()); - r4 = r1; + bool o2_alive; + vmime::ref <R> r3 = vmime::create <R>(&o2_alive); - assert_true("13", o1_alive); - assert_true("14", o2_alive); - assert_eq("15", 2, r4->strongCount()); - assert_eq("16", 2, r1->strongCount()); + r2 = r3; - r1 = NULL; + VASSERT("8", o1_alive); + VASSERT("9", o2_alive); + VASSERT_EQ("10", 1, r1->strongCount()); + VASSERT_EQ("11", 2, r2->strongCount()); + VASSERT_EQ("12", 2, r3->strongCount()); - assert_true("17", o1_alive); - assert_true("18", o2_alive); - assert_eq("19", 1, r4->strongCount()); + { + vmime::ref <R> r4; - // Here, object1 will be deleted - } + r4 = r1; - assert_true("20", !o1_alive); - assert_true("21", o2_alive); + VASSERT("13", o1_alive); + VASSERT("14", o2_alive); + VASSERT_EQ("15", 2, r4->strongCount()); + VASSERT_EQ("16", 2, r1->strongCount()); - { - vmime::weak_ref <R> w1 = r3; + r1 = NULL; - assert_eq("22", 1, r3->weakCount()); - } + VASSERT("17", o1_alive); + VASSERT("18", o2_alive); + VASSERT_EQ("19", 1, r4->strongCount()); - assert_true("23", o2_alive); - assert_eq("24", 2, r3->strongCount()); - assert_eq("25", 0, r3->weakCount()); + // Here, object1 will be deleted } - void testWeakRef() - { - vmime::ref <A> r1 = vmime::create <A>(); - vmime::weak_ref <A> w1 = r1; + VASSERT("20", !o1_alive); + VASSERT("21", o2_alive); - assert_true("1", r1.get() != 0); - assert_true("2", r1.get() == w1.get()); - - { - vmime::ref <A> r2 = r1; + { + vmime::weak_ref <R> w1 = r3; - assert_true("3", r1.get() == r2.get()); - assert_true("4", r1.get() == w1.get()); - } + VASSERT_EQ("22", 1, r3->weakCount()); + } - assert_true("5", r1.get() != 0); - assert_true("6", r1.get() == w1.get()); + VASSERT("23", o2_alive); + VASSERT_EQ("24", 2, r3->strongCount()); + VASSERT_EQ("25", 0, r3->weakCount()); + } - r1 = 0; + void testWeakRef() + { + vmime::ref <A> r1 = vmime::create <A>(); + vmime::weak_ref <A> w1 = r1; - assert_true("7", w1.get() == 0); - } + VASSERT("1", r1.get() != 0); + VASSERT("2", r1.get() == w1.get()); - void testCast() { - // Explicit upcast - vmime::ref <A> r1 = vmime::create <C>(); - vmime::ref <C> r2 = r1.dynamicCast <C>(); + vmime::ref <A> r2 = r1; - assert_true("1", r2.get() == dynamic_cast <C*>(r1.get())); - assert_true("2", 0 == r1.dynamicCast <B>().get()); - - // Implicit downcast - vmime::ref <D> r3 = vmime::create <D>(); - vmime::ref <A> r4 = r3; - - assert_true("3", r4.get() == dynamic_cast <A*>(r3.get())); + VASSERT("3", r1.get() == r2.get()); + VASSERT("4", r1.get() == w1.get()); } - void testContainer() - { - bool o1_alive; - vmime::ref <R> r1 = vmime::create <R>(&o1_alive); + VASSERT("5", r1.get() != 0); + VASSERT("6", r1.get() == w1.get()); - bool o2_alive; - vmime::ref <R> r2 = vmime::create <R>(&o2_alive); + r1 = 0; - std::vector <vmime::ref <R> > v1; - v1.push_back(r1); - v1.push_back(r2); + VASSERT("7", w1.get() == 0); + } - assert_true("1", o1_alive); - assert_eq("2", 2, r1->strongCount()); - assert_true("3", o2_alive); - assert_eq("4", 2, r2->strongCount()); + void testCast() + { + // Explicit upcast + vmime::ref <A> r1 = vmime::create <C>(); + vmime::ref <C> r2 = r1.dynamicCast <C>(); - { - std::vector <vmime::ref <R> > v2 = v1; + VASSERT("1", r2.get() == dynamic_cast <C*>(r1.get())); + VASSERT("2", 0 == r1.dynamicCast <B>().get()); - assert_true("5", o1_alive); - assert_eq("6", 3, r1->strongCount()); - assert_true("7", o2_alive); - assert_eq("8", 3, r2->strongCount()); + // Implicit downcast + vmime::ref <D> r3 = vmime::create <D>(); + vmime::ref <A> r4 = r3; - v2[1] = NULL; + VASSERT("3", r4.get() == dynamic_cast <A*>(r3.get())); + } - assert_true("9", o1_alive); - assert_eq("10", 3, r1->strongCount()); - assert_true("11", o2_alive); - assert_eq("12", 2, r2->strongCount()); - } + void testContainer() + { + bool o1_alive; + vmime::ref <R> r1 = vmime::create <R>(&o1_alive); - assert_true("13", o1_alive); - assert_eq("14", 2, r1->strongCount()); - assert_true("15", o2_alive); - assert_eq("16", 2, r2->strongCount()); - } + bool o2_alive; + vmime::ref <R> r2 = vmime::create <R>(&o2_alive); - void testCompare() - { - vmime::ref <A> r1 = vmime::create <A>(); - vmime::ref <A> r2 = vmime::create <B>(); - vmime::ref <A> r3 = vmime::create <C>(); - vmime::ref <A> r4 = r1; - - assert_true("1", r1 != r2); - assert_true("2", r1.get() == r1); - assert_true("3", r1 == r1.get()); - assert_true("4", r2 != r1.get()); - assert_true("5", r1.get() != r2); - assert_true("6", r1 == r4); - assert_true("7", r1.get() == r4); - - std::vector <vmime::ref <A> > v; - v.push_back(r1); - v.push_back(r2); - - assert_true("8", std::find(v.begin(), v.end(), r1) == v.begin()); - assert_true("9", std::find(v.begin(), v.end(), r2) == v.begin() + 1); - assert_true("10", std::find(v.begin(), v.end(), r3) == v.end()); - } + std::vector <vmime::ref <R> > v1; + v1.push_back(r1); + v1.push_back(r2); - public: + VASSERT("1", o1_alive); + VASSERT_EQ("2", 2, r1->strongCount()); + VASSERT("3", o2_alive); + VASSERT_EQ("4", 2, r2->strongCount()); - smartPtrTest() : suite("vmime::utility::url") { - // VMime initialization - vmime::platformDependant::setHandler<vmime::platforms::posix::posixHandler>(); + std::vector <vmime::ref <R> > v2 = v1; + + VASSERT("5", o1_alive); + VASSERT_EQ("6", 3, r1->strongCount()); + VASSERT("7", o2_alive); + VASSERT_EQ("8", 3, r2->strongCount()); - add("Null", testcase(this, "TestNull", &smartPtrTest::testNull)); - add("RefCounting", testcase(this, "TestRefCounting", &smartPtrTest::testRefCounting)); - add("WeakRef", testcase(this, "TestWeakRef", &smartPtrTest::testWeakRef)); - add("Cast", testcase(this, "TestCast", &smartPtrTest::testCast)); - add("Container", testcase(this, "TestContainer", &smartPtrTest::testContainer)); - add("Compare", testcase(this, "TestCompare", &smartPtrTest::testCompare)); + v2[1] = NULL; - suite::main().add("vmime::utility::smartPtr", this); + VASSERT("9", o1_alive); + VASSERT_EQ("10", 3, r1->strongCount()); + VASSERT("11", o2_alive); + VASSERT_EQ("12", 2, r2->strongCount()); } - }; + VASSERT("13", o1_alive); + VASSERT_EQ("14", 2, r1->strongCount()); + VASSERT("15", o2_alive); + VASSERT_EQ("16", 2, r2->strongCount()); + } - smartPtrTest* theTest = new smartPtrTest(); -} + void testCompare() + { + vmime::ref <A> r1 = vmime::create <A>(); + vmime::ref <A> r2 = vmime::create <B>(); + vmime::ref <A> r3 = vmime::create <C>(); + vmime::ref <A> r4 = r1; + + VASSERT("1", r1 != r2); + VASSERT("2", r1.get() == r1); + VASSERT("3", r1 == r1.get()); + VASSERT("4", r2 != r1.get()); + VASSERT("5", r1.get() != r2); + VASSERT("6", r1 == r4); + VASSERT("7", r1.get() == r4); + + std::vector <vmime::ref <A> > v; + v.push_back(r1); + v.push_back(r2); + + VASSERT("8", std::find(v.begin(), v.end(), r1) == v.begin()); + VASSERT("9", std::find(v.begin(), v.end(), r2) == v.begin() + 1); + VASSERT("10", std::find(v.begin(), v.end(), r3) == v.end()); + } + +VMIME_TEST_SUITE_END |