/** @file
$Id$
$Date$
$Author$
@copy © Marc Wäckerlin
@license LGPL, see file COPYING
$Log$
Revision 1.1 2004/08/28 16:13:42 marc
mrw-c++-0.92 (mrw)
- new file: version.cxx
- new file header for all sources
- work around warning in mrw::auto
- possibility to compile without log4cxx
- work around bugs in demangle.h and libiberty.h
- corrections in documentation
- added simple tracing mechanism
- more warnings
- small corrections in Auto<>::Free and a new test for it
- possibility to compile without stack trace
*/
#include
#include
#include
#include
#include
#include
#include
#include
class Content {
private:
int& _drop;
Content();
public:
Content(int& drop): _drop(drop) {}
virtual ~Content() {++_drop;}
};
class A: public Content {
public:
A(int& d): Content(d) {}
virtual ~A() {}
virtual void fn() {}
};
class B: public A {public: B(int& d): A(d) {}};
class C: public A {public: C(int& d): A(d) {}};
class SmartPointerTest:
public mrw::SmartPointerParent, public CppUnit::TestFixture {
public:
void SimpleConstructor() {
mrw::SmartPointer p1;
CPPUNIT_ASSERT(!(getPointer(p1) || getCounter(p1)));
}
void CopyConstructor() {
mrw::SmartPointer p1;
mrw::SmartPointer p2(p1);
CPPUNIT_ASSERT(!(getPointer(p1) || getCounter(p1) ||
getPointer(p2) || getCounter(p2)));
}
void PointerConstructor() {
int drops(0);
mrw::SmartPointer p1(0);
mrw::SmartPointer p2(new Content(drops));
CPPUNIT_ASSERT(!(getPointer(p1) || getCounter(p1) ||
drops!=0 || !getPointer(p2) || !getCounter(p2) ||
getCounter(p2)->get()!=1));
}
void CastConstructor() {
int drops1(0);
mrw::SmartPointer pa(new B(drops1));
mrw::SmartPointer pb(pa);
mrw::SmartPointer pc(pa);
mrw::SmartPointer pa2(pb);
CPPUNIT_ASSERT(!(drops1!=0 || !getPointer(pa) || !getCounter(pa) ||
getPointer(pb)!=getPointer(pa) ||
getCounter(pb)!=getCounter(pa) ||
getPointer(pc) || getCounter(pc) ||
getCounter(pa)->get()!=3 ||
getPointer(pa2)!=getPointer(pa) ||
getCounter(pa2)!=getCounter(pa)));
}
void Destructor() {
int drops(0);
mrw::SmartPointer* p1 =
new mrw::SmartPointer(new Content(drops));
delete p1;
CPPUNIT_ASSERT(!(drops!=1));
}
void CopyAssign() {
int drops1(0);
int drops2(0);
mrw::SmartPointer p1(new Content(drops1));
mrw::SmartPointer p2(new Content(drops2));
p2 = p1;
p1 = p2;
CPPUNIT_ASSERT(!(drops1!=0 || !getPointer(p1) || !getCounter(p1) ||
getCounter(p1)->get()!=2 ||
getPointer(p1)!=getPointer(p2) ||
drops2!=1 || !getPointer(p2) || !getCounter(p2) ||
getCounter(p2)->get()!=2 ||
getCounter(p1)!=getCounter(p2)));
}
void PointerAssign() {
int drops1(0);
int drops2(0);
int drops3(0);
mrw::SmartPointer p1(new Content(drops1));
mrw::SmartPointer p2(0);
p1 = new Content(drops2);
p1 = 0;
p2 = new Content(drops3);
CPPUNIT_ASSERT(!(drops1!=1 || getPointer(p1) || getCounter(p1) ||
drops2!=1 || !getPointer(p2) || !getCounter(p2) ||
drops3!=0 || getCounter(p2)->get()!=1));
}
void CastAssign() {
int drops1(0);
int drops2(0);
int drops3(0);
mrw::SmartPointer pa(new B(drops1));
mrw::SmartPointer pb(new B(drops2));
mrw::SmartPointer pc(new C(drops3));
pa = pa;
pa = pb;
pa = pc;
pb = pa;
pc = pa;
CPPUNIT_ASSERT(!(drops1!=1 || drops2!=1 || drops3!=0 ||
!getPointer(pa) || getPointer(pa)!=getPointer(pc) ||
!getCounter(pa) || getCounter(pa)!=getCounter(pc) ||
getCounter(pa)->get()!=2 || getPointer(pb) ||
getCounter(pb)));
}
void PointerAccess() {
mrw::SmartPointer p1(new std::string);
mrw::SmartPointer p2;
*p1 = "Hallo Welt!";
CPPUNIT_ASSERT(!(p1.operator->()!=&*p1 || p1->find("Welt")!=6 ||
p2.operator->()));
}
void OperatorBool() {
mrw::SmartPointer p1(new std::string);
mrw::SmartPointer p2;
CPPUNIT_ASSERT(!(!p1 || p2));
}
CPPUNIT_TEST_SUITE(SmartPointerTest);
CPPUNIT_TEST(SimpleConstructor);
CPPUNIT_TEST(CopyConstructor);
CPPUNIT_TEST(PointerConstructor);
CPPUNIT_TEST(CastConstructor);
CPPUNIT_TEST(Destructor);
CPPUNIT_TEST(CopyAssign);
CPPUNIT_TEST(PointerAssign);
CPPUNIT_TEST(CastAssign);
CPPUNIT_TEST(PointerAccess);
CPPUNIT_TEST(OperatorBool);
CPPUNIT_TEST_SUITE_END();
};
CPPUNIT_TEST_SUITE_REGISTRATION(SmartPointerTest);
int main(int argc, char** argv) try {
std::ofstream ofs((*argv+std::string(".xml")).c_str());
CppUnit::TextUi::TestRunner runner;
runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs));
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
return runner.run() ? 0 : 1;
} catch (std::exception& e) {
std::cerr<<"***Exception: "<