#include #include #include #include "UnitTest++/src/UnitTest++.h" #include "ptr.h" // a simple class that reference counts itself class RefCounter { public: RefCounter() { s_instances++; } virtual ~RefCounter() { s_instances--; } virtual signed Get(signed x) { return x; } static signed s_instances; }; signed RefCounter::s_instances = 0; // and a derived class off of RefCounter (for testing list of base pointers) class RefCounterDerived: public RefCounter { public: virtual signed Get(signed x) { return x*2; } }; // a test fixture we need for setup/teardown of each test struct InstanceFixture { InstanceFixture() { RefCounter::s_instances = 0; } ~InstanceFixture() { // empty } }; /////////////////////////////////// TEST_FIXTURE(InstanceFixture,AutoDeletion) { CHECK_EQUAL(0,RefCounter::s_instances); { ptr a(new RefCounter); CHECK_EQUAL(1,RefCounter::s_instances); } CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,AssignZeroForDeletion) { CHECK_EQUAL(0,RefCounter::s_instances); ptr a = new RefCounter; CHECK_EQUAL(1,RefCounter::s_instances); a = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayAutoDeletion) { CHECK_EQUAL(0,RefCounter::s_instances); { array_ptr a(new RefCounter[20]); CHECK_EQUAL(20,RefCounter::s_instances); } CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayAssignZeroForDeletion) { CHECK_EQUAL(0,RefCounter::s_instances); array_ptr a = new RefCounter[20]; CHECK_EQUAL(20,RefCounter::s_instances); a = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,AssignNewPointerForDeletion) { CHECK_EQUAL(0,RefCounter::s_instances); ptr a = new RefCounter; CHECK_EQUAL(1,RefCounter::s_instances); a = new RefCounter; CHECK_EQUAL(1,RefCounter::s_instances); a = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayAssignNewPointerForDeletion) { CHECK_EQUAL(0,RefCounter::s_instances); array_ptr a = new RefCounter[37]; CHECK_EQUAL(37,RefCounter::s_instances); a = new RefCounter[10]; CHECK_EQUAL(10,RefCounter::s_instances); a = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,CopyToAnotherSmartPointer) { CHECK_EQUAL(0,RefCounter::s_instances); ptr a = new RefCounter; CHECK_EQUAL(1,RefCounter::s_instances); ptr b(a); CHECK_EQUAL(1,RefCounter::s_instances); a = 0; CHECK_EQUAL(1,RefCounter::s_instances); b = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayCopyToAnotherSmartPointer) { CHECK_EQUAL(0,RefCounter::s_instances); array_ptr a = new RefCounter[3]; CHECK_EQUAL(3,RefCounter::s_instances); array_ptr b(a); CHECK_EQUAL(3,RefCounter::s_instances); a = 0; CHECK_EQUAL(3,RefCounter::s_instances); b = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,StlVector) { CHECK_EQUAL(0,RefCounter::s_instances); std::vector< ptr > va,vb; { { std::vector< ptr > vc; vc.push_back(new RefCounter); CHECK_EQUAL(1,RefCounter::s_instances); vc.push_back(new RefCounter); CHECK_EQUAL(2,RefCounter::s_instances); vc.push_back(new RefCounter); CHECK_EQUAL(3,RefCounter::s_instances); vb = vc; CHECK_EQUAL(3,RefCounter::s_instances); } CHECK_EQUAL(3,RefCounter::s_instances); va.push_back(vb[0]); CHECK_EQUAL(3,RefCounter::s_instances); vb.clear(); CHECK_EQUAL(1,RefCounter::s_instances); } CHECK_EQUAL(1,RefCounter::s_instances); va.clear(); CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayStlVector) { CHECK_EQUAL(0,RefCounter::s_instances); std::vector< array_ptr > va,vb; { { std::vector< array_ptr > vc; vc.push_back(new RefCounter[5]); CHECK_EQUAL(5,RefCounter::s_instances); vc.push_back(new RefCounter[3]); CHECK_EQUAL(8,RefCounter::s_instances); vc.push_back(new RefCounter[7]); CHECK_EQUAL(15,RefCounter::s_instances); vb = vc; CHECK_EQUAL(15,RefCounter::s_instances); } CHECK_EQUAL(15,RefCounter::s_instances); va.push_back(vb[0]); CHECK_EQUAL(15,RefCounter::s_instances); vb.clear(); CHECK_EQUAL(5,RefCounter::s_instances); } CHECK_EQUAL(5,RefCounter::s_instances); va.clear(); CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,StlList) { CHECK_EQUAL(0,RefCounter::s_instances); std::list< ptr > la,lb; { { std::list< ptr > lc; lc.push_back(new RefCounter); CHECK_EQUAL(1,RefCounter::s_instances); lc.push_back(new RefCounter); CHECK_EQUAL(2,RefCounter::s_instances); lc.push_back(new RefCounter); CHECK_EQUAL(3,RefCounter::s_instances); lb = lc; CHECK_EQUAL(3,RefCounter::s_instances); } CHECK_EQUAL(3,RefCounter::s_instances); la.push_back(lb.front()); CHECK_EQUAL(3,RefCounter::s_instances); lb.clear(); CHECK_EQUAL(1,RefCounter::s_instances); } CHECK_EQUAL(1,RefCounter::s_instances); la.clear(); CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayStlList) { CHECK_EQUAL(0,RefCounter::s_instances); std::list< array_ptr > la,lb; { { std::list< array_ptr > lc; lc.push_back(new RefCounter[7]); CHECK_EQUAL(7,RefCounter::s_instances); lc.push_back(new RefCounter[8]); CHECK_EQUAL(15,RefCounter::s_instances); lc.push_back(new RefCounter[80]); CHECK_EQUAL(95,RefCounter::s_instances); lb = lc; CHECK_EQUAL(95,RefCounter::s_instances); } CHECK_EQUAL(95,RefCounter::s_instances); la.push_back(lb.front()); CHECK_EQUAL(95,RefCounter::s_instances); lb.clear(); CHECK_EQUAL(7,RefCounter::s_instances); } CHECK_EQUAL(7,RefCounter::s_instances); la.clear(); CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,EqualityOperators) { CHECK_EQUAL(0,RefCounter::s_instances); RefCounter* xa = new RefCounter; RefCounter* xb = new RefCounter; ptr pa,pb; if ( xa < xb ) { pa = xa; pb = xb; } else { pa = xb; pb = xa; } CHECK_EQUAL(2,RefCounter::s_instances); CHECK(papa); CHECK(pa<=pa); CHECK(pb>=pb); CHECK(pa<=pa); CHECK(pb>=pb); CHECK(pa==pa); CHECK(pb==pb); CHECK(pa!=pb); pa = 0; CHECK_EQUAL(1,RefCounter::s_instances); pb = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayEqualityOperators) { CHECK_EQUAL(0,RefCounter::s_instances); RefCounter* xa = new RefCounter[4]; RefCounter* xb = new RefCounter[6]; array_ptr pa,pb; if ( xa < xb ) { pa = xa; pb = xb; } else { pa = xb; pb = xa; } CHECK_EQUAL(10,RefCounter::s_instances); CHECK(papa); CHECK(pa<=pa); CHECK(pb>=pb); CHECK(pa<=pa); CHECK(pb>=pb); CHECK(pa==pa); CHECK(pb==pb); CHECK(pa!=pb); pa = 0; CHECK_EQUAL(6,RefCounter::s_instances); pb = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,AccessPointer) { CHECK_EQUAL(0,RefCounter::s_instances); ptr a = new RefCounter; CHECK_EQUAL(1,RefCounter::s_instances); CHECK_EQUAL(5,(*a).Get(5)); CHECK_EQUAL(5,a->Get(5)); a = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayAccessPointer) { CHECK_EQUAL(0,RefCounter::s_instances); array_ptr a = new RefCounter[6]; CHECK_EQUAL(6,RefCounter::s_instances); CHECK_EQUAL(5,(*a).Get(5)); CHECK_EQUAL(5,a->Get(5)); CHECK_EQUAL(5,a[0].Get(5)); a = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,BasicInheritance) { CHECK_EQUAL(0,RefCounter::s_instances); ptr a = new RefCounterDerived; CHECK_EQUAL(1,RefCounter::s_instances); CHECK_EQUAL(10,(*a).Get(5)); CHECK_EQUAL(10,a->Get(5)); a = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayBasicInheritance) { CHECK_EQUAL(0,RefCounter::s_instances); array_ptr a = new RefCounterDerived[2]; CHECK_EQUAL(2,RefCounter::s_instances); CHECK_EQUAL(10,(*a).Get(5)); CHECK_EQUAL(10,a->Get(5)); a = 0; CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ListOfBasePointers) { CHECK_EQUAL(0,RefCounter::s_instances); std::vector< ptr > v; v.push_back(new RefCounter); CHECK_EQUAL(1,RefCounter::s_instances); v.push_back(new RefCounterDerived); CHECK_EQUAL(2,RefCounter::s_instances); v.clear(); CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayListOfBasePointers) { CHECK_EQUAL(0,RefCounter::s_instances); std::vector< array_ptr > v; v.push_back(new RefCounter[5]); CHECK_EQUAL(5,RefCounter::s_instances); v.push_back(new RefCounterDerived[2]); CHECK_EQUAL(7,RefCounter::s_instances); v.clear(); CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,CopyInvalidPointers) { CHECK_EQUAL(0,RefCounter::s_instances); ptr a; CHECK_EQUAL(0,RefCounter::s_instances); CHECK(!a.valid()); ptr b(a); CHECK(!a.valid()); CHECK(!b.valid()); CHECK_EQUAL(0,RefCounter::s_instances); b = new RefCounter; CHECK(!a.valid()); CHECK(b.valid()); CHECK_EQUAL(1,RefCounter::s_instances); b = a; CHECK(!a.valid()); CHECK(!b.valid()); CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayCopyInvalidPointers) { CHECK_EQUAL(0,RefCounter::s_instances); array_ptr a; CHECK_EQUAL(0,RefCounter::s_instances); CHECK(!a.valid()); array_ptr b(a); CHECK(!a.valid()); CHECK(!b.valid()); CHECK_EQUAL(0,RefCounter::s_instances); b = new RefCounter[3]; CHECK(!a.valid()); CHECK(b.valid()); CHECK_EQUAL(3,RefCounter::s_instances); b = a; CHECK(!a.valid()); CHECK(!b.valid()); CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,BoolValidityCheck) { CHECK_EQUAL(0,RefCounter::s_instances); { ptr a, b(new RefCounter), c; CHECK_EQUAL(1,RefCounter::s_instances); CHECK(!a); CHECK(!a.valid()); CHECK(!c); CHECK(!c.valid()); CHECK(b); CHECK(b.valid()); CHECK(a || b || c); a = b; CHECK_EQUAL(1,RefCounter::s_instances); CHECK(a); CHECK(a.valid()); CHECK(b); CHECK(b.valid()); CHECK(a || b); CHECK(a && b); b = 0; CHECK_EQUAL(1,RefCounter::s_instances); CHECK(a); CHECK(a.valid()); CHECK(!b); CHECK(!b.valid()); c = new RefCounterDerived; CHECK_EQUAL(2,RefCounter::s_instances); CHECK(c); CHECK(c.valid()); } CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayBoolValidityCheck) { CHECK_EQUAL(0,RefCounter::s_instances); { array_ptr a, b(new RefCounter[1]), c; CHECK_EQUAL(1,RefCounter::s_instances); CHECK(!a); CHECK(!a.valid()); CHECK(!c); CHECK(!c.valid()); CHECK(b); CHECK(b.valid()); CHECK(a || b || c); a = b; CHECK_EQUAL(1,RefCounter::s_instances); CHECK(a); CHECK(a.valid()); CHECK(b); CHECK(b.valid()); CHECK(a || b); CHECK(a && b); b = 0; CHECK_EQUAL(1,RefCounter::s_instances); CHECK(a); CHECK(a.valid()); CHECK(!b); CHECK(!b.valid()); c = new RefCounterDerived[1]; CHECK_EQUAL(2,RefCounter::s_instances); CHECK(c); CHECK(c.valid()); } CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,MapMadness) { CHECK_EQUAL(0,RefCounter::s_instances); { std::map< ptr, ptr > m,m1,m2,m3,m4; CHECK_EQUAL(0,RefCounter::s_instances); for (int i=0;i<1000;++i) { m[ new RefCounter ] = new RefCounterDerived; CHECK_EQUAL((i+1)*2,RefCounter::s_instances); } m1 = m2 = m3 = m4 = m; CHECK_EQUAL(2000,RefCounter::s_instances); m.clear(); CHECK_EQUAL(2000,RefCounter::s_instances); m2.clear(); CHECK_EQUAL(2000,RefCounter::s_instances); m3.clear(); CHECK_EQUAL(2000,RefCounter::s_instances); m4.clear(); CHECK_EQUAL(2000,RefCounter::s_instances); } CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayMapMadness) { CHECK_EQUAL(0,RefCounter::s_instances); { std::map< array_ptr, array_ptr > m,m1,m2,m3,m4; CHECK_EQUAL(0,RefCounter::s_instances); for (int i=0;i<1000;++i) { m[ new RefCounter[2] ] = new RefCounterDerived[2]; CHECK_EQUAL((i+1)*4,RefCounter::s_instances); } m1 = m2 = m3 = m4 = m; CHECK_EQUAL(4000,RefCounter::s_instances); m.clear(); CHECK_EQUAL(4000,RefCounter::s_instances); m2.clear(); CHECK_EQUAL(4000,RefCounter::s_instances); m3.clear(); CHECK_EQUAL(4000,RefCounter::s_instances); m4.clear(); CHECK_EQUAL(4000,RefCounter::s_instances); } CHECK_EQUAL(0,RefCounter::s_instances); } /////////////////////////////////// TEST_FIXTURE(InstanceFixture,ArrayIndexing) { int* p = new int[10]; for (int i=0;i<10;++i) { p[i] = i; } array_ptr q = p; for (int i=0;i<10;++i) { CHECK_EQUAL(i,q[i]); CHECK_EQUAL(&(p[i]),&(q[i])); } } /////////////////////////////////// int main(int argc, char** argv) { return UnitTest::RunAllTests(); }