1 //
2 // TestCase.cpp
3 //
4
5
6 #include <stdexcept>
7 #include <math.h>
8 #include "CppUnit/TestCase.h"
9 #include "CppUnit/TestResult.h"
10 #include "CppUnit/estring.h"
11 #include <typeinfo>
12 #include <iostream>
13
14
15 using namespace std;
16
17
18 namespace CppUnit {
19
20
21 // Create a default TestResult
defaultResult()22 TestResult* TestCase::defaultResult()
23 {
24 return new TestResult;
25 }
26
27
28 // Check for a failed general assertion
assertImplementation(bool condition,const std::string & conditionExpression,long lineNumber,const std::string & fileName)29 void TestCase::assertImplementation(bool condition, const std::string& conditionExpression, long lineNumber, const std::string& fileName)
30 {
31 if (!condition)
32 throw CppUnitException(conditionExpression, lineNumber, fileName);
33 }
34
35
loop1assertImplementation(bool condition,const std::string & conditionExpression,long lineNumber,long data1lineNumber,const std::string & fileName)36 void TestCase::loop1assertImplementation(bool condition, const std::string& conditionExpression, long lineNumber, long data1lineNumber, const std::string& fileName)
37 {
38 if (!condition)
39 throw CppUnitException(conditionExpression, lineNumber, data1lineNumber, fileName);
40 }
41
42
loop2assertImplementation(bool condition,const std::string & conditionExpression,long lineNumber,long data1lineNumber,long data2lineNumber,const std::string & fileName)43 void TestCase::loop2assertImplementation(bool condition, const std::string& conditionExpression, long lineNumber, long data1lineNumber, long data2lineNumber, const std::string& fileName)
44 {
45 if (!condition)
46 throw CppUnitException(conditionExpression, lineNumber, data1lineNumber, data2lineNumber, fileName);
47 }
48
49
50 // Check for a failed equality assertion
assertEquals(long expected,long actual,long lineNumber,const std::string & fileName)51 void TestCase::assertEquals(long expected, long actual, long lineNumber, const std::string& fileName)
52 {
53 if (expected != actual)
54 assertImplementation(false, notEqualsMessage(expected, actual), lineNumber, fileName);
55 }
56
57
58 // Check for a failed equality assertion
assertEquals(double expected,double actual,double delta,long lineNumber,const std::string & fileName)59 void TestCase::assertEquals(double expected, double actual, double delta, long lineNumber, const std::string& fileName)
60 {
61 if (fabs(expected - actual) > delta)
62 assertImplementation(false, notEqualsMessage(expected, actual), lineNumber, fileName);
63 }
64
65
66 // Check for a failed equality assertion
assertEquals(const void * expected,const void * actual,long lineNumber,const std::string & fileName)67 void TestCase::assertEquals(const void* expected, const void* actual, long lineNumber, const std::string& fileName)
68 {
69 if (expected != actual)
70 assertImplementation(false, notEqualsMessage(expected, actual), lineNumber, fileName);
71 }
72
73
74 // Check for a failed equality assertion
assertEquals(const std::string & expected,const std::string & actual,long lineNumber,const std::string & fileName)75 void TestCase::assertEquals(const std::string& expected, const std::string& actual, long lineNumber, const std::string& fileName)
76 {
77 if (expected != actual)
78 assertImplementation(false, notEqualsMessage(expected, actual), lineNumber, fileName);
79 }
80
81
assertNotNull(const void * pointer,const std::string & pointerExpression,long lineNumber,const std::string & fileName)82 void TestCase::assertNotNull(const void* pointer, const std::string& pointerExpression, long lineNumber, const std::string& fileName)
83 {
84 if (pointer == NULL)
85 throw CppUnitException(pointerExpression + " must not be NULL", lineNumber, fileName);
86 }
87
88
assertNull(const void * pointer,const std::string & pointerExpression,long lineNumber,const std::string & fileName)89 void TestCase::assertNull(const void* pointer, const std::string& pointerExpression, long lineNumber, const std::string& fileName)
90 {
91 if (pointer != NULL)
92 throw CppUnitException(pointerExpression + " must be NULL", lineNumber, fileName);
93 }
94
95
fail(const std::string & message,long lineNumber,const std::string & fileName)96 void TestCase::fail(const std::string& message, long lineNumber, const std::string& fileName)
97 {
98 throw CppUnitException(std::string("fail: ") + message, lineNumber, fileName);
99 }
100
101
warn(const std::string & message,long lineNumber,const std::string & fileName)102 void TestCase::warn(const std::string& message, long lineNumber, const std::string& fileName)
103 {
104 std::cout << "Warning [" << fileName << ':' << lineNumber << "]: " << message << std::endl;
105 }
106
107
108 // Run the test and catch any exceptions that are triggered by it
run(TestResult * result)109 void TestCase::run(TestResult *result)
110 {
111 result->startTest(this);
112
113 setUp();
114 try
115 {
116 runTest();
117 }
118 catch (CppUnitException& e)
119 {
120 CppUnitException* copy = new CppUnitException(e);
121 result->addFailure(this, copy);
122 }
123 catch (std::exception& e)
124 {
125 std::string msg(typeid(e).name());
126 msg.append(": ");
127 msg.append(e.what());
128 result->addError(this, new CppUnitException(msg));
129
130 }
131 catch (...)
132 {
133 CppUnitException *e = new CppUnitException ("unknown exception");
134 result->addError (this, e);
135 }
136 tearDown ();
137 result->endTest(this);
138 }
139
140
141 // A default run method
run()142 TestResult* TestCase::run()
143 {
144 TestResult* result = defaultResult();
145
146 run(result);
147 return result;
148 }
149
150
151 // All the work for runTest is deferred to subclasses
runTest()152 void TestCase::runTest()
153 {
154 }
155
156
157 // Build a message about a failed equality check
notEqualsMessage(long expected,long actual)158 std::string TestCase::notEqualsMessage(long expected, long actual)
159 {
160 return "expected: " + estring(expected) + " but was: " + estring(actual);
161 }
162
163
164 // Build a message about a failed equality check
notEqualsMessage(double expected,double actual)165 std::string TestCase::notEqualsMessage(double expected, double actual)
166 {
167 return "expected: " + estring(expected) + " but was: " + estring(actual);
168 }
169
170
171 // Build a message about a failed equality check
notEqualsMessage(const void * expected,const void * actual)172 std::string TestCase::notEqualsMessage(const void* expected, const void* actual)
173 {
174 return "expected: " + estring(expected) + " but was: " + estring(actual);
175 }
176
177
178 // Build a message about a failed equality check
notEqualsMessage(const std::string & expected,const std::string & actual)179 std::string TestCase::notEqualsMessage(const std::string& expected, const std::string& actual)
180 {
181 return "expected: \"" + expected + "\" but was: \"" + actual + "\"";
182 }
183
184
185 } // namespace CppUnit
186