Orthodox.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifndef CPPUNIT_ORTHODOX_H
  2. #define CPPUNIT_ORTHODOX_H
  3. #ifndef CPPUNIT_TESTCASE_H
  4. #include "TestCase.h"
  5. #endif
  6. /*
  7.  * Orthodox performs a simple set of tests on an arbitary
  8.  * class to make sure that it supports at least the
  9.  * following operations:
  10.  *
  11.  *      default construction    - constructor
  12.  *      equality/inequality     - operator== && operator!=
  13.  *      assignment              - operator=
  14.  *      negation                - operator!
  15.  *      safe passage            - copy construction
  16.  *
  17.  * If operations for each of these are not declared
  18.  * the template will not instantiate.  If it does 
  19.  * instantiate, tests are performed to make sure
  20.  * that the operations have correct semantics.
  21.  *      
  22.  * Adding an orthodox test to a suite is very 
  23.  * easy: 
  24.  * 
  25.  * public: Test *suite ()  {
  26.  *     TestSuite *suiteOfTests = new TestSuite;
  27.  *     suiteOfTests->addTest (new ComplexNumberTest ("testAdd");
  28.  *     suiteOfTests->addTest (new TestCaller<Orthodox<Complex> > ());
  29.  *     return suiteOfTests;
  30.  *  }
  31.  *
  32.  * Templated test cases be very useful when you are want to
  33.  * make sure that a group of classes have the same form.
  34.  *
  35.  * see TestSuite
  36.  */
  37. template <class ClassUnderTest> class Orthodox : public TestCase
  38. {
  39. public:
  40.                     Orthodox () : TestCase ("Orthodox") {}
  41. protected:
  42.     ClassUnderTest  call (ClassUnderTest object);
  43.     void            runTest ();
  44. };
  45. // Run an orthodoxy test
  46. template <class ClassUnderTest> void Orthodox<ClassUnderTest>::runTest ()
  47. {
  48.     // make sure we have a default constructor
  49.     ClassUnderTest   a, b, c;
  50.     // make sure we have an equality operator
  51.     assert (a == b);
  52.     // check the inverse
  53.     b.operator= (a.operator! ());
  54.     assert (a != b);
  55.     // double inversion
  56.     b = !!a;
  57.     assert (a == b);
  58.     // invert again
  59.     b = !a;
  60.     // check calls
  61.     c = a;
  62.     assert (c == call (a));
  63.     c = b;
  64.     assert (c == call (b));
  65. }
  66. // Exercise a call
  67. template <class ClassUnderTest> ClassUnderTest Orthodox<ClassUnderTest>::call (ClassUnderTest object)
  68. {
  69.     return object;
  70. }
  71. #endif