]> git.wincent.com - WOTest.git/blob - WOTestMacros.h
Fix object-to-pointer comparisons on Leopard
[WOTest.git] / WOTestMacros.h
1 //
2 //  WOTestMacros.h
3 //  WOTest
4 //
5 //  Created by Wincent Colaiuta on 12 October 2004.
6 //
7 //  Copyright 2004-2007 Wincent Colaiuta.
8 //  This program is free software: you can redistribute it and/or modify
9 //  it under the terms of the GNU General Public License as published by
10 //  the Free Software Foundation, either version 3 of the License, or
11 //  (at your option) any later version.
12 //
13 //  This program is distributed in the hope that it will be useful,
14 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 //  GNU General Public License for more details.
17 //
18 //  You should have received a copy of the GNU General Public License
19 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 //
21
22 //! \file WOTestMacros.h
23
24 #pragma mark -
25 #pragma mark Special macros
26
27 // TODO: A headers only target so that I can build apps that want to include this header without actually building the framework
28
29 //! TODO: explain why this method is needed
30 //! \code
31 //!   @implemenation ExampleClass
32 //!   WO_TEST_NO_DEAD_STRIP_CLASS(ExampleClass);
33 //!   // remainder of class implementation
34 //! \endcode
35 //! \param class The class whose name should be protected from dead-code stripping
36 #define WO_TEST_NO_DEAD_STRIP_CLASS(class) __asm__ (".no_dead_strip .objc_class_name_" #class "\n");
37
38 #pragma mark -
39 #pragma mark Bootstrap macros for unit testing within applications
40
41 #define WO_TEST_CLASS_NAME                  @"WOTest"
42
43 #define WO_TEST_FRAMEWORK_NAME              @"WOTest.framework"
44
45 /*! Path to default install location for WOTest framework. */
46 #define WO_TEST_FRAMEWORK_INSTALL_PATH      @"/Library/Frameworks/" WO_TEST_FRAMEWORK_NAME
47
48 /*! Alternate path to install location for WOTest framework. */
49 #define WO_TEST_FRAMEWORK_ALT_INSTALL_PATH  @"~/Library/Frameworks/" WO_TEST_FRAMEWORK_NAME
50
51 #define WO_MISSING_WO_TEST_FRAMEWORK        "--run-unit-tests commandline option present but WOTest.framework missing\n"
52
53 /*! Exception thrown when a test explicitly expects a given class of object (such as NSString, NSArray or NSDictionary) but is passed an object of a different class. Subclasses of the expected class, as well as nil values, are acceptable and do not cause an exception to be thrown. */
54 #define WO_TEST_CLASS_MISMATCH_EXCEPTION    @"WOTestClassMismatchException"
55
56 //! Exception thrown when a nil parameter is passed to a test that disallows nil parameters.
57 #define WO_TEST_NIL_PARAMETER_EXCEPTION     @"WOTestNilParameterException"
58
59 /*! Exception thrown when the scalar expressions passed using one of the scalar test macros are of two different types. No casting is attempted when using the scalar test macros and all assume that the passed scalars will be of matching types. If casting (without exceptions) is the desired behaviour, perform the tests using the integer, unsigned, float or double test macros, which the compiler casts prior calling the underlying test method. (The behaviour of the scalar test macros is markedly different; because the type of the passed expressions cannot be known by the preprocessor, the macros cannot use any underlying test methods because they cannot know which method to call, and all test logic is therefore contained within the macro itself.) */
60 #define WO_TEST_TYPE_MISMATCH_EXCEPTION     @"WOTestTypeMismatchException"
61
62 /*! Exception thrown if there is a fatal error during the self-testing of WOTest itself (specifically, if there is a problem detected with the boolean test methods, which are fundamental because all other tests in the self-test depend on those methods. This exception should only occur if their is a programming error in WOTest. */
63 #define WO_TEST_SELF_TEST_FAILURE_EXCEPTION @"WOTestSelfTestFailureException"
64
65 /*! No memory error. */
66 #define WO_TEST_MEMORY_ERROR 1
67
68 #define WO_TEST_SHARED_INSTANCE     (WOTest *)[NSClassFromString(@"WOTest") sharedInstance]
69
70 #define WO_TEST_FRAMEWORK_IS_LOADED (WO_TEST_SHARED_INSTANCE ? YES : NO)
71
72 /*! For developers who do not wish to link against the WOTest framework but want to optionally load it at run time. */
73 #define WO_TEST_LOAD_FRAMEWORK                                                 \
74 do {                                                                           \
75     /* check if framework is already loaded */                                 \
76     if (WO_TEST_FRAMEWORK_IS_LOADED) break;                                    \
77                                                                                \
78     /* check if framework is in the current working directory */               \
79     NSString *currentWorkingDirectory =                                        \
80         [[[[NSProcessInfo processInfo] arguments] objectAtIndex:0]             \
81             stringByDeletingLastPathComponent];                                \
82                                                                                \
83     NSBundle *WOTestFrameworkBundle = [NSBundle bundleWithPath:                \
84         [currentWorkingDirectory stringByAppendingPathComponent:               \
85             WO_TEST_FRAMEWORK_NAME]];                                          \
86     if (WOTestFrameworkBundle && [WOTestFrameworkBundle load]) break;          \
87                                                                                \
88     /* check in the default install locations */                               \
89     WOTestFrameworkBundle =                                                    \
90         [NSBundle bundleWithPath:WO_TEST_FRAMEWORK_INSTALL_PATH];              \
91     if (WOTestFrameworkBundle && [WOTestFrameworkBundle load]) break;          \
92                                                                                \
93     WOTestFrameworkBundle = [NSBundle bundleWithPath:                          \
94             [WO_TEST_FRAMEWORK_ALT_INSTALL_PATH stringByStandardizingPath]];   \
95     if (WOTestFrameworkBundle && [WOTestFrameworkBundle load]) break;          \
96                                                                                \
97     /* check parent directory (WOTestRunner may be embedded) */                \
98     NSString *frameworkBundlePath =                                            \
99         [[[currentWorkingDirectory stringByDeletingLastPathComponent]          \
100             stringByDeletingLastPathComponent]                                 \
101             stringByDeletingLastPathComponent];                                \
102                                                                                \
103     if (frameworkBundlePath &&                                                 \
104         [[frameworkBundlePath lastPathComponent] isEqualToString:              \
105             WO_TEST_FRAMEWORK_NAME])                                           \
106     {                                                                          \
107         WOTestFrameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath]; \
108         if (WOTestFrameworkBundle && [WOTestFrameworkBundle load]) break;      \
109     }                                                                          \
110                                                                                \
111     fprintf(stderr, "error: could not load WOTest.framework bundle\n");        \
112 } while (0);
113  
114 #pragma mark -
115 #pragma mark Random value generator method macros
116
117 /*! \name Random value generator method macros
118 \startgroup */
119
120 #define WO_BIG_TEST_VALUE       1000000000
121 #define WO_TEST_VALUE           2000000
122 #define WO_SMALL_TEST_VALUE     70000
123
124 #define WO_RANDOMIZATION_RANGE  500
125
126 /*! \endgroup */
127
128 #pragma mark -
129 #pragma mark Unit test macros
130
131 #define WO_TEST_WRAPPER(test)                                                                   \
132 do {                                                                                            \
133     @try                                                                                        \
134     {                                                                                           \
135         (test);                                                                                 \
136     }                                                                                           \
137     @catch (id WOTestWrapperUncaughtException)                                                  \
138     {                                                                                           \
139         NSString *info = [NSString stringWithFormat:@"%@ (%@)",                                 \
140             [NSException WOTest_nameForException:WOTestWrapperUncaughtException],               \
141             [NSException WOTest_descriptionForException:WOTestWrapperUncaughtException]];       \
142         [WO_TEST_SHARED_INSTANCE writeUncaughtException:info inFile:__FILE__ atLine:__LINE__];  \
143     }                                                                                           \
144 } while (0)
145
146 #pragma mark -
147 #pragma mark Empty (do-nothing) test macros
148
149 //! \name Empty (do-nothing) test macros 
150 //! \startgroup
151
152 //! This macro is not a test but you can optionally include it at the start of a test method so that WOTest can cache the current file name and line number. This is useful for cases where a test method might cause an uncaught exception. If WOTest has a cached copy of the last known location then the user can quickly go to the site of the exception (or near to the site) by clicking in the build results window.
153 #define WO_TEST_START               [WO_TEST_SHARED_INSTANCE cacheFile:__FILE__ line:__LINE__]
154
155 //! An empty test which always passes.
156 #define WO_TEST_PASS                [WO_TEST_SHARED_INSTANCE passTestInFile:__FILE__ atLine:__LINE__]
157
158 //! An empty test which always fails.
159 #define WO_TEST_FAIL                [WO_TEST_SHARED_INSTANCE failTestInFile:__FILE__ atLine:__LINE__]
160
161 //! \endgroup */
162
163 #pragma mark -
164 #pragma mark Boolean test macros
165
166 /*! \name Boolean test macros 
167 \startgroup */
168
169 /*! The expression should evalutate to TRUE. */
170 #define WO_TEST_TRUE(expr)          WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testTrue:(expr) inFile:__FILE__ atLine:__LINE__])
171
172 /*! Synonym for WO_TEST_TRUE. */
173 #define WO_TEST(expr)               WO_TEST_TRUE(expr)
174
175 /*! The expression should evaluate to FALSE. */
176 #define WO_TEST_FALSE(expr)         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFalse:(expr) inFile:__FILE__ atLine:__LINE__])
177
178 /*! Synonym for WO_TEST_FALSE. */
179 #define WO_TEST_NOT(expr)           WO_TEST_FALSE(expr)
180
181 /*! \endgroup */
182
183 #pragma mark -
184 #pragma mark Generic scalar test macros without error margins
185
186 /*! The (scalar) expression should be positive (greater than 0). The comparison is done using the greather-than operator (">"). */
187 #define WO_TEST_POSITIVE(scalar)    WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testPositive:(scalar) inFile:__FILE__ atLine:__LINE__])
188
189 /*! The (scalar) expression should be negative (less than 0). The comparison is done using the less-than operator ("<"). */
190 #define WO_TEST_NEGATIVE(scalar)    WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testNegative:(scalar) inFile:__FILE__ atLine:__LINE__])
191
192 /*! The (scalar) expression should be zero (0). The comparison is done using the equal-to operator ("=="). */
193 #define WO_TEST_ZERO(scalar)        WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testZero:(scalar) inFile:__FILE__ atLine:__LINE__])
194
195 /*! The (scalar) expression should not be zero (0). The comparison is done using the not-equal-to operator ("!="). */
196 #define WO_TEST_NOT_ZERO(scalar)    WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testNotZero:(scalar) inFile:__FILE__ atLine:__LINE__])
197
198 /*! Test if two NSValue-compatible values are equal. Any value that is compatible with the NSValue value:withObjCType: method can be compared using this macro. This means that you can compare any standard C or Objective-C data item (scalar types such as int, float and char, as well as pointers, structures and object ids, SELs or Class objects). A relaxed comparison is performed that is not as strict as the usual NSValue isEqualToValue: method. For example, values such as ints and longs are cast by the compiler before comparison; this is different from the normal case in which the two values would be considered not equal because of their different types even if their actual numeric content was identical. Object equality is tested using the isEqual: method. Any cases not specially handled are passed through to the standard NSValue isEqualToValue: method for comparison.
199
200 Implicit casting is performed between numeric types (char, int, short, long, long long, unsigned char, unsigned int, unsigned short, unsigned long, unsigned long long, float, double and _Bool). Casting is not performed between types such as id, Class and SEL.
201
202 If you wish to avoid the cast or make a stricter comparison you should use macros such as WO_TEST_IS_INT to confirm the type of the value before comparison. You could also use the WO_TEST_INTS_EQUAL macro (or similar) to force the compiler to cast the values to your chosen type prior to comparison. 
203
204 In most cases the WO_TEST_EQUAL macro is the best choice because it is equivalent to allowing the compiler to transparently perform a cast as in the following example; this is what most programmers expect when they perform an equality test:
205
206 \code
207 unsigned int    a = 10;
208 long long       b = 10;
209 if (a == b) // compiler implicitly casts here
210 {
211     // values are equal
212 }
213 else
214 {
215     // values are not equal
216 }
217 \endcode
218
219 */
220 #define WO_TEST_EQUAL(actual, expected)                                                                                         \
221 do {                                                                                                                            \
222     typeof(actual) WOMacroVariable1 = (actual);                                                                                 \
223     typeof(expected) WOMacroVariable2 = (expected);                                                                             \
224     WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testValue:[NSValue value:&WOMacroVariable1 withObjCType:@encode(typeof(actual))]   \
225                                              isEqualTo:[NSValue value:&WOMacroVariable2 withObjCType:@encode(typeof(expected))] \
226                                                 inFile:__FILE__                                                                 \
227                                                 atLine:__LINE__]);                                                              \
228 } while (0)
229
230 /*! Synonym for WO_TEST_EQUAL. "EQ" stands for "Equal". */
231 #define WO_TEST_EQ(actual, expected)  WO_TEST_EQUAL(actual, expected)
232
233 #define WO_TEST_NOT_EQUAL(actual, expected)                                                                                     \
234 do {                                                                                                                            \
235     typeof(actual) WOMacroVariable1 = (actual);                                                                                 \
236     typeof(expected) WOMacroVariable2 = (expected);                                                                             \
237     WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testValue:[NSValue value:&WOMacroVariable1 withObjCType:@encode(typeof(actual))]   \
238                                           isNotEqualTo:[NSValue value:&WOMacroVariable2 withObjCType:@encode(typeof(expected))] \
239                                                 inFile:__FILE__                                                                 \
240                                                 atLine:__LINE__]);                                                              \
241 } while (0)
242
243 /*! Synonym for WO_TEST_NE. "NE" stands for "Not Equal". */
244 #define WO_TEST_NE(actual, expected)  WO_TEST_NOT_EQUAL(actual, expected)
245
246 #define WO_TEST_GREATER_THAN(actual, expected)                                                                                  \
247 do {                                                                                                                            \
248     typeof(actual) WOMacroVariable1 = (actual);                                                                                 \
249     typeof(expected) WOMacroVariable2 = (expected);                                                                             \
250     WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testValue:[NSValue value:&WOMacroVariable1 withObjCType:@encode(typeof(actual))]   \
251                                            greaterThan:[NSValue value:&WOMacroVariable2 withObjCType:@encode(typeof(expected))] \
252                                                 inFile:__FILE__                                                                 \
253                                                 atLine:__LINE__]);                                                              \
254 } while (0)
255
256 /*! Synonym for WO_TEST_GREATER_THAN. "GT" stands for "Greater Than". */
257 #define WO_TEST_GT(actual, expected)  WO_TEST_GREATER_THAN(actual, expected)
258
259 #define WO_TEST_NOT_GREATER_THAN(actual, expected)                                                                              \
260 do {                                                                                                                            \
261     typeof(actual) WOMacroVariable1 = (actual);                                                                                 \
262     typeof(expected) WOMacroVariable2 = (expected);                                                                             \
263     WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testValue:[NSValue value:&WOMacroVariable1 withObjCType:@encode(typeof(actual))]   \
264                                         notGreaterThan:[NSValue value:&WOMacroVariable2 withObjCType:@encode(typeof(expected))] \
265                                                 inFile:__FILE__                                                                 \
266                                                 atLine:__LINE__]);                                                              \
267 } while (0)
268
269 /*! Synonym for WO_TEST_NOT_GREATER_THAN. "LTE" stands for "Less Than or Equal". */
270 #define WO_TEST_LTE(actual, expected) WO_TEST_NOT_GREATER_THAN(actual, expected)
271
272 /*! Synonym for WO_TEST_NOT_GREATER_THAN. "NGT" stands for "Not Greater Than". */
273 #define WO_TEST_NGT(actual, expected) WO_TEST_NOT_GREATER_THAN(actual, expected)
274
275 #define WO_TEST_LESS_THAN(actual, expected)                                                                                     \
276 do {                                                                                                                            \
277     typeof(actual) WOMacroVariable1 = (actual);                                                                                 \
278     typeof(expected) WOMacroVariable2 = (expected);                                                                             \
279     WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testValue:[NSValue value:&WOMacroVariable1 withObjCType:@encode(typeof(actual))]   \
280                                               lessThan:[NSValue value:&WOMacroVariable2 withObjCType:@encode(typeof(expected))] \
281                                                 inFile:__FILE__                                                                 \
282                                                 atLine:__LINE__]);                                                              \
283 } while (0)
284
285 /*! Synonym for WO_TEST_LESS_THAN. "LT" stands for "Less Than". */
286 #define WO_TEST_LT(actual, expected)  WO_TEST_LESS_THAN(actual, expected)
287
288 #define WO_TEST_NOT_LESS_THAN(actual, expected)                                                                                 \
289 do {                                                                                                                            \
290     typeof(actual) WOMacroVariable1 = (actual);                                                                                 \
291     typeof(expected) WOMacroVariable2 = (expected);                                                                             \
292     WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testValue:[NSValue value:&WOMacroVariable1 withObjCType:@encode(typeof(actual))]   \
293                                            notLessThan:[NSValue value:&WOMacroVariable2 withObjCType:@encode(typeof(expected))] \
294                                                 inFile:__FILE__                                                                 \
295                                                 atLine:__LINE__]);                                                              \
296 } while (0)
297
298 /*! Synonym for WO_TEST_NOT_LESS_THAN. "GTE" stands for "Greater Than or Equal". */
299 #define WO_TEST_GTE(actual, expected) WO_TEST_NOT_LESS_THAN(actual, expected)
300
301 /*! Synonym for WO_TEST_NOT_LESS_THAN. "NLT" stands for "Not Less Than". */
302 #define WO_TEST_NLT(actual, expected) WO_TEST_NOT_LESS_THAN(actual, expected)
303
304 #pragma mark -
305 #pragma mark Generic scalar test macros with error margins
306
307 #define WO_TEST_POSITIVE_WITHIN_ERROR
308 #define WO_TEST_NEGATIVE_WITHIN_ERROR
309 #define WO_TEST_ZERO_WITHIN_ERROR
310 #define WO_TEST_NOT_ZERO_WITHIN_ERROR
311 #define WO_TEST_EQUAL_WITHIN_ERROR
312 #define WO_TEST_NOT_EQUAL_WITHIN_ERROR
313 #define WO_TEST_GREATER_THAN_WITHIN_ERROR
314 #define WO_TEST_NOT_GREATER_THAN_WITHIN_ERROR
315 #define WO_TEST_LESS_THAN_WITHIN_ERROR
316 #define WO_TEST_NOT_LESS_THAN_WITHIN_ERROR
317
318 #pragma mark -
319 #pragma mark Pointer to void test macros
320
321 /*! \name Pointer to void test macros 
322 \startgroup */
323
324 /*! The pointer should be nil (0). Given that the pointer is passed as a pointer to void, this test should work with pointers to Objective-C objects as well as other pointers to other objects. The comparison is done using the equal-to operator ("=="). */
325 #define WO_TEST_NIL(pointer)        WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testNil:(pointer) inFile:__FILE__ atLine:__LINE__])
326
327 /*! The pointer should not be nil (0). Given that the pointer is passed as a pointer to void, this test should work with pointers to Objective-C objects as well as pointers to other objects. The comparison is done using the not-equal-to operator ("!="). */
328 #define WO_TEST_NOT_NIL(pointer)    WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testNotNil:(pointer) inFile:__FILE__ atLine:__LINE__])
329
330 /*! The two pointers should be equal. Given that the pointers are passed as pointers to void, this test should work with pointers to Objective-C objects as well as pointers to other objects. The comparison is done using the equal-to operator ("=="). */
331 #define WO_TEST_POINTERS_EQUAL(actual, expected)  \
332 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testPointer:(actual) isEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
333
334 /*! The two pointers should not be equal. Given that the pointers are passed as pointers to void, this test should work with pointers to Objective-C objects as well as pointers to other objects. The comparison is done using the not-equal-to operator ("!="). */
335 #define WO_TEST_POINTERS_NOT_EQUAL(actual, expected)  \
336 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testPointer:(actual) isNotEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
337
338 /*! \endgroup */
339
340 #pragma mark -
341 #pragma mark int test macros
342
343 /*! \name int test macros 
344 \startgroup */
345
346 #define WO_TEST_IS_INT(aScalar)                                 \
347 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIsInt:(@encode(typeof(aScalar))) inFile:__FILE__ atLine:__LINE__])
348
349 #define WO_TEST_IS_NOT_INT(aScalar)                                 \
350 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIsNotInt:(@encode(typeof(aScalar))) inFile:__FILE__ atLine:__LINE__])
351
352
353 /*! The integer expression should be positive (greater than 0). */
354 #define WO_TEST_INT_POSITIVE(aInt) \
355 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIntPositive:(aInt) inFile:__FILE__ atLine:__LINE__])
356
357 /*! The integer expression should be negative (less than 0). */
358 #define WO_TEST_INT_NEGATIVE(aInt) \
359 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIntNegative:(aInt) inFile:__FILE__ atLine:__LINE__])
360
361 /*! The integer expression should be zero (0). */
362 #define WO_TEST_INT_ZERO(aInt) \
363 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIntZero:(aInt) inFile:__FILE__ atLine:__LINE__])
364
365 /*! The integer expression should not be zero (0). */
366 #define WO_TEST_INT_NOT_ZERO(aInt) \
367 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIntNotZero:(aInt) inFile:__FILE__ atLine:__LINE__])
368
369 /*! The two integer expressions should be equal. */
370 #define WO_TEST_INTS_EQUAL(actual, expected)      \
371 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testInt:(actual) isEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
372
373 /*! The two integer expressions should not be equal. */
374 #define WO_TEST_INTS_NOT_EQUAL(actual, expected)  \
375 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testInt:(actual) isNotEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
376
377 #define WO_TEST_INT_GREATER_THAN(actual, expected)    \
378 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testInt:(actual) greaterThan:(expected) inFile:__FILE__ atLine:__LINE__])
379     
380 #define WO_TEST_INT_NOT_GREATER_THAN(actual, expected)    \
381 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testInt:(actual) notGreaterThan:(expected) inFile:__FILE__ atLine:__LINE__])
382     
383 #define WO_TEST_INT_LESS_THAN(actual, expected)   \
384 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testInt:(actual) lessThan:(expected) inFile:__FILE__ atLine:__LINE__])
385     
386 #define WO_TEST_INT_NOT_LESS_THAN(actual, expected)   \
387 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testInt:(actual) notLessThan:(expected) inFile:__FILE__ atLine:__LINE__])
388
389 /*! \endgroup */
390
391 #pragma mark -
392 #pragma mark unsigned test macros
393
394 /*! \name unsigned test macros 
395 \startgroup */
396
397 #define WO_TEST_IS_UNSIGNED(aScalar)                                \
398 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIsUnsigned:(@encode(typeof(aScalar))) inFile:__FILE__ atLine:__LINE__])
399
400 #define WO_TEST_IS_NOT_UNSIGNED(aScalar)                                \
401 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIsNotUnsigned:(@encode(typeof(aScalar))) inFile:__FILE__ atLine:__LINE__])
402
403 /*! The unsigned expression should be zero (0). */
404 #define WO_TEST_UNSIGNED_ZERO(aUnsigned)                \
405 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testUnsignedZero:(aUnsigned) inFile:__FILE__ atLine:__LINE__])
406
407 /*! The unsigned expression should not be zero (0). */
408 #define WO_TEST_UNSIGNED_NOT_ZERO(aUnsigned)                \
409 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testUnsignedNotZero:(aUnsigned) inFile:__FILE__ atLine:__LINE__])
410
411 /*! The two unsigned expressions should be equal. */
412 #define WO_TEST_UNSIGNEDS_EQUAL(actual, expected)   \
413 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testUnsigned:(actual) isEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
414
415 /*! The two unsigned expressions should not be equal. */
416 #define WO_TEST_UNSIGNEDS_NOT_EQUAL(actual, expected)   \
417 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testUnsigned:(actual) isNotEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
418
419 #define WO_TEST_UNSIGNED_GREATER_THAN(actual, expected) \
420 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testUnsigned:(actual) greaterThan:(expected) inFile:__FILE__ atLine:__LINE__])
421     
422 #define WO_TEST_UNSIGNED_NOT_GREATER_THAN(actual, expected) \
423 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testUnsigned:(actual) notGreaterThan:(expected) inFile:__FILE__ atLine:__LINE__])
424
425 #define WO_TEST_UNSIGNED_LESS_THAN(actual, expected)    \
426 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testUnsigned:(actual) lessThan:(expected) inFile:__FILE__ atLine:__LINE__])
427
428 #define WO_TEST_UNSIGNED_NOT_LESS_THAN(actual, expected)    \
429 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testUnsigned:(actual) notLessThan:(expected) inFile:__FILE__ atLine:__LINE__])
430
431 /*! \endgroup */
432
433 #pragma mark -
434 #pragma mark float test macros without error margins
435
436 /*! \name float test macros without error margins 
437 \startgroup */
438
439 #define WO_TEST_IS_FLOAT(aScalar)                               \
440 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIsFloat:(@encode(typeof(aScalar))) inFile:__FILE__ atLine:__LINE__])
441
442 #define WO_TEST_IS_NOT_FLOAT(aScalar)                               \
443 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIsNotFloat:(@encode(typeof(aScalar))) inFile:__FILE__ atLine:__LINE__])
444
445 /*! The float expression should be positive (greater than 0). */
446 #define WO_TEST_FLOAT_POSITIVE(aFloat)              \
447 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloatPositive:(aFloat) inFile:__FILE__ atLine:__LINE__])
448
449 /*! The float expression should be negative (less than 0). */
450 #define WO_TEST_FLOAT_NEGATIVE(aFloat)              \
451 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloatNegative:(aFloat) inFile:__FILE__ atLine:__LINE__])
452
453 /*! The float expression should be zero (0). */
454 #define WO_TEST_FLOAT_ZERO(aFloat)                  \
455 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloatZero:(aFloat) inFile:__FILE__ atLine:__LINE__])
456
457 /*! The float expression should not be zero (0). */
458 #define WO_TEST_FLOAT_NOT_ZERO(aFloat)              \
459 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloatNotZero:(aFloat) inFile:__FILE__ atLine:__LINE__])
460
461 #define WO_TEST_FLOATS_EQUAL(actual, expected)    \
462 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual) isEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
463
464 #define WO_TEST_FLOATS_NOT_EQUAL(actual, expected)    \
465 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual) isNotEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
466
467 #define WO_TEST_FLOAT_GREATER_THAN(actual, expected)  \
468 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual) greaterThan:(expected) inFile:__FILE__ atLine:__LINE__])
469
470 #define WO_TEST_FLOAT_NOT_GREATER_THAN(actual, expected)  \
471 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual) notGreaterThan:(expected) inFile:__FILE__ atLine:__LINE__])
472
473 #define WO_TEST_FLOAT_LESS_THAN(actual, expected) \
474 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual) lessThan:(expected) inFile:__FILE__ atLine:__LINE__])
475
476 #define WO_TEST_FLOAT_NOT_LESS_THAN(actual, expected) \
477 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual) notLessThan:(expected) inFile:__FILE__ atLine:__LINE__])
478
479 /*! \endgroup */
480
481 #pragma mark -
482 #pragma mark float test macros with error margins
483
484 /*! \name float test macros with error margins 
485 \startgroup */
486
487 #define WO_TEST_FLOAT_POSITIVE_WITHIN_ERROR(aFloat, error)  \
488 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloatPositive:(aFloat) withinError:(error) inFile:__FILE__ atLine:__LINE__])
489
490 #define WO_TEST_FLOAT_NEGATIVE_WITHIN_ERROR(aFloat, error)  \
491 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloatNegative:(aFloat) withinError:(error) inFile:__FILE__ atLine:__LINE__])
492
493 #define WO_TEST_FLOAT_ZERO_WITHIN_ERROR(aFloat, error)      \
494 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloatZero:(aFloat) withinError:(error) inFile:__FILE__ atLine:__LINE__])
495
496 #define WO_TEST_FLOAT_NOT_ZERO_WITHIN_ERROR(aFloat, error)  \
497 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloatNotZero:(aFloat) withinError:(error) inFile:__FILE__ atLine:__LINE__])
498
499 /*! The two float expressions should be equal, within the specified margin of error. As the allowed margin of error becomes larger in the positive direction, the more likely that the test will pass; specifying a negative margin of error causes the test to be meaningless because it means that the test will never pass. Zero (0) is a legal error margin; it causes the test to occur exactly. */
500 #define WO_TEST_FLOATS_EQUAL_WITHIN_ERROR(actual, expected, error)      \
501         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual)     \
502                                                  isEqualTo:(expected)   \
503                                                withinError:(error)      \
504                                                     inFile:__FILE__     \
505                                                     atLine:__LINE__])
506
507 /*! The two float expressions should not be equal, within the specified margin of error. As the allowed margin of error becomes larger in the positive direction, the more likely that the test will pass; the larger the margin becomes in the negative direction, the less likely that the test will pass. Zero (0) is a legal error margin; it causes the test to occur exactly. */
508 #define WO_TEST_FLOATS_NOT_EQUAL_WITHIN_ERROR(actual, expected, error)      \
509         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual)         \
510                                               isNotEqualTo:(expected)       \
511                                                withinError:(error)          \
512                                                     inFile:__FILE__         \
513                                                     atLine:__LINE__])
514
515 /*! The first float expression should be greater than the second float expression, after adjustment according to the specified margin of error. As the allowed margin of error becomes larger in the positive direction, the more likely that the test will pass; the larger the margin becomes in the negative direction, the less likely that the test will pass. Zero (0) is a legal error margin; it causes the test to occur exactly. */
516 #define WO_TEST_FLOAT_GREATER_THAN_WITHIN_ERROR(actual, expected, error)    \
517         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual)         \
518                                                greaterThan:(expected)       \
519                                                withinError:(error)          \
520                                                     inFile:__FILE__         \
521                                                     atLine:__LINE__])
522
523 /*! The first float expression should not be greater than (that is, it should be less than or equal to) the second float expression, after adjustment according to the specified margin of error. As the allowed margin of error becomes larger in the positive direction, the more likely that the test will pass; the larger the margin becomes in the negative direction, the less likely that the test will pass. Zero (0) is a legal error margin; it causes the test to occur exactly. */
524 #define WO_TEST_FLOAT_NOT_GREATER_THAN_WITHIN_ERROR(actual, expected, error)    \
525         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual)             \
526                                             notGreaterThan:(expected)           \
527                                                withinError:(error)              \
528                                                     inFile:__FILE__             \
529                                                     atLine:__LINE__])
530
531 /*! The first float expression should be less than the second float expression, after adjustment according to the specified margin of error. As the allowed margin of error becomes larger in the positive direction, the more likely that the test will pass; the larger the margin becomes in the negative direction, the less likely that the test will pass. Zero (0) is a legal error margin; it causes the test to occur exactly. */
532 #define WO_TEST_FLOAT_LESS_THAN_WITHIN_ERROR(actual, expected, error)   \
533         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual)     \
534                                                   lessThan:(expected)   \
535                                                withinError:(error)      \
536                                                     inFile:__FILE__     \
537                                                     atLine:__LINE__])
538
539 /*! The first float expression should not be less than (that is, it should be greater than or equal to) the second float expression, after adjustment according to the specified margin of error. As the allowed margin of error becomes larger in the positive direction, the more likely that the test will pass; the larger the margin becomes in the negative direction, the less likely that the test will pass. Zero (0) is a legal error margin; it causes the test to occur exactly. */
540 #define WO_TEST_FLOAT_NOT_LESS_THAN_WITHIN_ERROR(actual, expected, error)   \
541         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testFloat:(actual)         \
542                                                notLessThan:(expected)       \
543                                                withinError:(error)          \
544                                                     inFile:__FILE__         \
545                                                     atLine:__LINE__])
546
547 /*! \endgroup */
548
549 #pragma mark -
550 #pragma mark double test macros without error margins
551
552 /*! \name double test macros without error margins 
553 \startgroup */
554
555 #define WO_TEST_IS_DOUBLE(aScalar)                                  \
556 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIsDouble:(@encode(typeof(aScalar))) inFile:__FILE__ atLine:__LINE__])
557
558 #define WO_TEST_IS_NOT_DOUBLE(aScalar)                              \
559 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testIsNotDouble:(@encode(typeof(aScalar))) inFile:__FILE__ atLine:__LINE__])
560
561 /*! The double expression should be positive (greater than 0). */
562 #define WO_TEST_DOUBLE_POSITIVE(aDouble)                \
563 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDoublePositive:(aDouble) inFile:__FILE__ atLine:__LINE__])
564
565 /*! The double expression should be negative (less than 0). */
566 #define WO_TEST_DOUBLE_NEGATIVE(aDouble)                \
567 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDoubleNegative:(aDouble) inFile:__FILE__ atLine:__LINE__])
568
569 /*! The double expression should be zero (0). */
570 #define WO_TEST_DOUBLE_ZERO(aDouble)                \
571 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDoubleZero:(aDouble) inFile:__FILE__ atLine:__LINE__])
572
573 /*! The double expression should not be zero (0). */
574 #define WO_TEST_DOUBLE_NOT_ZERO(aDouble)                \
575 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDoubleNotZero:(aDouble) inFile:__FILE__ atLine:__LINE__])
576
577 #define WO_TEST_DOUBLES_EQUAL(actual, expected) \
578 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual) isEqualTo:(actual) inFile:__FILE__ atLine:__LINE__])
579
580 #define WO_TEST_DOUBLES_NOT_EQUAL(actual, expected) \
581 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual) isNotEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
582
583 #define WO_TEST_DOUBLE_GREATER_THAN(actual, expected)   \
584 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual) greaterThan:(expected) inFile:__FILE__ atLine:__LINE__])
585
586 #define WO_TEST_DOUBLE_NOT_GREATER_THAN(actual, expected)   \
587 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual) notGreaterThan:(expected) inFile:__FILE__ atLine:__LINE__])
588
589 #define WO_TEST_DOUBLE_LESS_THAN(actual, expected)  \
590 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual) lessThan:(expected) inFile:__FILE__ atLine:__LINE__])
591
592 #define WO_TEST_DOUBLE_NOT_LESS_THAN(actual, expected)  \
593 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual) notLessThan:(expected) inFile:__FILE__ atLine:__LINE__])
594
595 /*! \endgroup */
596
597 #pragma mark -
598 #pragma mark double test macros with error margins
599
600 /*! \name double test macros with error margins 
601 \startgroup */
602
603 #define WO_TEST_DOUBLE_POSITIVE_WITHIN_ERROR(aDouble, error)    \
604 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDoublePositive:(aDouble) withinError:(error) inFile:__FILE__ atLine:__LINE__])
605
606 #define WO_TEST_DOUBLE_NEGATIVE_WITHIN_ERROR(aDouble, error)    \
607 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDoubleNegative:(aDouble) withinError:(error) inFile:__FILE__ atLine:__LINE__])
608
609 #define WO_TEST_DOUBLE_ZERO_WITHIN_ERROR(aDouble, error)    \
610 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDoubleZero:(aDouble) withinError:(error) inFile:__FILE__ atLine:__LINE__])
611
612 #define WO_TEST_DOUBLE_NOT_ZERO_WITHIN_ERROR(aDouble, error)    \
613 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDoubleNotZero:(aDouble) withinError:(error) inFile:__FILE__ atLine:__LINE__])
614
615 /*! The two double expressions should be equal, within the specified margin of error. */
616 #define WO_TEST_DOUBLES_EQUAL_WITHIN_ERROR(actual, expected, error)     \
617         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual)    \
618                                                   isEqualTo:(expected)  \
619                                                 withinError:(error)     \
620                                                      inFile:__FILE__    \
621                                                      atLine:__LINE__])
622
623 /*! The two double expressions should not be equal, within the specified margin of error. */
624 #define WO_TEST_DOUBLES_NOT_EQUAL_WITHIN_ERROR(actual, expected, error) \
625         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual)    \
626                                                isNotEqualTo:(expected)  \
627                                                 withinError:(error)     \
628                                                      inFile:__FILE__    \
629                                                      atLine:__LINE__])
630
631 #define WO_TEST_DOUBLE_GREATER_THAN_WITHIN_ERROR(actual, expected, error)   \
632         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual)        \
633                                                 greaterThan:(expected)      \
634                                                 withinError:(error)         \
635                                                      inFile:__FILE__        \
636                                                      atLine:__LINE__])
637
638 #define WO_TEST_DOUBLE_NOT_GREATER_THAN_WITHIN_ERROR(actual, expected, error)   \
639         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual)            \
640                                              notGreaterThan:(expected)          \
641                                                 withinError:(error)             \
642                                                      inFile:__FILE__            \
643                                                      atLine:__LINE__])
644
645 #define WO_TEST_DOUBLE_LESS_THAN_WITHIN_ERROR(actual, expected, error)  \
646         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual)    \
647                                                    lessThan:(expected)  \
648                                                 withinError:(error)     \
649                                                      inFile:__FILE__    \
650                                                      atLine:__LINE__])
651
652 #define WO_TEST_DOUBLE_NOT_LESS_THAN_WITHIN_ERROR(actual, expected, error)  \
653         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDouble:(actual)        \
654                                                 notLessThan:(expected)      \
655                                                 withinError:(error)         \
656                                                      inFile:__FILE__        \
657                                                      atLine:__LINE__])
658
659 /*! \endgroup */
660
661 #pragma mark -
662 #pragma mark Object test macros
663
664 /*! 
665 \name Object test macros 
666 \startgroup 
667 */
668
669 /*! \note If both objects are nil they are considered to be equal. */
670 #define WO_TEST_OBJECTS_EQUAL(actual, expected) \
671 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testObject:actual isNotEqualTo:expected inFile:__FILE__ atLine:__LINE__])
672
673 /*! Synonym for WO_TEST_OBJECTS_EQUAL. "EQ" stands for "Equal". */
674 #define WO_TEST_OBJECTS_EQ(actual, expected) WO_TEST_OBJECTS_EQUAL(actual, expected)
675
676 /*! \note If both objects are nil they are considered to be equal. */
677 #define WO_TEST_OBJECTS_NOT_EQUAL(actual, expected) \
678 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testObject:actual isNotEqualTo:expected inFile:__FILE__ atLine:__LINE__])
679
680 /*! Synonym for WO_TEST_OBJECTS_NOT_EQUAL. "NE" stands for "Not Equal". */
681 #define WO_TEST_OBJECTS_NE(actual, expected) WO_TEST_OBJECTS_NOT_EQUAL(actual, expected)
682
683 /*! \endgroup */
684
685 #pragma mark -
686 #pragma mark NSString test macros
687
688 /*!
689 \name NSString test macros 
690 \startgroup
691  */
692
693 /*! \note If both objects are nil they are considered to be equal. */
694 #define WO_TEST_STRINGS_EQUAL(actual, expected) \
695         WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testString:(actual) isEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
696
697 /*! Synonym for WO_TEST_STRINGS_EQUAL. "EQ" stands for "Equal". */
698 #define WO_TEST_STRINGS_EQ(actual, expected) WO_TEST_STRINGS_EQUAL(actual, expected)
699
700 /*! \note If both objects are nil they are considered to be equal. */
701 #define WO_TEST_STRINGS_NOT_EQUAL(actual, expected) \
702 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testString:(actual) isNotEqualToString:(expected) inFile:__FILE__ atLine:__LINE__])
703
704 /*! Synonym for WO_TEST_STRINGS_NOT_EQUAL. "NE" stands for "Not Equal". */
705 #define WO_TEST_STRINGS_NE(actual, expected) WO_TEST_STRINGS_NOT_EQUAL(actual, expected)
706
707 //! \note The test is performed using the NSString hasPrefix: method and has the same semantics.
708 //! \warning An exception will be thrown if \p expected is nil
709 #define WO_TEST_STRING_HAS_PREFIX(actual, expected) \
710 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testString:(actual) hasPrefix:(expected) inFile:__FILE__ atLine:__LINE__])
711
712 //! \note The test is performed using the NSString hasPrefix: method and has the same semantics.
713 //! \warning An exception will be thrown if \p expected is nil
714 #define WO_TEST_STRING_DOES_NOT_HAVE_PREFIX(actual, expected)    \
715 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testString:(actual) doesNotHavePrefix:(expected) inFile:__FILE__ atLine:__LINE__])
716
717 //! \note The test is performed using the NSString hasSuffix: method and has the same semantics.
718 //! \warning An exception will be thrown if \p expected is nil
719 #define WO_TEST_STRING_HAS_SUFFIX(actual, expected) \
720 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testString:(actual) hasSuffix:(expected) inFile:__FILE__ atLine:__LINE__])
721
722 //! \note The test is performed using the NSString hasSuffix: method and has the same semantics.
723 //! \warning An exception will be thrown if \p expected is nil
724 #define WO_TEST_STRING_DOES_NOT_HAVE_SUFFIX(actual, expected)   \
725 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testString:(actual) doesNotHaveSuffix:(expected) inFile:__FILE__ atLine:__LINE__])
726
727 //! \note The test is performed using the NSString rangeOfString: method and has the same semantics.
728 //! \warning An exception will be thrown if \p expected is nil
729 #define WO_TEST_STRING_CONTAINS(actual, expected)   \
730 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testString:(actual) contains:(expected) inFile:__FILE__ atLine:__LINE__])
731
732 //! \note The test is performed using the NSString rangeOfString: method and has the same semantics.
733 //! \warning An exception will be thrown if \p expected is nil
734 #define WO_TEST_STRING_DOES_NOT_CONTAIN(actual, expected)   \
735 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testString:(actual) doesNotContain:(expected) inFile:__FILE__ atLine:__LINE__])
736
737 /*! \endgroup */
738
739 #pragma mark -
740 #pragma mark NSArray test macros
741
742 /*! \name NSArray test macros 
743 \startgroup */
744
745 /*!  */
746 #define WO_TEST_ARRAYS_EQUAL(actual, expected)    \
747 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testArray:(actual) isEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
748
749 /*! Synonym for WO_TEST_ARRAYS_EQUAL. "EQ" stands for "Equal". */
750 #define WO_TEST_ARRAYS_EQ(actual, expected)  WO_TEST_ARRAYS_EQUAL(actual, expected)
751
752 /*!  */
753 #define WO_TEST_ARRAYS_NOT_EQUAL(actual, expected)    \
754 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testArray:(actual) isNotEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
755
756 /*! Synonym for WO_TEST_ARRAYS_NOT_EQUAL. "NE" stands for "Not Equal". */
757 #define WO_TEST_ARRAYS_NE(actual, expected)  WO_TEST_ARRAYS_NOT_EQUAL(actual, expected)
758
759 /*! \endgroup */
760
761 #pragma mark -
762 #pragma mark NSDictionary test macros
763
764 /*! \name NSDictionary test macros 
765 \startgroup */
766
767 /*!  */
768 #define WO_TEST_DICTIONARIES_EQUAL(actual, expected)    \
769 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDictionary:(actual) isEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
770
771 /*! Synonym for WO_TEST_DICTIONARIES_EQUAL. "EQ" stands for "Equal". */
772 #define WO_TEST_DICTIONARIES_EQ(actual, expected) WO_TEST_DICTIONARIES_EQUAL(actual, expected)
773
774 /*!  */
775 #define WO_TEST_DICTIONARIES_NOT_EQUAL(actual, expected)    \
776 WO_TEST_WRAPPER([WO_TEST_SHARED_INSTANCE testDictionary:(actual) isNotEqualTo:(expected) inFile:__FILE__ atLine:__LINE__])
777
778 /*! Synonym for WO_TEST_DICTIONARIES_NOT_EQUAL. "NE" stands for "Not Equal". */
779 #define WO_TEST_DICTIONARIES_NE(actual, expected) WO_TEST_DICTIONARIES_NOT_EQUAL(actual, expected)
780
781 /*! \endgroup */
782
783 #pragma mark -
784 #pragma mark Exception test macros
785
786 //! \name Exception test macros 
787 //! The lengthy local variable names (WOTestMacroException and WOTestMacroCaughtException) are contrived so as to minimize the likelihood of namespace clashes.
788 //! \startgroup 
789
790 /*! Passes only if an exception is thrown during the evaluation of the expression, expr. */
791 #define WO_TEST_THROWS(expr)                                                    \
792 do {                                                                            \
793     id WOTestMacroException  = nil;                                             \
794     @try {                                                                      \
795         expr;                                                                   \
796     }                                                                           \
797     @catch (id WOTestMacroCaughtException) {                                    \
798         WOTestMacroException = WOTestMacroCaughtException;                      \
799     }                                                                           \
800     [WO_TEST_SHARED_INSTANCE testThrowsException:(WOTestMacroException)         \
801                                           inFile:__FILE__                       \
802                                           atLine:__LINE__];                     \
803 } while (0)
804
805 /*! Passes only if no exception is thrown during the evaluation of the expression, expr. */
806 #define WO_TEST_DOES_NOT_THROW(expr)                                            \
807 do {                                                                            \
808     id WOTestMacroException = nil;                                              \
809     @try {                                                                      \
810         expr;                                                                   \
811     }                                                                           \
812     @catch (id WOTestMacroCaughtException) {                                    \
813         WOTestMacroException = WOTestMacroCaughtException;                      \
814     }                                                                           \
815     [WO_TEST_SHARED_INSTANCE testDoesNotThrowException:(WOTestMacroException)   \
816                                                 inFile:__FILE__                 \
817                                                 atLine:__LINE__];               \
818 } while (0)
819
820 /*! Passes only if an exception with name name is thrown during the evaluation of the expression, expr. The test itself throws an exception if the name parameter is nil, or not a string object (NSString or one of its subclasses). */
821 #define WO_TEST_THROWS_EXCEPTION_NAMED(expr, name)                      \
822 do {                                                                    \
823     id WOTestMacroException = nil;                                      \
824     @try {                                                              \
825         expr;                                                           \
826     }                                                                   \
827     @catch (id WOTestMacroCaughtException) {                            \
828         WOTestMacroException = WOTestMacroCaughtException;              \
829     }                                                                   \
830     [WO_TEST_SHARED_INSTANCE testThrowsException:(WOTestMacroException) \
831                                            named:(name)                 \
832                                           inFile:__FILE__               \
833                                           atLine:__LINE__];             \
834 } while (0)
835
836 /*! Passes only if an exception with name name is not thrown during the evaluation of the expression, expr (exceptions with names other than name do not influence the outcome of the test). The test itself throws an exception if the name parameter is nil, or not a string object (NSString or one of its subclasses). */
837 #define WO_TEST_DOES_NOT_THROW_EXCEPTION_NAMED(expr, name)                      \
838 do {                                                                            \
839     id WOTestMacroException = nil;                                              \
840     @try {                                                                      \
841         expr;                                                                   \
842     }                                                                           \
843     @catch (id WOTestMacroCaughtException) {                                    \
844         WOTestMacroException = WOTestMacroCaughtException;                      \
845     }                                                                           \
846     [WO_TEST_SHARED_INSTANCE testDoesNotThrowException:(WOTestMacroException)   \
847                                                  named:(name)                   \
848                                                 inFile:__FILE__                 \
849                                                 atLine:__LINE__];               \
850 } while (0)
851
852 //! \endgroup