summaryrefslogtreecommitdiff
path: root/include/cppunit/TestCase.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cppunit/TestCase.h')
-rw-r--r--include/cppunit/TestCase.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/include/cppunit/TestCase.h b/include/cppunit/TestCase.h
new file mode 100644
index 0000000..056159d
--- /dev/null
+++ b/include/cppunit/TestCase.h
@@ -0,0 +1,175 @@
+#ifndef CPPUNIT_TESTCASE_H
+#define CPPUNIT_TESTCASE_H
+
+#include <string>
+
+#ifndef CPPUNIT_TEST_H
+#include "Test.h"
+#endif
+
+#ifndef CPPUNIT_EXCEPTION_H
+#include "Exception.h"
+#endif
+
+namespace CppUnit {
+
+ class TestResult;
+
+ /**
+ * A test case defines the fixture to run multiple tests.
+ * To define a test case
+ * do the following:
+ * - implement a subclass of TestCase
+ * - the fixture is defined by instance variables
+ * - initialize the fixture state by overriding setUp
+ * (i.e. construct the instance variables of the fixture)
+ * - clean-up after a test by overriding tearDown.
+ *
+ * Each test runs in its own fixture so there
+ * can be no side effects among test runs.
+ * Here is an example:
+ *
+ * \code
+ * class MathTest : public TestCase {
+ * protected: int m_value1;
+ * protected: int m_value2;
+ *
+ * public: MathTest (string name)
+ * : TestCase (name) {
+ * }
+ *
+ * protected: void setUp () {
+ * m_value1 = 2;
+ * m_value2 = 3;
+ * }
+ * }
+ * \endcode
+ *
+ * For each test implement a method which interacts
+ * with the fixture. Verify the expected results with assertions specified
+ * by calling assert on the expression you want to test:
+ *
+ * \code
+ * protected: void testAdd () {
+ * int result = value1 + value2;
+ * assert (result == 5);
+ * }
+ * \endcode
+ *
+ * Once the methods are defined you can run them. To do this, use
+ * a TestCaller.
+ *
+ * \code
+ * Test *test = new TestCaller<MathTest>("testAdd", MathTest::testAdd);
+ * test->run ();
+ * \endcode
+ *
+ *
+ * The tests to be run can be collected into a TestSuite.
+ *
+ * \code
+ * public: static TestSuite *MathTest::suite () {
+ * TestSuite *suiteOfTests = new TestSuite;
+ * suiteOfTests->addTest(new TestCaller<MathTest>(
+ * "testAdd", testAdd));
+ * suiteOfTests->addTest(new TestCaller<MathTest>(
+ * "testDivideByZero", testDivideByZero));
+ * return suiteOfTests;
+ * }
+ * \endcode
+ *
+ *
+ * \see TestResult
+ * \see TestSuite
+ * \see TestCaller
+ *
+ */
+
+ class TestCase : public Test
+ {
+ public:
+ TestCase ();
+ TestCase (std::string Name);
+ ~TestCase ();
+
+ virtual void run (TestResult *result);
+ virtual TestResult *run ();
+ virtual int countTestCases () const;
+ std::string getName () const;
+ std::string toString () const;
+
+ virtual void setUp ();
+ virtual void tearDown ();
+
+ protected:
+ virtual void runTest ();
+
+ TestResult *defaultResult ();
+ void assertImplementation(
+ bool condition,
+ std::string conditionExpression = "",
+ long lineNumber = Exception::UNKNOWNLINENUMBER,
+ std::string fileName = Exception::UNKNOWNFILENAME);
+
+ void assertEquals (long expected,
+ long actual,
+ long lineNumber = Exception::UNKNOWNLINENUMBER,
+ std::string fileName = Exception::UNKNOWNFILENAME);
+
+ void assertEquals (double expected,
+ double actual,
+ double delta,
+ long lineNumber = Exception::UNKNOWNLINENUMBER,
+ std::string fileName = Exception::UNKNOWNFILENAME);
+
+ std::string notEqualsMessage (long expected,
+ long actual);
+
+ std::string notEqualsMessage (double expected,
+ double actual);
+
+ private:
+ TestCase (const TestCase& other);
+ TestCase& operator= (const TestCase& other);
+
+ private:
+ const std::string m_name;
+ };
+
+
+/** A set of macros which allow us to get the line number
+ * and file name at the point of an error.
+ * Just goes to show that preprocessors do have some
+ * redeeming qualities.
+ */
+#define CPPUNIT_SOURCEANNOTATION
+
+#ifdef CPPUNIT_SOURCEANNOTATION
+
+ #undef assert
+ #define assert(condition)\
+ (this->assertImplementation ((condition),(#condition),\
+ __LINE__, __FILE__))
+
+#else
+
+ #undef assert
+ #define assert(condition)\
+ (this->assertImplementation ((condition),"",\
+ __LINE__, __FILE__))
+
+#endif
+
+
+/// Macro for primitive value comparisons
+#define assertDoublesEqual(expected,actual,delta)\
+(this->assertEquals ((expected),\
+ (actual),(delta),__LINE__,__FILE__))
+
+/// Macro for primitive value comparisons
+#define assertLongsEqual(expected,actual)\
+(this->assertEquals ((expected),\
+ (actual),__LINE__,__FILE__))
+} // namespace CppUnit
+
+#endif // CPPUNIT_TESTCASE_H