NetBurner 3.1
Utest.h
1 /*
2  * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the <organization> nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE EARLIER MENTIONED AUTHORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 // This file contains the Test class along with the macros which make effective
29 // in the harness.
30 
31 #ifndef D_UTest_h
32 #define D_UTest_h
33 
34 #include "SimpleString.h"
35 
36 class TestResult;
37 class TestPlugin;
38 class TestFailure;
39 class TestFilter;
40 class TestTerminator;
41 
42 extern bool doubles_equal(double d1, double d2, double threshold);
43 
45 
46 class UtestShell;
47 
48 class Utest
49 {
50 public:
51  Utest();
52  virtual ~Utest();
53  virtual void run();
54 
55  virtual void setup();
56  virtual void teardown();
57  virtual void testBody();
58 };
59 
61 
62 class TestTerminator
63 {
64 public:
65  virtual void exitCurrentTest() const=0;
66  virtual ~TestTerminator();
67 };
68 
69 class NormalTestTerminator : public TestTerminator
70 {
71 public:
72  virtual void exitCurrentTest() const _override;
73  virtual ~NormalTestTerminator();
74 };
75 
76 class TestTerminatorWithoutExceptions : public TestTerminator
77 {
78 public:
79  virtual void exitCurrentTest() const _override;
80  virtual ~TestTerminatorWithoutExceptions();
81 };
82 
84 
85 class UtestShell
86 {
87 public:
88  static UtestShell *getCurrent();
89 
90 public:
91  UtestShell(const char* groupName, const char* testName, const char* fileName, int lineNumber);
92  virtual ~UtestShell();
93 
94  virtual UtestShell* addTest(UtestShell* test);
95  virtual UtestShell *getNext() const;
96  virtual int countTests();
97 
98  bool shouldRun(const TestFilter* groupFilters, const TestFilter* nameFilters) const;
99  const SimpleString getName() const;
100  const SimpleString getGroup() const;
101  virtual SimpleString getFormattedName() const;
102  const SimpleString getFile() const;
103  int getLineNumber() const;
104  virtual bool willRun() const;
105  virtual bool hasFailed() const;
106  void countCheck();
107 
108  virtual void assertTrue(bool condition, const char *checkString, const char *conditionString, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
109  virtual void assertCstrEqual(const char *expected, const char *actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
110  virtual void assertCstrNEqual(const char *expected, const char *actual, size_t length, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
111  virtual void assertCstrNoCaseEqual(const char *expected, const char *actual, const char* text, const char *fileName, int lineNumber);
112  virtual void assertCstrContains(const char *expected, const char *actual, const char* text, const char *fileName, int lineNumber);
113  virtual void assertCstrNoCaseContains(const char *expected, const char *actual, const char* text, const char *fileName, int lineNumber);
114  virtual void assertLongsEqual(long expected, long actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
115  virtual void assertUnsignedLongsEqual(unsigned long expected, unsigned long actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
116  virtual void assertLongLongsEqual(cpputest_longlong expected, cpputest_longlong actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
117  virtual void assertUnsignedLongLongsEqual(cpputest_ulonglong expected, cpputest_ulonglong actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
118  virtual void assertSignedBytesEqual(signed char expected, signed char actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
119  virtual void assertPointersEqual(const void *expected, const void *actual, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
120  virtual void assertFunctionPointersEqual(void (*expected)(), void (*actual)(), const char* text, const char* fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
121  virtual void assertDoublesEqual(double expected, double actual, double threshold, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
122  virtual void assertEquals(bool failed, const char* expected, const char* actual, const char* text, const char* file, int line, const TestTerminator& testTerminator = NormalTestTerminator());
123  virtual void assertBinaryEqual(const void *expected, const void *actual, size_t length, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
124  virtual void assertBitsEqual(unsigned long expected, unsigned long actual, unsigned long mask, size_t byteCount, const char* text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
125  virtual void fail(const char *text, const char *fileName, int lineNumber, const TestTerminator& testTerminator = NormalTestTerminator());
126  virtual void exitTest(const TestTerminator& testTerminator = NormalTestTerminator());
127 
128  virtual void print(const char *text, const char *fileName, int lineNumber);
129  virtual void print(const SimpleString & text, const char *fileName, int lineNumber);
130 
131  void setFileName(const char *fileName);
132  void setLineNumber(int lineNumber);
133  void setGroupName(const char *groupName);
134  void setTestName(const char *testName);
135 
136  static void crash();
137  static void setCrashMethod(void (*crashme)());
138  static void resetCrashMethod();
139 
140  virtual bool isRunInSeperateProcess() const;
141  virtual void setRunInSeperateProcess();
142 
143  virtual void setRunIgnored();
144 
145  virtual Utest* createTest();
146  virtual void destroyTest(Utest* test);
147 
148  virtual void runOneTest(TestPlugin* plugin, TestResult& result);
149  virtual void runOneTestInCurrentProcess(TestPlugin *plugin, TestResult & result);
150 
151  virtual void failWith(const TestFailure& failure);
152  virtual void failWith(const TestFailure& failure, const TestTerminator& terminator);
153 
154 protected:
155  UtestShell();
156  UtestShell(const char *groupName, const char *testName, const char *fileName, int lineNumber, UtestShell *nextTest);
157 
158  virtual SimpleString getMacroName() const;
159  TestResult *getTestResult();
160 private:
161  const char *group_;
162  const char *name_;
163  const char *file_;
164  int lineNumber_;
165  UtestShell *next_;
166  bool isRunAsSeperateProcess_;
167  bool hasFailed_;
168 
169  void setTestResult(TestResult* result);
170  void setCurrentTest(UtestShell* test);
171  bool match(const char* target, const TestFilter* filters) const;
172 
173  static UtestShell* currentTest_;
174  static TestResult* testResult_;
175 
176 };
177 
178 
179 
181 
182 class ExecFunctionTestShell;
183 
184 class ExecFunctionTest : public Utest
185 {
186 public:
187  ExecFunctionTest(ExecFunctionTestShell* shell);
188  void testBody() _override;
189  virtual void setup() _override;
190  virtual void teardown() _override;
191 private:
192  ExecFunctionTestShell* shell_;
193 };
194 
196 
197 class ExecFunctionTestShell: public UtestShell
198 {
199 public:
200  void (*setup_)();
201  void (*teardown_)();
202  void (*testFunction_)();
203 
204  ExecFunctionTestShell(void(*set)() = 0, void(*tear)() = 0) :
205  UtestShell("Generic", "Generic", "Generic", 1), setup_(set), teardown_(
206  tear), testFunction_(0)
207  {
208  }
209  Utest* createTest() { return new ExecFunctionTest(this); }
210  virtual ~ExecFunctionTestShell();
211 };
212 
214 
215 class CppUTestFailedException
216 {
217 public:
218  int dummy_;
219 };
220 
222 
223 class IgnoredUtestShell : public UtestShell
224 {
225 public:
226  IgnoredUtestShell();
227  virtual ~IgnoredUtestShell();
228  explicit IgnoredUtestShell(const char* groupName, const char* testName,
229  const char* fileName, int lineNumber);
230  virtual bool willRun() const _override;
231  virtual void setRunIgnored() _override;
232 protected:
233  virtual SimpleString getMacroName() const _override;
234  virtual void runOneTest(TestPlugin* plugin, TestResult& result) _override;
235 private:
236 
237  IgnoredUtestShell(const IgnoredUtestShell&);
238  IgnoredUtestShell& operator=(const IgnoredUtestShell&);
239 
240  bool runIgnored_;
241 
242 };
243 
245 
246 class TestInstaller
247 {
248 public:
249  explicit TestInstaller(UtestShell& shell, const char* groupName, const char* testName,
250  const char* fileName, int lineNumber);
251  virtual ~TestInstaller();
252 
253  void unDo();
254 
255 private:
256 
257  TestInstaller(const TestInstaller&);
258  TestInstaller& operator=(const TestInstaller&);
259 
260 };
261 
262 #endif