#include #include "common/ptr.h" class PtrTestSuite : public CxxTest::TestSuite { public: void test_assign() { Common::SharedPtr p1(new int(1)); TS_ASSERT(p1.unique()); TS_ASSERT_EQUALS(*p1, 1); { Common::SharedPtr p2 = p1; TS_ASSERT(!p1.unique()); TS_ASSERT(p1.refCount() == p2.refCount()); TS_ASSERT(p1.refCount() == 2); TS_ASSERT(p1 == p2); TS_ASSERT_EQUALS(*p2, 1); { Common::SharedPtr p3; p3 = p2; TS_ASSERT(p3 == p2 && p3 == p1); TS_ASSERT(p1.refCount() == 3); TS_ASSERT_EQUALS(*p3, 1); *p3 = 0; TS_ASSERT_EQUALS(*p3, 0); } TS_ASSERT_EQUALS(*p2, 0); TS_ASSERT(p1.refCount() == 2); } TS_ASSERT_EQUALS(*p1, 0); TS_ASSERT(p1.unique()); } template struct Deleter { bool *test; void operator()(T *ptr) { *test = true; delete ptr; } }; void test_deleter() { Deleter myDeleter; myDeleter.test = new bool(false); { Common::SharedPtr p(new int(1), myDeleter); } TS_ASSERT_EQUALS(*myDeleter.test, true); delete myDeleter.test; } void test_compare() { Common::SharedPtr p1(new int(1)); Common::SharedPtr p2; TS_ASSERT(p1); TS_ASSERT(!p2); TS_ASSERT(p1 != 0); TS_ASSERT(p2 == 0); } struct A { int a; }; struct B : public A { int b; }; void test_cast() { Common::SharedPtr b(new B); Common::SharedPtr a(b); a = b; } };