|
Packit |
8c9aa0 |
#ifndef CPPUNIT_EXTENSIONS_ORTHODOX_H
|
|
Packit |
8c9aa0 |
#define CPPUNIT_EXTENSIONS_ORTHODOX_H
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
#include <cppunit/TestCase.h>
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_BEGIN
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/*
|
|
Packit |
8c9aa0 |
* Orthodox performs a simple set of tests on an arbitary
|
|
Packit |
8c9aa0 |
* class to make sure that it supports at least the
|
|
Packit |
8c9aa0 |
* following operations:
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* default construction - constructor
|
|
Packit |
8c9aa0 |
* equality/inequality - operator== && operator!=
|
|
Packit |
8c9aa0 |
* assignment - operator=
|
|
Packit |
8c9aa0 |
* negation - operator!
|
|
Packit |
8c9aa0 |
* safe passage - copy construction
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* If operations for each of these are not declared
|
|
Packit |
8c9aa0 |
* the template will not instantiate. If it does
|
|
Packit |
8c9aa0 |
* instantiate, tests are performed to make sure
|
|
Packit |
8c9aa0 |
* that the operations have correct semantics.
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* Adding an orthodox test to a suite is very
|
|
Packit |
8c9aa0 |
* easy:
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* public: Test *suite () {
|
|
Packit |
8c9aa0 |
* TestSuite *suiteOfTests = new TestSuite;
|
|
Packit |
8c9aa0 |
* suiteOfTests->addTest (new ComplexNumberTest ("testAdd");
|
|
Packit |
8c9aa0 |
* suiteOfTests->addTest (new TestCaller<Orthodox<Complex> > ());
|
|
Packit |
8c9aa0 |
* return suiteOfTests;
|
|
Packit |
8c9aa0 |
* }
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* Templated test cases be very useful when you are want to
|
|
Packit |
8c9aa0 |
* make sure that a group of classes have the same form.
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* see TestSuite
|
|
Packit |
8c9aa0 |
*/
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
template <class ClassUnderTest> class Orthodox : public TestCase
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
public:
|
|
Packit |
8c9aa0 |
Orthodox () : TestCase ("Orthodox") {}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
protected:
|
|
Packit |
8c9aa0 |
ClassUnderTest call (ClassUnderTest object);
|
|
Packit |
8c9aa0 |
void runTest ();
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
};
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
// Run an orthodoxy test
|
|
Packit |
8c9aa0 |
template <class ClassUnderTest> void Orthodox<ClassUnderTest>::runTest ()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
// make sure we have a default constructor
|
|
Packit |
8c9aa0 |
ClassUnderTest a, b, c;
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
// make sure we have an equality operator
|
|
Packit |
8c9aa0 |
CPPUNIT_ASSERT (a == b);
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
// check the inverse
|
|
Packit |
8c9aa0 |
b.operator= (a.operator! ());
|
|
Packit |
8c9aa0 |
CPPUNIT_ASSERT (a != b);
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
// double inversion
|
|
Packit |
8c9aa0 |
b = !!a;
|
|
Packit |
8c9aa0 |
CPPUNIT_ASSERT (a == b);
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
// invert again
|
|
Packit |
8c9aa0 |
b = !a;
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
// check calls
|
|
Packit |
8c9aa0 |
c = a;
|
|
Packit |
8c9aa0 |
CPPUNIT_ASSERT (c == call (a));
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
c = b;
|
|
Packit |
8c9aa0 |
CPPUNIT_ASSERT (c == call (b));
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
// Exercise a call
|
|
Packit |
8c9aa0 |
template <class ClassUnderTest>
|
|
Packit |
8c9aa0 |
ClassUnderTest Orthodox<ClassUnderTest>::call (ClassUnderTest object)
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return object;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_END
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
#endif
|