Blame include/cppunit/extensions/Orthodox.h

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