]> git.wincent.com - WOTest.git/blob - Tests/WOTestSelfTests.m
Code clean-up for garbage collection
[WOTest.git] / Tests / WOTestSelfTests.m
1 //
2 //  WOTestSelfTests.m
3 //  WOTest
4 //
5 //  Created by Wincent Colaiuta on 15 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 #import "WOTestSelfTests.h"
23
24 #import <objc/objc-class.h>
25 #import <objc/objc-runtime.h>
26 #import <objc/Protocol.h>
27
28 // empty class that does not have the WOTest marker protocol at compile time
29 @interface WOEmpty : NSObject {
30
31 }
32
33 @end
34
35 @implementation WOEmpty
36
37 NSMutableArray *WOEmptyClassMethodInvocations;
38 NSMutableArray *WOEmptyInstanceMethodInvocations;
39
40 + (void)initialize
41 {
42     WOEmptyClassMethodInvocations = [NSMutableArray arrayWithCapacity:3];
43     WOEmptyInstanceMethodInvocations = [NSMutableArray arrayWithCapacity:3];
44 }
45
46 + (void)verify
47 {
48     // were class methods called in order?
49     NSArray *expectedClassMethods = [NSArray arrayWithObjects:@"preflight", @"testClassMethod", @"postflight", nil];
50     NSAssert([expectedClassMethods isEqualToArray:WOEmptyClassMethodInvocations], @"Class method verification failed");
51
52     // were instance methods called in order?
53     NSArray *expectedInstanceMethods = [NSArray arrayWithObjects:@"preflight", @"testInstanceMethod", @"postflight", nil];
54     NSAssert([expectedInstanceMethods isEqualToArray:WOEmptyInstanceMethodInvocations], @"Instance method verification failed");
55 }
56
57 + (void)preflight
58 {
59     [WOEmptyClassMethodInvocations addObject:NSStringFromSelector(_cmd)];
60 }
61
62 + (void)testClassMethod
63 {
64     [WOEmptyClassMethodInvocations addObject:NSStringFromSelector(_cmd)];
65 }
66
67 + (void)postflight
68 {
69     [WOEmptyClassMethodInvocations addObject:NSStringFromSelector(_cmd)];
70 }
71
72 - (void)preflight
73 {
74     [WOEmptyInstanceMethodInvocations addObject:NSStringFromSelector(_cmd)];
75 }
76
77 - (void)testInstanceMethod
78 {
79     [WOEmptyInstanceMethodInvocations addObject:NSStringFromSelector(_cmd)];
80 }
81
82 - (void)postflight
83 {
84     [WOEmptyInstanceMethodInvocations addObject:NSStringFromSelector(_cmd)];
85 }
86
87 @end
88
89 // root class that does not implement the NSObject protocol
90 @interface WORootClass {
91
92     Class isa;
93
94 }
95
96 @end
97
98 @implementation WORootClass
99
100 + (id)new
101 {
102     Class class = object_getClass(self);
103     return class_createInstance(class, 0);
104 }
105
106 // http://www.geocities.com/chrootstrap/custom_objective_c_root_classes.html
107 // http://darwinsource.opendarwin.org/10.3/objc4-235/runtime/Messengers.subproj/objc-msg-ppc.s
108 // Apple's runtime makes the assumption that this method is implemented
109 - forward:(SEL)sel :(marg_list)args
110 {
111     return self; // although it behaves equally if I return nil here
112
113     /*
114
115      TODO: figure out how to make it crash if you send it a selector it doesn't recognize
116
117      [Object crashes];      // crashes
118      [Protocol foobar];     // crashes (inherits behavior from Object)
119      [NSObject foobar];     // raises exception, selector not recognized
120      [WORootClass foobar];  // continues execution, no warning
121
122     */
123 }
124
125 @end
126
127 #pragma mark -
128 #pragma mark Unit tests
129
130 @implementation WOTestSelfTests
131
132 + (void)initialize
133 {
134     // seeding with 1 produces repeatable test results across runs
135     [WO_TEST_SHARED_INSTANCE seedRandomNumberGenerator:1];
136
137     // TODO: set up mock object here to expect that +testClassMethods gets run
138 }
139
140 + (void)testClassMethods
141 {
142     // make sure that class methods run (not just instance methods)
143     // TODO: do I need a mock object here to test that the test is run?
144     WO_TEST_PASS;
145 }
146
147 + (void)preflight
148 {
149     [WO_TEST_SHARED_INSTANCE setExpectLowLevelExceptions:NO];
150 }
151
152 + (void)postflight
153 {
154
155 }
156
157 - (void)preflight
158 {
159
160 }
161
162 - (void)postflight
163 {
164
165 }
166
167 - (void)testTestRunningMethods
168 {
169     NSSet *expectedMethods = [NSSet setWithObjects:
170         @"+testClassMethods",
171         @"-testTestRunningMethods",
172         @"-testTestableMethodsFrom",
173         @"-testPreAndPostflightMethods",
174         @"-testEmptyTests",
175         @"-testBooleanTests",
176         @"-testNSValueCategory",
177         @"-testNSExceptionCategory",
178         @"-testNSStringCategory",
179         @"-testNSValueCategory",
180         @"-testPointerToVoidTests",
181         @"-testIntTests",
182         @"-testUnsignedTests",
183         @"-testFloatTests",
184         @"-testFloatWithErrorMarginTests",
185         @"-testDoubleTests",
186         @"-testDoubleWithErrorMarginTests",
187         @"-testObjectTests",
188         @"-testStringTests",
189         @"-testArrayTests",
190         @"-testDictionaryTests",
191         @"-testShorthandMacros",
192         @"-testExceptionTests",
193         @"-testLowLevelExceptionTests",
194         @"-testRandomValueGeneratorMethods", nil];
195
196     NSSet *actualMethods =[NSSet setWithArray:
197         [WO_TEST_SHARED_INSTANCE testableMethodsFrom:[self class]]];
198
199     WO_TEST_EQ(expectedMethods, actualMethods);
200     //WO_TEST_ARRAYS_EQUAL(expectedMethods, actualMethods);
201     // TODO: write WO_TEST_SETS_EQUAL
202     // TODO: write shorthand macros for like WO_TEST_ARRAYS_EQ
203
204     WO_TEST_THROWS([WO_TEST_SHARED_INSTANCE runTestsForClassName:nil]);
205     WO_TEST_THROWS([WO_TEST_SHARED_INSTANCE runTestsForClass:nil]);
206 }
207
208 - (void)testTestableMethodsFrom
209 {
210     // should throw (but not crash) when passed an "id" instead of a "Class"
211     WO_TEST_THROWS([WO_TEST_SHARED_INSTANCE testableMethodsFrom:(Class)self]);
212
213     // should find class and instance methods beginning with "test"
214     NSSet *expectedMethods = [NSSet setWithObjects:
215         @"+testClassMethod", @"-testInstanceMethod", nil];
216     NSSet *actualMethods = [NSSet setWithArray:
217         [WO_TEST_SHARED_INSTANCE testableMethodsFrom:[WOEmpty class]]];
218     WO_TEST_EQ(expectedMethods, actualMethods);
219 }
220
221 - (void)testPreAndPostflightMethods
222 {
223     /*
224
225      Testing whether methods get called in order requires some tricky runtime
226      hackery. First of all we start with the WOEmpty class which is not marked
227      with the WOTest protocol. This prevents its test methods from being run
228      until we are ready to run them.
229
230      We then add the marker protocol at runtime so that the tests can be run.
231
232      It would be nice to be able to use mock objects to verify that the methods
233      on the WOEmpty class are being called but unfortunately it's not possible
234      for two reasons: firstly, mock objects are just that (objects) whereas the
235      test running methods work on classes (not instances); secondly, because the
236      test running methods work at a very low level in the runtime we can't just
237      use a WOClassMock -- once again, a class mock is just an object whereas the
238      low-level test running methods work directly with classes in the runtime.
239
240      TODO: use objc_allocateClassPair() to create classes on the fly (better class mock implementation)
241
242      So we unfortunately have to upgrade WOEmpty to be a real stub and we can't
243      benefit from the shortcuts provided by the WOMock cluster.
244
245      The runtime hackery cannot be avoided by labelling the WOEmpty class with
246      the WOTest marker at compile time because we have no way of knowing the
247      order in which classes will be tested and so we cannot know when to fire
248      the verify method. The hackery is the only way in which we can have total
249      control over the timing of the WOEmpty tests.
250
251      */
252
253      // confirm that WOEmpty does not conform to protocol
254      NSAssert([WOEmpty conformsToProtocol:@protocol(WOTest)] == NO, @"WOEmpty already conforms to WOTest protocol");
255
256      // build new protocol entry
257      Protocol *protocol = @protocol(WOTest);
258      struct objc_protocol_list *new;
259      new = calloc(1, sizeof(struct objc_protocol_list)); // never free
260      NSAssert1(new != NULL, @"calloc() failed (size %d)", sizeof(struct objc_protocol_list));
261      new->count = 1;
262      new->list[0] = protocol;
263      NSAssert(class_addProtocol([WOEmpty class], protocol), @"class_addProtocol failed");
264      NSAssert([WOEmpty conformsToProtocol:@protocol(WOTest)], @"WOEmpty class does not conform to WOTest protocol");
265
266      // perform the actual "tests" (even though WOEmpty contains no real tests)
267      [WO_TEST_SHARED_INSTANCE runTestsForClass:[WOEmpty class]];
268      WO_TEST_DOES_NOT_THROW([WOEmpty verify]);
269 }
270
271 - (void)wouldTestTestWrappers
272 {
273     // can't actually test that the wrappers work, can only demonstrate what they would do if we were to include bad code in a test
274     WO_TEST_NOT_NIL([@"short" substringToIndex:10000]);
275 }
276
277 - (void)testEmptyTests
278 {
279     // should pass
280     WO_TEST_PASS;
281
282     // should fail
283     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
284     WO_TEST_FAIL;
285     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO];
286 }
287
288 - (void)testBooleanTests
289 {
290     // should pass
291     WO_TEST_TRUE(YES);
292     WO_TEST_FALSE(NO);
293
294     // should fail
295     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
296
297     WO_TEST_TRUE(NO);
298     WO_TEST_FALSE(YES);
299
300     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO];
301 }
302
303 // arguably the most important code in the framework, so *lots* of tests
304 - (void)testNSValueCategory
305 {
306     // should pass
307
308     // objects
309     NSString    *string1    = @"flippant";
310     NSString    *string2    = [NSString stringWithString:@"flippant"];
311     NSString    *string3    = @"bonanza";
312     NSString    *string4    = @"";
313     NSString    *string5    = nil;
314     NSString    *string6    = nil;
315     NSArray     *array1     = [NSArray arrayWithObjects:@"1", @"2", nil];
316     NSArray     *array2     = [NSArray arrayWithObjects:@"1", @"2", nil];
317     NSArray     *array3     = [NSArray arrayWithObject:@"dirt"];
318     NSArray     *array4     = [NSArray array];
319     NSArray     *array5     = nil;
320     NSArray     *array6     = nil;
321
322     WO_TEST_EQUAL(string1, string2);
323     WO_TEST_EQUAL(string2, string1);        // order shouldn't matter
324     WO_TEST_EQUAL(string5, string6);        // nil equals nil
325     WO_TEST_EQUAL(nil, nil);
326     WO_TEST_EQUAL(nil, string5);
327     WO_TEST_EQUAL(string5, nil);
328     WO_TEST_NOT_EQUAL(nil, string1);
329     WO_TEST_NOT_EQUAL(string1, nil);
330     WO_TEST_NOT_EQUAL(string2, string3);
331     WO_TEST_NOT_EQUAL(string3, string2);
332     WO_TEST_NOT_EQUAL(string2, string4);
333     WO_TEST_NOT_EQUAL(string4, string2);
334     WO_TEST_NOT_EQUAL(string2, string5);
335     WO_TEST_NOT_EQUAL(string5, string2);
336     WO_TEST_NOT_EQUAL(string4, string5);    // @"" does not equal nil
337     WO_TEST_NOT_EQUAL(string5, string4);
338     WO_TEST_NOT_EQUAL(string5, string3);
339     WO_TEST_NOT_EQUAL(string3, string5);
340
341     WO_TEST_EQUAL(array1, array2);
342     WO_TEST_EQUAL(array2, array1);
343     WO_TEST_EQUAL(array5, array6);
344     WO_TEST_NOT_EQUAL(array2, array3);
345     WO_TEST_NOT_EQUAL(array3, array2);
346     WO_TEST_NOT_EQUAL(array2, array4);
347     WO_TEST_NOT_EQUAL(array4, array2);
348     WO_TEST_NOT_EQUAL(array2, array5);
349     WO_TEST_NOT_EQUAL(array5, array2);
350     WO_TEST_NOT_EQUAL(array4, array5);
351     WO_TEST_NOT_EQUAL(array5, array4);
352     WO_TEST_NOT_EQUAL(array5, array3);
353     WO_TEST_NOT_EQUAL(array3, array5);
354
355     WO_TEST_EQUAL(string5, array5);         // (id)nil == (id)nil
356     WO_TEST_EQUAL(array5, string5);
357     WO_TEST_NOT_EQUAL(string4, array4);
358     WO_TEST_NOT_EQUAL(array4, string4);
359     WO_TEST_NOT_EQUAL(string2, array2);
360     WO_TEST_NOT_EQUAL(array2, string2);
361     WO_TEST_NOT_EQUAL(string1, array1);
362     WO_TEST_NOT_EQUAL(array1, string1);
363
364     // class objects
365     Class class1 = [NSString class];
366     Class class2 = [NSString class];
367     Class class3 = [NSMutableDictionary class];
368     Class class4 = [NSDictionary class];
369     Class class5 = nil;
370     Class class6 = nil;
371
372     WO_TEST_EQUAL(class1, class2);
373     WO_TEST_EQUAL(class2, class1);      // order shouldn't matter
374     WO_TEST_EQUAL(class5, class6);      // nil equals nil
375     WO_TEST_EQUAL(class6, class5);
376     WO_TEST_NOT_EQUAL(class1, class3);
377     WO_TEST_NOT_EQUAL(class3, class1);
378     WO_TEST_NOT_EQUAL(class3, class4);
379     WO_TEST_NOT_EQUAL(class4, class3);
380     WO_TEST_NOT_EQUAL(class4, class5);
381     WO_TEST_NOT_EQUAL(class5, class4);
382
383     WO_TEST_NOT_EQUAL(string5, class5); // different types (even if both nil)
384     WO_TEST_NOT_EQUAL(class5, string5);
385     WO_TEST_NOT_EQUAL(string1, class1); // class obj is not an instance obj
386     WO_TEST_NOT_EQUAL(class1, string1);
387     WO_TEST_NOT_EQUAL(string4, class1); // even if instance obj is empty
388     WO_TEST_NOT_EQUAL(class1, string4);
389
390     // selectors
391     SEL selector1   = @selector(stringWithString:);
392     SEL selector2   = @selector(stringWithString:);
393     SEL selector3   = @selector(init);
394     SEL selector4   = NULL;
395     SEL selector5   = NULL;
396
397     WO_TEST_EQUAL(selector1, selector2);
398     WO_TEST_EQUAL(selector2, selector1);
399     WO_TEST_NOT_EQUAL(selector2, selector3);
400     WO_TEST_NOT_EQUAL(selector3, selector2);
401     WO_TEST_NOT_EQUAL(selector3, selector4);
402     WO_TEST_NOT_EQUAL(selector4, selector3);
403     WO_TEST_EQUAL(selector4, selector5);
404     WO_TEST_EQUAL(selector5, selector4);
405
406     WO_TEST_NOT_EQUAL(selector1, class1);   // different types
407     WO_TEST_NOT_EQUAL(class1, selector1);
408     WO_TEST_NOT_EQUAL(selector1, string1);
409     WO_TEST_NOT_EQUAL(string1, selector1);
410     WO_TEST_NOT_EQUAL(selector5, class5);   // even if both nil/NULL
411     WO_TEST_NOT_EQUAL(class5, selector5);
412     WO_TEST_NOT_EQUAL(selector5, string6);
413     WO_TEST_NOT_EQUAL(string6, selector5);
414
415     // values of matching types
416     char char1 = 'a';
417     char char2 = 'a';
418     char char3 = 'b';
419     char char4 = 0;
420     char char5 = 0;
421     WO_TEST_EQUAL(char1, char2);
422     WO_TEST_EQUAL(char2, char1);        // order shouldn't matter
423     WO_TEST_NOT_EQUAL(char2, char3);
424     WO_TEST_NOT_EQUAL(char3, char2);
425     WO_TEST_NOT_EQUAL(char3, char4);
426     WO_TEST_NOT_EQUAL(char4, char3);
427     WO_TEST_EQUAL(char4, char5);
428     WO_TEST_EQUAL(char5, char4);
429
430     int int1 = 10;
431     int int2 = 10;
432     int int3 = 50;
433     WO_TEST_EQUAL(int1, int2);
434     WO_TEST_EQUAL(int2, int1);
435     WO_TEST_NOT_EQUAL(int2, int3);
436     WO_TEST_NOT_EQUAL(int3, int2);
437
438     // need to test all of the different kinds of casts
439
440
441     // char, char
442     // char, int
443     // char, short
444     // char, long
445     // char, long long
446     // char, unsigned char
447     // char, unsigned int
448     // char, unsigned short
449     // char, unsigned long
450     // char, unsigned long long
451     // char, float
452     // char, double
453     // char, C99 _Bool
454     // char, void *
455     // char, char *
456
457
458     // int, char
459     // int, int
460     // int, short
461     // int, long
462     // int, long long
463     // int, unsigned char
464     // int, unsigned int
465     // int, unsigned short
466     // int, unsigned long
467     // int, unsigned long long
468     // int, float
469     // int, double
470     // int, C99 _Bool
471     // int, void *
472     // int, char *
473
474     // short, char
475     // short, int
476     // short, short
477     // short, long
478     // short, long long
479     // short, unsigned char
480     // short, unsigned int
481     // short, unsigned short
482     // short, unsigned long
483     // short, unsigned long long
484     // short, float
485     // short, double
486     // short, C99 _Bool
487     // short, void *
488     // short, char *
489
490     // long, char
491     // long, int
492     // long, short
493     // long, long
494     // long, long long
495     // long, unsigned char
496     // long, unsigned int
497     // long, unsigned short
498     // long, unsigned long
499     // long, unsigned long long
500     // long, float
501     // long, double
502     // long, C99 _Bool
503     // long, void *
504     // long, char *
505
506     // long long, char
507     // long long, int
508     // long long, short
509     // long long, long
510     // long long, long long
511     // long long, unsigned char
512     // long long, unsigned int
513     // long long, unsigned short
514     // long long, unsigned long
515     // long long, unsigned long long
516     // long long, float
517     // long long, double
518     // long long, C99 _Bool
519     // long long, void *
520     // long long, char *
521
522     // unsigned char, char
523     // unsigned char, int
524     // unsigned char, short
525     // unsigned char, long
526     // unsigned char, long long
527     // unsigned char, unsigned char
528     // unsigned char, unsigned int
529     // unsigned char, unsigned short
530     // unsigned char, unsigned long
531     // unsigned char, unsigned long long
532     // unsigned char, float
533     // unsigned char, double
534     // unsigned char, C99 _Bool
535     // unsigned char, void *
536     // unsigned char, char *
537
538     // unsigned int, char
539     // unsigned int, int
540     // unsigned int, short
541     // unsigned int, long
542     // unsigned int, long long
543     // unsigned int, unsigned char
544     // unsigned int, unsigned int
545     // unsigned int, unsigned short
546     // unsigned int, unsigned long
547     // unsigned int, unsigned long long
548     // unsigned int, float
549     // unsigned int, double
550     // unsigned int, C99 _Bool
551     // unsigned int, void *
552     // unsigned int, char *
553
554     // unsigned short, char
555     // unsigned short, int
556     // unsigned short, short
557     // unsigned short, long
558     // unsigned short, long long
559     // unsigned short, unsigned char
560     // unsigned short, unsigned int
561     // unsigned short, unsigned short
562     // unsigned short, unsigned long
563     // unsigned short, unsigned long long
564     // unsigned short, float
565     // unsigned short, double
566     // unsigned short, C99 _Bool
567     // unsigned short, void *
568     // unsigned short, char *
569
570     // unsigned long, char
571     // unsigned long, int
572     // unsigned long, short
573     // unsigned long, long
574     // unsigned long, long long
575     // unsigned long, unsigned char
576     // unsigned long, unsigned int
577     // unsigned long, unsigned short
578     // unsigned long, unsigned long
579     // unsigned long, unsigned long long
580     // unsigned long, float
581     // unsigned long, double
582     // unsigned long, C99 _Bool
583     // unsigned long, void *
584     // unsigned long, char *
585
586     // unsigned long long, char
587     // unsigned long long, int
588     // unsigned long long, short
589     // unsigned long long, long
590     // unsigned long long, long long
591     // unsigned long long, unsigned char
592     // unsigned long long, unsigned int
593     // unsigned long long, unsigned short
594     // unsigned long long, unsigned long
595     // unsigned long long, unsigned long long
596     // unsigned long long, float
597     // unsigned long long, double
598     // unsigned long long, C99 _Bool
599     // unsigned long long, void *
600     // unsigned long long, char *
601
602     // float, char
603     // float, int
604     // float, short
605     // float, long
606     // float, long long
607     // float, unsigned char
608     // float, unsigned int
609     // float, unsigned short
610     // float, unsigned long
611     // float, unsigned long long
612     // float, float
613     // float, double
614     // float, C99 _Bool
615     // float, void *
616     // float, char *
617
618     // double, char
619     // double, int
620     // double, short
621     // double, long
622     // double, long long
623     // double, unsigned char
624     // double, unsigned int
625     // double, unsigned short
626     // double, unsigned long
627     // double, unsigned long long
628     // double, float
629     // double, double
630     // double, C99 _Bool
631     // double, void *
632     // double, char *
633
634     // C99 _Bool, char
635     // C99 _Bool, int
636     // C99 _Bool, short
637     // C99 _Bool, long
638     // C99 _Bool, long long
639     // C99 _Bool, unsigned char
640     // C99 _Bool, unsigned int
641     // C99 _Bool, unsigned short
642     // C99 _Bool, unsigned long
643     // C99 _Bool, unsigned long long
644     // C99 _Bool, float
645     // C99 _Bool, double
646     // C99 _Bool, C99 _Bool
647     // C99 _Bool, void *
648     // C99 _Bool, char *
649
650     // void *, char
651     // void *, int
652     // void *, short
653     // void *, long
654     // void *, long long
655     // void *, unsigned char
656     // void *, unsigned int
657     // void *, unsigned short
658     // void *, unsigned long
659     // void *, unsigned long long
660     // void *, float
661     // void *, double
662     // void *, C99 _Bool
663     // void *, void *
664     // void *, char *
665
666     // char *, char
667     // char *, int
668     // char *, short
669     // char *, long
670     // char *, long long
671     // char *, unsigned char
672     // char *, unsigned int
673     // char *, unsigned short
674     // char *, unsigned long
675     // char *, unsigned long long
676     // char *, float
677     // char *, double
678     // char *, C99 _Bool
679     // char *, void *
680     // char *, char *
681
682
683
684     // literal values
685     WO_TEST_EQUAL(1000, 1000);
686     WO_TEST_NOT_EQUAL(2000, 4000);
687
688     // literal values with casts
689     WO_TEST_EQUAL((float)10.0, (float)10.0);
690     WO_TEST_NOT_EQUAL((float)10.0, (float)200.0);
691
692     // literal values with mismatched casts
693     WO_TEST_EQUAL((int)100, (long)100);
694     WO_TEST_NOT_EQUAL((int)100, (long)1000);
695
696     // compound values (variables)
697
698
699
700     // compound values (literals)
701
702
703
704     // compound values (variables + literals)
705
706
707
708     // arrays
709
710
711     // structures
712     NSPoint point1  = {10.0f, 300.0f};
713     NSPoint point2  = {10.0f, 300.0f};
714     NSPoint point3  = NSZeroPoint;
715     NSRange range1  = {10U, 30U};
716     NSRange range2  = {10U, 30U};
717     NSRange range3  = {0U, 199U};
718     NSRect  rect1   = NSMakeRect(10.0, 20.0, 30.0, 40.0);
719     NSRect  rect2   = NSMakeRect(10.0, 20.0, 30.0, 40.0);
720     NSRect  rect3   = NSMakeRect(90.0, 80.0, 10.0, 100.0);
721     NSSize  size1   = {1000.0f, 2000.0f};
722     NSSize  size2   = {1000.0f, 2000.0f};
723     NSSize  size3   = {20.0f, 4000.0f};
724     WO_TEST_EQUAL(point1, point2);
725     WO_TEST_NOT_EQUAL(point2, point3);  // different values
726     WO_TEST_EQUAL(range1, range2);
727     WO_TEST_NOT_EQUAL(range2, range3);  // different values
728     WO_TEST_EQUAL(rect1, rect2);
729     WO_TEST_NOT_EQUAL(rect2, rect3);    // different values
730     WO_TEST_EQUAL(size1, size2);
731     WO_TEST_NOT_EQUAL(size2, size3);    // different values
732     WO_TEST_NOT_EQUAL(point1, rect1);   // incompatible types
733     WO_TEST_NOT_EQUAL(rect2, point2);   // incompatible types
734     WO_TEST_NOT_EQUAL(point1, range1);  // incompatible types
735     WO_TEST_NOT_EQUAL(range2, point2);  // incompatible types
736     WO_TEST_NOT_EQUAL(range1, rect1);   // incompatible types
737     WO_TEST_NOT_EQUAL(rect2, range2);   // incompatible types
738     WO_TEST_NOT_EQUAL(point1, size1);   // incompatible types
739     WO_TEST_NOT_EQUAL(range1, size1);   // incompatible types
740     WO_TEST_NOT_EQUAL(rect1, size1);    // incompatible types
741     WO_TEST_NOT_EQUAL(size2, point2);   // incompatible types
742     WO_TEST_NOT_EQUAL(size2, range2);   // incompatible types
743     WO_TEST_NOT_EQUAL(size2, rect2);    // incompatible types
744
745     // pointers
746
747
748
749
750
751
752
753
754
755     // >, <, >=, <=
756     char small  = 'd';
757     char big    = 'z';
758     char other  = 'd';
759
760     WO_TEST_GREATER_THAN(big, small);
761     WO_TEST_NOT_GREATER_THAN(small, big);
762     WO_TEST_NOT_GREATER_THAN(small, other);
763
764     WO_TEST_LESS_THAN(small, big);
765     WO_TEST_NOT_LESS_THAN(big, small);
766     WO_TEST_NOT_LESS_THAN(small, other);
767
768     int negative    = -100;
769     int middle      = 50;
770     int positive    = 75;
771     int otherMiddle = 50;
772
773     WO_TEST_GREATER_THAN(middle, negative);
774     WO_TEST_GREATER_THAN(positive, negative);
775     WO_TEST_GREATER_THAN(positive, middle);
776
777     WO_TEST_NOT_GREATER_THAN(middle, positive);
778     WO_TEST_NOT_GREATER_THAN(negative, middle);
779     WO_TEST_NOT_GREATER_THAN(negative, positive);
780     WO_TEST_NOT_GREATER_THAN(middle, otherMiddle);
781
782     WO_TEST_LESS_THAN(negative, middle);
783     WO_TEST_LESS_THAN(negative, positive);
784     WO_TEST_LESS_THAN(middle, positive);
785
786     WO_TEST_NOT_LESS_THAN(middle, negative);
787     WO_TEST_NOT_LESS_THAN(positive, middle);
788     WO_TEST_NOT_LESS_THAN(positive, negative);
789     WO_TEST_NOT_LESS_THAN(middle, otherMiddle);
790
791     // casts to signed types
792     WO_TEST_GREATER_THAN((short)big, (short)small);
793     WO_TEST_NOT_GREATER_THAN((short)small, (short)big);
794     WO_TEST_NOT_GREATER_THAN((short)small, (short)other);
795     WO_TEST_LESS_THAN((short)small, (short)big);
796     WO_TEST_NOT_LESS_THAN((short)big, (short)small);
797     WO_TEST_NOT_LESS_THAN((short)small, (short)other);
798     WO_TEST_GREATER_THAN((short)middle, (short)negative);
799     WO_TEST_GREATER_THAN((short)positive, (short)negative);
800     WO_TEST_GREATER_THAN((short)positive, (short)middle);
801     WO_TEST_NOT_GREATER_THAN((short)middle, (short)positive);
802     WO_TEST_NOT_GREATER_THAN((short)negative, (short)middle);
803     WO_TEST_NOT_GREATER_THAN((short)negative, (short)positive);
804     WO_TEST_NOT_GREATER_THAN((short)middle, (short)otherMiddle);
805     WO_TEST_LESS_THAN((short)negative, (short)middle);
806     WO_TEST_LESS_THAN((short)negative, (short)positive);
807     WO_TEST_LESS_THAN((short)middle, (short)positive);
808     WO_TEST_NOT_LESS_THAN((short)middle, (short)negative);
809     WO_TEST_NOT_LESS_THAN((short)positive, (short)middle);
810     WO_TEST_NOT_LESS_THAN((short)positive, (short)negative);
811     WO_TEST_NOT_LESS_THAN((short)middle, (short)otherMiddle);
812
813     WO_TEST_GREATER_THAN((long)big, (long)small);
814     WO_TEST_NOT_GREATER_THAN((long)small, (long)big);
815     WO_TEST_NOT_GREATER_THAN((long)small, (long)other);
816     WO_TEST_LESS_THAN((long)small, (long)big);
817     WO_TEST_NOT_LESS_THAN((long)big, (long)small);
818     WO_TEST_NOT_LESS_THAN((long)small, (long)other);
819     WO_TEST_GREATER_THAN((long)middle, (long)negative);
820     WO_TEST_GREATER_THAN((long)positive, (long)negative);
821     WO_TEST_GREATER_THAN((long)positive, (long)middle);
822     WO_TEST_NOT_GREATER_THAN((long)middle, (long)positive);
823     WO_TEST_NOT_GREATER_THAN((long)negative, (long)middle);
824     WO_TEST_NOT_GREATER_THAN((long)negative, (long)positive);
825     WO_TEST_NOT_GREATER_THAN((long)middle, (long)otherMiddle);
826     WO_TEST_LESS_THAN((long)negative, (long)middle);
827     WO_TEST_LESS_THAN((long)negative, (long)positive);
828     WO_TEST_LESS_THAN((long)middle, (long)positive);
829     WO_TEST_NOT_LESS_THAN((long)middle, (long)negative);
830     WO_TEST_NOT_LESS_THAN((long)positive, (long)middle);
831     WO_TEST_NOT_LESS_THAN((long)positive, (long)negative);
832     WO_TEST_NOT_LESS_THAN((long)middle, (long)otherMiddle);
833
834     WO_TEST_GREATER_THAN((long long)big, (long long)small);
835     WO_TEST_NOT_GREATER_THAN((long long)small, (long long)big);
836     WO_TEST_NOT_GREATER_THAN((long long)small, (long long)other);
837     WO_TEST_LESS_THAN((long long)small, (long long)big);
838     WO_TEST_NOT_LESS_THAN((long long)big, (long long)small);
839     WO_TEST_NOT_LESS_THAN((long long)small, (long long)other);
840     WO_TEST_GREATER_THAN((long long)middle, (long long)negative);
841     WO_TEST_GREATER_THAN((long long)positive, (long long)negative);
842     WO_TEST_GREATER_THAN((long long)positive, (long long)middle);
843     WO_TEST_NOT_GREATER_THAN((long long)middle, (long long)positive);
844     WO_TEST_NOT_GREATER_THAN((long long)negative, (long long)middle);
845     WO_TEST_NOT_GREATER_THAN((long long)negative, (long long)positive);
846     WO_TEST_NOT_GREATER_THAN((long long)middle, (long long)otherMiddle);
847     WO_TEST_LESS_THAN((long long)negative, (long long)middle);
848     WO_TEST_LESS_THAN((long long)negative, (long long)positive);
849     WO_TEST_LESS_THAN((long long)middle, (long long)positive);
850     WO_TEST_NOT_LESS_THAN((long long)middle, (long long)negative);
851     WO_TEST_NOT_LESS_THAN((long long)positive, (long long)middle);
852     WO_TEST_NOT_LESS_THAN((long long)positive, (long long)negative);
853     WO_TEST_NOT_LESS_THAN((long long)middle, (long long)otherMiddle);
854
855     WO_TEST_GREATER_THAN((float)big, (float)small);
856     WO_TEST_NOT_GREATER_THAN((float)small, (float)big);
857     WO_TEST_NOT_GREATER_THAN((float)small, (float)other);
858     WO_TEST_LESS_THAN((float)small, (float)big);
859     WO_TEST_NOT_LESS_THAN((float)big, (float)small);
860     WO_TEST_NOT_LESS_THAN((float)small, (float)other);
861     WO_TEST_GREATER_THAN((float)middle, (float)negative);
862     WO_TEST_GREATER_THAN((float)positive, (float)negative);
863     WO_TEST_GREATER_THAN((float)positive, (float)middle);
864     WO_TEST_NOT_GREATER_THAN((float)middle, (float)positive);
865     WO_TEST_NOT_GREATER_THAN((float)negative, (float)middle);
866     WO_TEST_NOT_GREATER_THAN((float)negative, (float)positive);
867     WO_TEST_NOT_GREATER_THAN((float)middle, (float)otherMiddle);
868     WO_TEST_LESS_THAN((float)negative, (float)middle);
869     WO_TEST_LESS_THAN((float)negative, (float)positive);
870     WO_TEST_LESS_THAN((float)middle, (float)positive);
871     WO_TEST_NOT_LESS_THAN((float)middle, (float)negative);
872     WO_TEST_NOT_LESS_THAN((float)positive, (float)middle);
873     WO_TEST_NOT_LESS_THAN((float)positive, (float)negative);
874     WO_TEST_NOT_LESS_THAN((float)middle, (float)otherMiddle);
875
876     WO_TEST_GREATER_THAN((double)big, (double)small);
877     WO_TEST_NOT_GREATER_THAN((double)small, (double)big);
878     WO_TEST_NOT_GREATER_THAN((double)small, (double)other);
879     WO_TEST_LESS_THAN((double)small, (double)big);
880     WO_TEST_NOT_LESS_THAN((double)big, (double)small);
881     WO_TEST_NOT_LESS_THAN((double)small, (double)other);
882     WO_TEST_GREATER_THAN((double)middle, (double)negative);
883     WO_TEST_GREATER_THAN((double)positive, (double)negative);
884     WO_TEST_GREATER_THAN((double)positive, (double)middle);
885     WO_TEST_NOT_GREATER_THAN((double)middle, (double)positive);
886     WO_TEST_NOT_GREATER_THAN((double)negative, (double)middle);
887     WO_TEST_NOT_GREATER_THAN((double)negative, (double)positive);
888     WO_TEST_NOT_GREATER_THAN((double)middle, (double)otherMiddle);
889     WO_TEST_LESS_THAN((double)negative, (double)middle);
890     WO_TEST_LESS_THAN((double)negative, (double)positive);
891     WO_TEST_LESS_THAN((double)middle, (double)positive);
892     WO_TEST_NOT_LESS_THAN((double)middle, (double)negative);
893     WO_TEST_NOT_LESS_THAN((double)positive, (double)middle);
894     WO_TEST_NOT_LESS_THAN((double)positive, (double)negative);
895     WO_TEST_NOT_LESS_THAN((double)middle, (double)otherMiddle);
896
897     // casts to unsigned types
898     WO_TEST_GREATER_THAN((unsigned char)big, (unsigned char)small);
899     WO_TEST_NOT_GREATER_THAN((unsigned char)small, (unsigned char)big);
900     WO_TEST_NOT_GREATER_THAN((unsigned char)small, (unsigned char)other);
901     WO_TEST_LESS_THAN((unsigned char)small, (unsigned char)big);
902     WO_TEST_NOT_LESS_THAN((unsigned char)big, (unsigned char)small);
903     WO_TEST_NOT_LESS_THAN((unsigned char)small, (unsigned char)other);
904     WO_TEST_GREATER_THAN((unsigned char)positive, (unsigned char)middle);
905     WO_TEST_NOT_GREATER_THAN((unsigned char)middle, (unsigned char)positive);
906     WO_TEST_NOT_GREATER_THAN((unsigned char)middle, (unsigned char)otherMiddle);
907     WO_TEST_LESS_THAN((unsigned char)middle, (unsigned char)positive);
908     WO_TEST_NOT_LESS_THAN((unsigned char)positive, (unsigned char)middle);
909     WO_TEST_NOT_LESS_THAN((unsigned char)middle, (unsigned char)otherMiddle);
910
911     WO_TEST_GREATER_THAN((unsigned int)big, (unsigned int)small);
912     WO_TEST_NOT_GREATER_THAN((unsigned int)small, (unsigned int)big);
913     WO_TEST_NOT_GREATER_THAN((unsigned int)small, (unsigned int)other);
914     WO_TEST_LESS_THAN((unsigned int)small, (unsigned int)big);
915     WO_TEST_NOT_LESS_THAN((unsigned int)big, (unsigned int)small);
916     WO_TEST_NOT_LESS_THAN((unsigned int)small, (unsigned int)other);
917     WO_TEST_GREATER_THAN((unsigned int)positive, (unsigned int)middle);
918     WO_TEST_NOT_GREATER_THAN((unsigned int)middle, (unsigned int)positive);
919     WO_TEST_NOT_GREATER_THAN((unsigned int)middle, (unsigned int)otherMiddle);
920     WO_TEST_LESS_THAN((unsigned int)middle, (unsigned int)positive);
921     WO_TEST_NOT_LESS_THAN((unsigned int)positive, (unsigned int)middle);
922     WO_TEST_NOT_LESS_THAN((unsigned int)middle, (unsigned int)otherMiddle);
923
924     WO_TEST_GREATER_THAN((unsigned long)big, (unsigned long)small);
925     WO_TEST_NOT_GREATER_THAN((unsigned long)small, (unsigned long)big);
926     WO_TEST_NOT_GREATER_THAN((unsigned long)small, (unsigned long)other);
927     WO_TEST_LESS_THAN((unsigned long)small, (unsigned long)big);
928     WO_TEST_NOT_LESS_THAN((unsigned long)big, (unsigned long)small);
929     WO_TEST_NOT_LESS_THAN((unsigned long)small, (unsigned long)other);
930     WO_TEST_GREATER_THAN((unsigned long)positive, (unsigned long)middle);
931     WO_TEST_NOT_GREATER_THAN((unsigned long)middle, (unsigned long)positive);
932     WO_TEST_NOT_GREATER_THAN((unsigned long)middle, (unsigned long)otherMiddle);
933     WO_TEST_LESS_THAN((unsigned long)middle, (unsigned long)positive);
934     WO_TEST_NOT_LESS_THAN((unsigned long)positive, (unsigned long)middle);
935     WO_TEST_NOT_LESS_THAN((unsigned long)middle, (unsigned long)otherMiddle);
936
937     WO_TEST_GREATER_THAN((unsigned short)big, (unsigned short)small);
938     WO_TEST_NOT_GREATER_THAN((unsigned short)small, (unsigned short)big);
939     WO_TEST_NOT_GREATER_THAN((unsigned short)small, (unsigned short)other);
940     WO_TEST_LESS_THAN((unsigned short)small, (unsigned short)big);
941     WO_TEST_NOT_LESS_THAN((unsigned short)big, (unsigned short)small);
942     WO_TEST_NOT_LESS_THAN((unsigned short)small, (unsigned short)other);
943     WO_TEST_GREATER_THAN((unsigned short)positive, (unsigned short)middle);
944     WO_TEST_NOT_GREATER_THAN((unsigned short)middle, (unsigned short)positive);
945     WO_TEST_NOT_GREATER_THAN ((unsigned short)middle, (unsigned short)otherMiddle);
946     WO_TEST_LESS_THAN((unsigned short)middle, (unsigned short)positive);
947     WO_TEST_NOT_LESS_THAN((unsigned short)positive, (unsigned short)middle);
948     WO_TEST_NOT_LESS_THAN((unsigned short)middle, (unsigned short)otherMiddle);
949     WO_TEST_GREATER_THAN((unsigned long long)big, (unsigned long long)small);
950     WO_TEST_NOT_GREATER_THAN ((unsigned long long)small, (unsigned long long)big);
951     WO_TEST_NOT_GREATER_THAN ((unsigned long long)small, (unsigned long long)other);
952     WO_TEST_LESS_THAN((unsigned long long)small, (unsigned long long)big);
953     WO_TEST_NOT_LESS_THAN((unsigned long long)big, (unsigned long long)small);
954     WO_TEST_NOT_LESS_THAN((unsigned long long)small, (unsigned long long)other);
955     WO_TEST_GREATER_THAN ((unsigned long long)positive, (unsigned long long)middle);
956     WO_TEST_NOT_GREATER_THAN ((unsigned long long)middle, (unsigned long long)positive);
957     WO_TEST_NOT_GREATER_THAN ((unsigned long long)middle, (unsigned long long)otherMiddle);
958     WO_TEST_LESS_THAN((unsigned long long)middle, (unsigned long long)positive);
959     WO_TEST_NOT_LESS_THAN ((unsigned long long)positive, (unsigned long long)middle);
960     WO_TEST_NOT_LESS_THAN((unsigned long long)middle, (unsigned long long)otherMiddle);
961
962
963
964
965
966
967
968     // casts to non-matching types
969
970
971
972
973
974
975     // objects: strings
976     WO_TEST_GREATER_THAN(@"foo", @"bar");
977     WO_TEST_GREATER_THAN(@"food", @"foo");
978     WO_TEST_LESS_THAN(@"bar", @"foo");
979     WO_TEST_LESS_THAN(@"foo", @"food");
980     WO_TEST_NOT_GREATER_THAN(@"bar", @"foo");
981     WO_TEST_NOT_GREATER_THAN(@"foo", @"food");
982     WO_TEST_NOT_GREATER_THAN(@"bar", @"bar");
983     WO_TEST_NOT_LESS_THAN(@"foo", @"bar");
984     WO_TEST_NOT_LESS_THAN(@"foo", @"foo");
985     WO_TEST_NOT_LESS_THAN(@"food", @"foo");
986
987     // objects: numbers
988     NSNumber *smallNumber   = [NSNumber numberWithInt:3];
989     NSNumber *bigNumber     = [NSNumber numberWithFloat:10.0];
990     NSNumber *otherNumber   = [NSNumber numberWithLongLong:10];
991
992     WO_TEST_GREATER_THAN(bigNumber, smallNumber);
993     WO_TEST_NOT_GREATER_THAN(smallNumber, bigNumber);
994     WO_TEST_NOT_GREATER_THAN(bigNumber, otherNumber);
995
996     WO_TEST_LESS_THAN(smallNumber, bigNumber);
997     WO_TEST_NOT_LESS_THAN(bigNumber, smallNumber);
998     WO_TEST_NOT_LESS_THAN(bigNumber, otherNumber);
999
1000     // objects that don't implement compare: should raise exception
1001     NSFileManager *manager = [NSFileManager defaultManager];
1002     NSValue *managerValue = [NSValue valueWithNonretainedObject:manager];
1003     NSString *compareString = @"hello";
1004     NSValue *stringValue = [NSValue valueWithNonretainedObject:compareString];
1005     WO_TEST_THROWS([managerValue WOTest_compare:stringValue]);
1006
1007     // can't compare objects and non-objects
1008     int         scalar      = 1234;
1009     const void  *scalarPtr  = &scalar;
1010     WO_TEST_THROWS([stringValue WOTest_compare:[NSValue value:scalarPtr withObjCType:@encode(typeof(scalar))]]);
1011     WO_TEST_THROWS([stringValue WOTest_compare:[NSValue valueWithPoint:NSZeroPoint]]);
1012
1013
1014     typeof(int) dastardlyScalar = 10000;
1015     WO_TEST_THROWS
1016         ([[NSValue valueWithBytes:&dastardlyScalar
1017                          objCType:@encode(int)] WOTest_testIsEqualToValue:[NSValue valueWithNonretainedObject:@"foo"]]);
1018
1019     typeof(nil) nilVar = nil;
1020     NSValue *nilValue = [NSValue valueWithBytes:&nilVar objCType:@encode(typeof(nil))];
1021     NSString *objectString = @"foo";
1022     NSValue *nonVoidValue = [NSValue valueWithBytes:&objectString objCType:@encode(typeof(objectString))];
1023     WO_TEST_TRUE([nonVoidValue WOTest_isObject]);
1024     WO_TEST_DOES_NOT_THROW([nonVoidValue WOTest_testIsEqualToValue:nilValue]);
1025     WO_TEST_DOES_NOT_THROW([nilValue WOTest_testIsEqualToValue:nonVoidValue]);
1026
1027     // can also compare pointers to void to nil
1028     NSValue *objectValue = [NSValue valueWithNonretainedObject:[NSString stringWithFormat:@"bar"]];
1029     WO_TEST_FALSE([objectValue WOTest_isObject]); // due to valueWithNonretainedObject
1030     WO_TEST_TRUE([objectValue WOTest_isPointerToVoid]);
1031     WO_TEST_DOES_NOT_THROW([objectValue WOTest_testIsEqualToValue:nilValue]);
1032     WO_TEST_DOES_NOT_THROW([nilValue WOTest_testIsEqualToValue:objectValue]);
1033
1034     NSValue *realObjectValue = [NSValue valueWithNonretainedObject:[[NSObject alloc] init]];
1035     WO_TEST_FALSE([realObjectValue WOTest_isObject]);
1036     WO_TEST_TRUE([realObjectValue WOTest_isPointerToVoid]);
1037     WO_TEST_DOES_NOT_THROW([realObjectValue WOTest_testIsEqualToValue:nilValue]);
1038     WO_TEST_DOES_NOT_THROW([nilValue WOTest_testIsEqualToValue:realObjectValue]);
1039
1040     NSValue *otherValue = [NSValue valueWithNonretainedObject:@"bar"];
1041     WO_TEST_FALSE([otherValue WOTest_isObject]);
1042     WO_TEST_TRUE([otherValue WOTest_isPointerToVoid]);
1043
1044     typeof("^v") myCoolVar = ("^v");
1045     NSValue *charArray = [NSValue valueWithBytes:&myCoolVar objCType:@encode(typeof("^v"))];
1046     WO_TEST_TRUE([charArray WOTest_isCharArray]);
1047     WO_TEST_EQUAL([charArray WOTest_stringValue], @"^v");
1048
1049     char *constChar = "^v";
1050     NSValue *constCharValue = [NSValue valueWithBytes:&constChar objCType:@encode(char*)];
1051     WO_TEST_TRUE([constCharValue WOTest_isCharacterString]);
1052     WO_TEST_EQUAL([constCharValue WOTest_stringValue], @"^v");
1053     WO_TEST_EQUAL([charArray WOTest_stringValue], [constCharValue WOTest_stringValue]);
1054
1055     WO_TEST_EQUAL([otherValue objCType], "^v");
1056
1057     WO_TEST_EQUAL(strcmp([nilValue objCType], @encode(typeof(nil))), 0);
1058     typeof(nil) otherNilVar = nil;
1059     NSValue *otherNilValue = [NSValue valueWithBytes:&otherNilVar objCType:@encode(typeof(nil))];
1060     WO_TEST_EQUAL([nilValue WOTest_compare:otherNilValue], NSOrderedSame);
1061     WO_TEST_NOT_EQUAL([otherValue nonretainedObjectValue], nil);
1062     WO_TEST_DOES_NOT_THROW([nilValue WOTest_testIsEqualToValue:otherValue]);
1063
1064     const char *constCharArray = "my char array";
1065     char *nonConstCharArray = "my char array";
1066
1067     WO_TEST_EQUAL("my char array", "my char array");
1068     WO_TEST_EQUAL(constCharArray, nonConstCharArray);
1069     WO_TEST_EQUAL(nonConstCharArray, constCharArray);
1070     WO_TEST_EQUAL("my char array", nonConstCharArray);
1071     WO_TEST_EQUAL("my char array", constCharArray);
1072     WO_TEST_EQUAL(nonConstCharArray, "my char array");
1073     WO_TEST_EQUAL(constCharArray, "my char array");
1074     WO_TEST_NOT_EQUAL("my char array", "my other char array");
1075     WO_TEST_NOT_EQUAL("hello", 0);
1076
1077     // should fail
1078     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1079
1080
1081
1082     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1083 }
1084
1085 - (void)testNSStringCategory
1086 {
1087     // should pass
1088     NSString *string1 = @"Fun\n  \nFun ";
1089     NSString *string2 = @"Fun Fun ";
1090     NSString *string3 = [string1 WOTest_stringByCollapsingWhitespace];
1091
1092     WO_TEST_EQUAL(string2, string3);
1093     WO_TEST_EQUAL(string3, string2);
1094
1095     NSString *string4 = @"\n\r Not fun at all...";
1096     NSString *string5 = @" Not fun at all...";
1097     NSString *string6 = [string4 WOTest_stringByCollapsingWhitespace];
1098
1099     WO_TEST_EQUAL(string5, string6);
1100     WO_TEST_EQUAL(string6, string5);
1101
1102     // should fail
1103     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1104
1105     WO_TEST_NOT_EQUAL(string2, string3);
1106     WO_TEST_NOT_EQUAL(string3, string2);
1107     WO_TEST_NOT_EQUAL(string5, string6);
1108     WO_TEST_NOT_EQUAL(string6, string5);
1109
1110     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1111 }
1112
1113 - (void)testNSExceptionCategory
1114 {
1115     NSException *exception1 =
1116     [NSException exceptionWithName:@"foo" reason:@"bar" userInfo:nil];
1117     WO_TEST_EQUAL([NSException WOTest_descriptionForException:exception1], @"foo: bar");
1118
1119     // NSImage responds to name but not reason
1120     NSImage *exception2 = [[NSImage alloc] initWithSize:NSZeroSize];
1121     [exception2 setName:@"Roger Smith"];
1122     WO_TEST_EQUAL([NSException WOTest_descriptionForException:exception2],
1123                   ([NSString stringWithFormat:@"%@ (%x)", [exception2 name], exception2]));
1124
1125     // NSObject responds to description but not to name or reason
1126     NSObject *exception3 = [[NSObject alloc] init];
1127     WO_TEST_EQUAL([NSException WOTest_descriptionForException:exception3], [exception3 description]);
1128
1129     WO_TEST_EQUAL([NSException WOTest_nameForException:nil], @"no exception");
1130     WO_TEST_EQUAL([NSException WOTest_nameForException:@"hello"], @"hello");
1131
1132     // should fail
1133     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1134
1135     WO_TEST_EQUAL([NSException WOTest_descriptionForException:exception1], @"welcome");
1136     WO_TEST_NOT_EQUAL([NSException WOTest_descriptionForException:exception1], @"foo: bar");
1137
1138     WO_TEST_NOT_EQUAL([NSException WOTest_nameForException:nil], @"no exception");
1139     WO_TEST_NOT_EQUAL([NSException WOTest_nameForException:@"hello"], @"hello");
1140
1141     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1142 }
1143
1144 - (void)testPointerToVoidTests
1145 {
1146     // should pass
1147
1148     // should fail
1149     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1150
1151
1152
1153     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1154 }
1155
1156 - (void)testIntTests
1157 {
1158     // should pass
1159
1160     WO_TEST_IS_INT((int)-2000);
1161     WO_TEST_IS_INT((int)-1000);
1162     WO_TEST_IS_INT((int)-10);
1163     WO_TEST_IS_INT((int)-1);
1164     WO_TEST_IS_INT((int)0);
1165     WO_TEST_IS_INT((int)200);
1166     WO_TEST_IS_INT((int)1000);
1167     WO_TEST_IS_INT((int)50000);
1168     WO_TEST_IS_INT((int)1350000);
1169
1170     WO_TEST_IS_NOT_INT((double)-2000.0);
1171     WO_TEST_IS_NOT_INT((double)-1000.0);
1172     WO_TEST_IS_NOT_INT((float)-10.0);
1173     WO_TEST_IS_NOT_INT((float)-1.0);
1174     WO_TEST_IS_NOT_INT((unsigned)0);
1175     WO_TEST_IS_NOT_INT((unsigned)200);
1176     WO_TEST_IS_NOT_INT((unsigned)1000);
1177     WO_TEST_IS_NOT_INT((float)50000.0);
1178     WO_TEST_IS_NOT_INT((double)1350000.0);
1179
1180     WO_TEST_INT_POSITIVE((int)1);
1181     WO_TEST_INT_POSITIVE((int)2);
1182     WO_TEST_INT_POSITIVE((int)5);
1183     WO_TEST_INT_POSITIVE((int)10);
1184     WO_TEST_INT_POSITIVE((int)200);
1185     WO_TEST_INT_POSITIVE((int)1000);
1186     WO_TEST_INT_POSITIVE((int)50000);
1187     WO_TEST_INT_POSITIVE((int)1350000);
1188
1189     WO_TEST_INT_NEGATIVE((int)-1);
1190     WO_TEST_INT_NEGATIVE((int)-2);
1191     WO_TEST_INT_NEGATIVE((int)-5);
1192     WO_TEST_INT_NEGATIVE((int)-10);
1193     WO_TEST_INT_NEGATIVE((int)-200);
1194     WO_TEST_INT_NEGATIVE((int)-1000);
1195     WO_TEST_INT_NEGATIVE((int)-50000);
1196     WO_TEST_INT_NEGATIVE((int)-1350000);
1197
1198     WO_TEST_INT_ZERO((int)0);
1199
1200     WO_TEST_INT_NOT_ZERO((int)1);
1201     WO_TEST_INT_NOT_ZERO((int)2);
1202     WO_TEST_INT_NOT_ZERO((int)200);
1203     WO_TEST_INT_NOT_ZERO((int)50000);
1204     WO_TEST_INT_NOT_ZERO((int)-1);
1205     WO_TEST_INT_NOT_ZERO((int)-2);
1206     WO_TEST_INT_NOT_ZERO((int)-200);
1207     WO_TEST_INT_NOT_ZERO((int)-50000);
1208
1209     WO_TEST_INTS_EQUAL((int)0, (int)0);
1210     WO_TEST_INTS_EQUAL((int)2, (int)2);
1211     WO_TEST_INTS_EQUAL((int)20, (int)20);
1212     WO_TEST_INTS_EQUAL((int)1000, (int)1000);
1213     WO_TEST_INTS_EQUAL((int)-10, (int)-10);
1214     WO_TEST_INTS_EQUAL((int)-100, (int)-100);
1215     WO_TEST_INTS_EQUAL((int)-200, (int)-200);
1216     WO_TEST_INTS_EQUAL((int)-1350000, (int)-1350000);
1217
1218     WO_TEST_INTS_NOT_EQUAL((int)1, (int)2);
1219     WO_TEST_INTS_NOT_EQUAL((int)2, (int)1);
1220     WO_TEST_INTS_NOT_EQUAL((int)10, (int)20);
1221     WO_TEST_INTS_NOT_EQUAL((int)200, (int)100);
1222     WO_TEST_INTS_NOT_EQUAL((int)-1, (int)0);
1223     WO_TEST_INTS_NOT_EQUAL((int)0, (int)-1);
1224     WO_TEST_INTS_NOT_EQUAL((int)-10, (int)10);
1225     WO_TEST_INTS_NOT_EQUAL((int)-100, (int)-200);
1226
1227     WO_TEST_INT_GREATER_THAN((int)1, (int)0);
1228     WO_TEST_INT_GREATER_THAN((int)10, (int)5);
1229     WO_TEST_INT_GREATER_THAN((int)0, (int)-5);
1230     WO_TEST_INT_GREATER_THAN((int)20, (int)-40);
1231     WO_TEST_INT_GREATER_THAN((int)1000, (int)1);
1232     WO_TEST_INT_GREATER_THAN((int)1000, (int)999);
1233     WO_TEST_INT_GREATER_THAN((int)1350000, (int)5000);
1234     WO_TEST_INT_GREATER_THAN((int)5000000, (int)-5000000);
1235
1236     WO_TEST_INT_NOT_GREATER_THAN((int)1, (int)1);
1237     WO_TEST_INT_NOT_GREATER_THAN((int)1, (int)2);
1238     WO_TEST_INT_NOT_GREATER_THAN((int)0, (int)1);
1239     WO_TEST_INT_NOT_GREATER_THAN((int)-1, (int)1);
1240     WO_TEST_INT_NOT_GREATER_THAN((int)1500, (int)120000);
1241     WO_TEST_INT_NOT_GREATER_THAN((int)-500, (int)-400);
1242     WO_TEST_INT_NOT_GREATER_THAN((int)-1600, (int)-1599);
1243     WO_TEST_INT_NOT_GREATER_THAN((int)400, (int)400);
1244
1245     WO_TEST_INT_LESS_THAN((int)0, (int)1);
1246     WO_TEST_INT_LESS_THAN((int)1, (int)2);
1247     WO_TEST_INT_LESS_THAN((int)-1, (int)0);
1248     WO_TEST_INT_LESS_THAN((int)-1, (int)1);
1249     WO_TEST_INT_LESS_THAN((int)-1, (int)2);
1250     WO_TEST_INT_LESS_THAN((int)1000, (int)1001);
1251     WO_TEST_INT_LESS_THAN((int)1350, (int)1000000);
1252     WO_TEST_INT_LESS_THAN((int)-5000000, (int)1);
1253
1254     WO_TEST_INT_NOT_LESS_THAN((int)0, (int)0);
1255     WO_TEST_INT_NOT_LESS_THAN((int)1, (int)0);
1256     WO_TEST_INT_NOT_LESS_THAN((int)2, (int)1);
1257     WO_TEST_INT_NOT_LESS_THAN((int)-1, (int)-1);
1258     WO_TEST_INT_NOT_LESS_THAN((int)-1, (int)-2);
1259     WO_TEST_INT_NOT_LESS_THAN((int)2000, (int)1000);
1260     WO_TEST_INT_NOT_LESS_THAN((int)5000, (int)5000);
1261     WO_TEST_INT_NOT_LESS_THAN((int)-10000, (int)-12000);
1262
1263     // should fail
1264     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1265
1266     WO_TEST_IS_INT((float)0.0);
1267     WO_TEST_IS_INT((float)-1.0);
1268     WO_TEST_IS_INT((double)2.0);
1269     WO_TEST_IS_INT((double)-5.0);
1270     WO_TEST_IS_INT((unsigned)10);
1271     WO_TEST_IS_INT((unsigned)200);
1272     WO_TEST_IS_INT((unsigned)1000);
1273     WO_TEST_IS_INT((unsigned)50000);
1274     WO_TEST_IS_INT((unsigned)1350000);
1275
1276     WO_TEST_IS_NOT_INT((int)-2000);
1277     WO_TEST_IS_NOT_INT((int)-1000);
1278     WO_TEST_IS_NOT_INT((int)-10);
1279     WO_TEST_IS_NOT_INT((int)-1);
1280     WO_TEST_IS_NOT_INT((int)0);
1281     WO_TEST_IS_NOT_INT((int)200);
1282     WO_TEST_IS_NOT_INT((int)1000);
1283     WO_TEST_IS_NOT_INT((int)50000);
1284     WO_TEST_IS_NOT_INT((int)1350000);
1285
1286     WO_TEST_INT_POSITIVE((int)0);
1287     WO_TEST_INT_POSITIVE((int)-2);
1288     WO_TEST_INT_POSITIVE((int)-5);
1289     WO_TEST_INT_POSITIVE((int)-10);
1290     WO_TEST_INT_POSITIVE((int)-200);
1291     WO_TEST_INT_POSITIVE((int)-1000);
1292     WO_TEST_INT_POSITIVE((int)-50000);
1293     WO_TEST_INT_POSITIVE((int)-1350000);
1294
1295     WO_TEST_INT_NEGATIVE((int)0);
1296     WO_TEST_INT_NEGATIVE((int)2);
1297     WO_TEST_INT_NEGATIVE((int)5);
1298     WO_TEST_INT_NEGATIVE((int)10);
1299     WO_TEST_INT_NEGATIVE((int)200);
1300     WO_TEST_INT_NEGATIVE((int)1000);
1301     WO_TEST_INT_NEGATIVE((int)50000);
1302     WO_TEST_INT_NEGATIVE((int)1350000);
1303
1304     WO_TEST_INT_ZERO((int)1);
1305     WO_TEST_INT_ZERO((int)2);
1306     WO_TEST_INT_ZERO((int)200);
1307     WO_TEST_INT_ZERO((int)50000);
1308     WO_TEST_INT_ZERO((int)-1);
1309     WO_TEST_INT_ZERO((int)-2);
1310     WO_TEST_INT_ZERO((int)-200);
1311     WO_TEST_INT_ZERO((int)-50000);
1312
1313     WO_TEST_INT_NOT_ZERO((int)0);
1314
1315     WO_TEST_INTS_EQUAL((int)0, (int)10);
1316     WO_TEST_INTS_EQUAL((int)2, (int)1);
1317     WO_TEST_INTS_EQUAL((int)20, (int)-20);
1318     WO_TEST_INTS_EQUAL((int)1000, (int)2000);
1319     WO_TEST_INTS_EQUAL((int)-10, (int)0);
1320     WO_TEST_INTS_EQUAL((int)-100, (int)200);
1321     WO_TEST_INTS_EQUAL((int)-200, (int)-400);
1322     WO_TEST_INTS_EQUAL((int)-1350000, (int)1350000);
1323
1324     WO_TEST_INTS_NOT_EQUAL((int)1, (int)1);
1325     WO_TEST_INTS_NOT_EQUAL((int)-2, (int)-2);
1326     WO_TEST_INTS_NOT_EQUAL((int)4, (int)4);
1327     WO_TEST_INTS_NOT_EQUAL((int)-8, (int)-8);
1328     WO_TEST_INTS_NOT_EQUAL((int)10, (int)10);
1329     WO_TEST_INTS_NOT_EQUAL((int)-100, (int)-100);
1330     WO_TEST_INTS_NOT_EQUAL((int)1350000, (int)1350000);
1331     WO_TEST_INTS_NOT_EQUAL((int)2000000, (int)2000000);
1332
1333     WO_TEST_INT_GREATER_THAN((int)1, (int)1);
1334     WO_TEST_INT_GREATER_THAN((int)10, (int)12);
1335     WO_TEST_INT_GREATER_THAN((int)0, (int)4);
1336     WO_TEST_INT_GREATER_THAN((int)-20, (int)40);
1337     WO_TEST_INT_GREATER_THAN((int)1000, (int)1200);
1338     WO_TEST_INT_GREATER_THAN((int)999, (int)1000);
1339     WO_TEST_INT_GREATER_THAN((int)1350000, (int)5000000);
1340     WO_TEST_INT_GREATER_THAN((int)-5000000, (int)5000000);
1341
1342     WO_TEST_INT_NOT_GREATER_THAN((int)1, (int)0);
1343     WO_TEST_INT_NOT_GREATER_THAN((int)2, (int)1);
1344     WO_TEST_INT_NOT_GREATER_THAN((int)1, (int)-10);
1345     WO_TEST_INT_NOT_GREATER_THAN((int)1, (int)-1);
1346     WO_TEST_INT_NOT_GREATER_THAN((int)1500000, (int)1200);
1347     WO_TEST_INT_NOT_GREATER_THAN((int)-400, (int)-500);
1348     WO_TEST_INT_NOT_GREATER_THAN((int)-1599, (int)-1600);
1349     WO_TEST_INT_NOT_GREATER_THAN((int)400, (int)1);
1350
1351     WO_TEST_INT_LESS_THAN((int)1, (int)0);
1352     WO_TEST_INT_LESS_THAN((int)2, (int)1);
1353     WO_TEST_INT_LESS_THAN((int)0, (int)-1);
1354     WO_TEST_INT_LESS_THAN((int)1, (int)-1);
1355     WO_TEST_INT_LESS_THAN((int)2, (int)-1);
1356     WO_TEST_INT_LESS_THAN((int)1001, (int)1000);
1357     WO_TEST_INT_LESS_THAN((int)1000000, (int)1350);
1358     WO_TEST_INT_LESS_THAN((int)1, (int)-5000000);
1359
1360     WO_TEST_INT_NOT_LESS_THAN((int)0, (int)1);
1361     WO_TEST_INT_NOT_LESS_THAN((int)1, (int)2);
1362     WO_TEST_INT_NOT_LESS_THAN((int)2, (int)3);
1363     WO_TEST_INT_NOT_LESS_THAN((int)-2, (int)-1);
1364     WO_TEST_INT_NOT_LESS_THAN((int)-1, (int)12);
1365     WO_TEST_INT_NOT_LESS_THAN((int)1000, (int)2000);
1366     WO_TEST_INT_NOT_LESS_THAN((int)2000, (int)5000);
1367     WO_TEST_INT_NOT_LESS_THAN((int)-16000, (int)-12000);
1368
1369     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1370 }
1371
1372 - (void)testUnsignedTests
1373 {
1374     // should pass
1375
1376     WO_TEST_UNSIGNED_ZERO((unsigned)0);
1377
1378     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)1);
1379     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)2);
1380     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)200);
1381     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)50000);
1382     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)60000);
1383     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)65200);
1384     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)100000);
1385     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)5000000);
1386
1387     WO_TEST_UNSIGNEDS_EQUAL((unsigned)0, (unsigned)0);
1388     WO_TEST_UNSIGNEDS_EQUAL((unsigned)2, (unsigned)2);
1389     WO_TEST_UNSIGNEDS_EQUAL((unsigned)20, (unsigned)20);
1390     WO_TEST_UNSIGNEDS_EQUAL((unsigned)1000, (unsigned)1000);
1391     WO_TEST_UNSIGNEDS_EQUAL((unsigned)10000, (unsigned)10000);
1392     WO_TEST_UNSIGNEDS_EQUAL((unsigned)23000, (unsigned)23000);
1393     WO_TEST_UNSIGNEDS_EQUAL((unsigned)165200, (unsigned)165200);
1394     WO_TEST_UNSIGNEDS_EQUAL((unsigned)1350000, (unsigned)1350000);
1395
1396     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)1, (unsigned)2);
1397     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)2, (unsigned)1);
1398     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)10, (unsigned)20);
1399     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)200, (unsigned)100);
1400     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)1, (unsigned)0);
1401     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)0, (unsigned)1);
1402     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)10, (unsigned)1230);
1403     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)100, (unsigned)200);
1404
1405     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)1, (unsigned)0);
1406     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)10, (unsigned)5);
1407     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)6, (unsigned)5);
1408     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)20, (unsigned)4);
1409     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)1000, (unsigned)1);
1410     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)1000, (unsigned)999);
1411     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)1350000, (unsigned)5000);
1412     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)5000000, (unsigned)50);
1413
1414     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)1, (unsigned)1);
1415     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)1, (unsigned)2);
1416     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)0, (unsigned)1);
1417     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)1, (unsigned)3);
1418     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)1500, (unsigned)120000);
1419     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)500, (unsigned)4500);
1420     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)1599, (unsigned)1600);
1421     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)400, (unsigned)400);
1422
1423     WO_TEST_UNSIGNED_LESS_THAN((unsigned)0, (unsigned)1);
1424     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1, (unsigned)2);
1425     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1, (unsigned)1200);
1426     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1, (unsigned)4);
1427     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1, (unsigned)2);
1428     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1000, (unsigned)1001);
1429     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1350, (unsigned)1000000);
1430     WO_TEST_UNSIGNED_LESS_THAN((unsigned)5000000, (unsigned)10000000);
1431
1432     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)0, (unsigned)0);
1433     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)1, (unsigned)0);
1434     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)2, (unsigned)1);
1435     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)1, (unsigned)1);
1436     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)2, (unsigned)2);
1437     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)2000, (unsigned)1000);
1438     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)5000, (unsigned)5000);
1439     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)12000, (unsigned)10000);
1440
1441     // should fail
1442     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1443
1444     WO_TEST_UNSIGNED_ZERO((unsigned)1);
1445     WO_TEST_UNSIGNED_ZERO((unsigned)2);
1446     WO_TEST_UNSIGNED_ZERO((unsigned)200);
1447     WO_TEST_UNSIGNED_ZERO((unsigned)50000);
1448     WO_TEST_UNSIGNED_ZERO((unsigned)10);
1449     WO_TEST_UNSIGNED_ZERO((unsigned)20);
1450     WO_TEST_UNSIGNED_ZERO((unsigned)2000);
1451     WO_TEST_UNSIGNED_ZERO((unsigned)500000);
1452
1453     WO_TEST_UNSIGNED_NOT_ZERO((unsigned)0);
1454
1455     WO_TEST_UNSIGNEDS_EQUAL((unsigned)0, (unsigned)10);
1456     WO_TEST_UNSIGNEDS_EQUAL((unsigned)2, (unsigned)1);
1457     WO_TEST_UNSIGNEDS_EQUAL((unsigned)20, (unsigned)21);
1458     WO_TEST_UNSIGNEDS_EQUAL((unsigned)1000, (unsigned)2000);
1459     WO_TEST_UNSIGNEDS_EQUAL((unsigned)10, (unsigned)0);
1460     WO_TEST_UNSIGNEDS_EQUAL((unsigned)100, (unsigned)200);
1461     WO_TEST_UNSIGNEDS_EQUAL((unsigned)200, (unsigned)400);
1462     WO_TEST_UNSIGNEDS_EQUAL((unsigned)1350001, (unsigned)1350000);
1463
1464     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)1, (unsigned)1);
1465     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)2, (unsigned)2);
1466     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)4, (unsigned)4);
1467     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)8, (unsigned)8);
1468     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)10, (unsigned)10);
1469     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)100, (unsigned)100);
1470     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)1350000, (unsigned)1350000);
1471     WO_TEST_UNSIGNEDS_NOT_EQUAL((unsigned)2000000, (unsigned)2000000);
1472
1473     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)1, (unsigned)1);
1474     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)10, (unsigned)12);
1475     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)0, (unsigned)4);
1476     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)20, (unsigned)40);
1477     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)1000, (unsigned)1200);
1478     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)999, (unsigned)1000);
1479     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)1350000, (unsigned)5000000);
1480     WO_TEST_UNSIGNED_GREATER_THAN((unsigned)5000000, (unsigned)5000000);
1481
1482     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)1, (unsigned)0);
1483     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)2, (unsigned)1);
1484     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)11, (unsigned)10);
1485     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)2, (unsigned)0);
1486     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)1500000, (unsigned)1200);
1487     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)600, (unsigned)599);
1488     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)1600, (unsigned)1599);
1489     WO_TEST_UNSIGNED_NOT_GREATER_THAN((unsigned)400, (unsigned)1);
1490
1491     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1, (unsigned)0);
1492     WO_TEST_UNSIGNED_LESS_THAN((unsigned)2, (unsigned)1);
1493     WO_TEST_UNSIGNED_LESS_THAN((unsigned)0, (unsigned)0);
1494     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1, (unsigned)0);
1495     WO_TEST_UNSIGNED_LESS_THAN((unsigned)12, (unsigned)0);
1496     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1001, (unsigned)1000);
1497     WO_TEST_UNSIGNED_LESS_THAN((unsigned)1000000, (unsigned)1350);
1498     WO_TEST_UNSIGNED_LESS_THAN((unsigned)12, (unsigned)4);
1499
1500     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)0, (unsigned)1);
1501     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)1, (unsigned)2);
1502     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)2, (unsigned)3);
1503     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)2, (unsigned)5);
1504     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)1, (unsigned)12);
1505     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)1000, (unsigned)2000);
1506     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)2000, (unsigned)5000);
1507     WO_TEST_UNSIGNED_NOT_LESS_THAN((unsigned)16000, (unsigned)18000);
1508
1509     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1510 }
1511
1512 - (void)testFloatTests
1513 {
1514     // should pass
1515
1516     WO_TEST_FLOAT_POSITIVE((float)1);
1517     WO_TEST_FLOAT_POSITIVE((float)2);
1518     WO_TEST_FLOAT_POSITIVE((float)5);
1519     WO_TEST_FLOAT_POSITIVE((float)10);
1520     WO_TEST_FLOAT_POSITIVE((float)200);
1521     WO_TEST_FLOAT_POSITIVE((float)1000);
1522     WO_TEST_FLOAT_POSITIVE((float)50000);
1523     WO_TEST_FLOAT_POSITIVE((float)1350000);
1524
1525     WO_TEST_FLOAT_NEGATIVE((float)-1);
1526     WO_TEST_FLOAT_NEGATIVE((float)-2);
1527     WO_TEST_FLOAT_NEGATIVE((float)-5);
1528     WO_TEST_FLOAT_NEGATIVE((float)-10);
1529     WO_TEST_FLOAT_NEGATIVE((float)-200);
1530     WO_TEST_FLOAT_NEGATIVE((float)-1000);
1531     WO_TEST_FLOAT_NEGATIVE((float)-50000);
1532     WO_TEST_FLOAT_NEGATIVE((float)-1350000);
1533
1534     WO_TEST_FLOAT_ZERO((float)0);
1535
1536     WO_TEST_FLOAT_NOT_ZERO((float)1);
1537     WO_TEST_FLOAT_NOT_ZERO((float)2);
1538     WO_TEST_FLOAT_NOT_ZERO((float)200);
1539     WO_TEST_FLOAT_NOT_ZERO((float)50000);
1540     WO_TEST_FLOAT_NOT_ZERO((float)-1);
1541     WO_TEST_FLOAT_NOT_ZERO((float)-2);
1542     WO_TEST_FLOAT_NOT_ZERO((float)-200);
1543     WO_TEST_FLOAT_NOT_ZERO((float)-50000);
1544
1545     WO_TEST_FLOATS_EQUAL((float)0, 0);
1546     WO_TEST_FLOATS_EQUAL((float)2, 2);
1547     WO_TEST_FLOATS_EQUAL((float)20, 20);
1548     WO_TEST_FLOATS_EQUAL((float)1000, 1000);
1549     WO_TEST_FLOATS_EQUAL((float)-10, -10);
1550     WO_TEST_FLOATS_EQUAL((float)-100, -100);
1551     WO_TEST_FLOATS_EQUAL((float)-200, -200);
1552     WO_TEST_FLOATS_EQUAL((float)-1350000, -1350000);
1553
1554     WO_TEST_FLOATS_NOT_EQUAL((float)1, 2);
1555     WO_TEST_FLOATS_NOT_EQUAL((float)2, 1);
1556     WO_TEST_FLOATS_NOT_EQUAL((float)10, 20);
1557     WO_TEST_FLOATS_NOT_EQUAL((float)200, 100);
1558     WO_TEST_FLOATS_NOT_EQUAL((float)-1, 0);
1559     WO_TEST_FLOATS_NOT_EQUAL((float)0, -1);
1560     WO_TEST_FLOATS_NOT_EQUAL((float)-10, 10);
1561     WO_TEST_FLOATS_NOT_EQUAL((float)-100, -200);
1562
1563     WO_TEST_FLOAT_GREATER_THAN((float)1, 0);
1564     WO_TEST_FLOAT_GREATER_THAN((float)10, 5);
1565     WO_TEST_FLOAT_GREATER_THAN((float)0, -5);
1566     WO_TEST_FLOAT_GREATER_THAN((float)20, -40);
1567     WO_TEST_FLOAT_GREATER_THAN((float)1000, 1);
1568     WO_TEST_FLOAT_GREATER_THAN((float)1000, 999);
1569     WO_TEST_FLOAT_GREATER_THAN((float)1350000, 5000);
1570     WO_TEST_FLOAT_GREATER_THAN((float)5000000, -5000000);
1571
1572     WO_TEST_FLOAT_NOT_GREATER_THAN((float)1, 1);
1573     WO_TEST_FLOAT_NOT_GREATER_THAN((float)1, 2);
1574     WO_TEST_FLOAT_NOT_GREATER_THAN((float)0, 1);
1575     WO_TEST_FLOAT_NOT_GREATER_THAN((float)-1, 1);
1576     WO_TEST_FLOAT_NOT_GREATER_THAN((float)1500, 120000);
1577     WO_TEST_FLOAT_NOT_GREATER_THAN((float)-500, -400);
1578     WO_TEST_FLOAT_NOT_GREATER_THAN((float)-1600, -1599);
1579     WO_TEST_FLOAT_NOT_GREATER_THAN((float)400, 400);
1580
1581     WO_TEST_FLOAT_LESS_THAN((float)0, 1);
1582     WO_TEST_FLOAT_LESS_THAN((float)1, 2);
1583     WO_TEST_FLOAT_LESS_THAN((float)-1, 0);
1584     WO_TEST_FLOAT_LESS_THAN((float)-1, 1);
1585     WO_TEST_FLOAT_LESS_THAN((float)-1, 2);
1586     WO_TEST_FLOAT_LESS_THAN((float)1000, 1001);
1587     WO_TEST_FLOAT_LESS_THAN((float)1350, 1000000);
1588     WO_TEST_FLOAT_LESS_THAN((float)-5000000, 1);
1589
1590     WO_TEST_FLOAT_NOT_LESS_THAN((float)0, 0);
1591     WO_TEST_FLOAT_NOT_LESS_THAN((float)1, 0);
1592     WO_TEST_FLOAT_NOT_LESS_THAN((float)2, 1);
1593     WO_TEST_FLOAT_NOT_LESS_THAN((float)-1, -1);
1594     WO_TEST_FLOAT_NOT_LESS_THAN((float)-1, -2);
1595     WO_TEST_FLOAT_NOT_LESS_THAN((float)2000, 1000);
1596     WO_TEST_FLOAT_NOT_LESS_THAN((float)5000, 5000);
1597     WO_TEST_FLOAT_NOT_LESS_THAN((float)-10000, -12000);
1598
1599     // should fail
1600     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1601
1602
1603
1604     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1605 }
1606
1607 - (void)testFloatWithErrorMarginTests
1608 {
1609     // should pass
1610
1611     // should fail
1612     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1613
1614
1615
1616     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1617 }
1618
1619 - (void)testDoubleTests
1620 {
1621     // should pass
1622
1623     // should fail
1624     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1625
1626
1627
1628     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1629 }
1630
1631 - (void)testDoubleWithErrorMarginTests
1632 {
1633     // should pass
1634
1635     // should fail
1636     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1637
1638
1639
1640     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1641 }
1642
1643 - (void)testObjectTests
1644 {
1645     // should pass
1646
1647
1648     // should freak out if object does not conform to NSObject protocol
1649
1650
1651
1652     // should fail
1653     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1654
1655
1656
1657     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1658 }
1659
1660 - (void)testStringTests
1661 {
1662     // should pass
1663
1664
1665     // should freak out if object does not conform to NSObject protocol
1666
1667     // should throw an exception when passed an object that is not a subclass of NSString
1668
1669     // specifically should throw an WO_TEST_CLASS_MISMATCH_EXCEPTION
1670
1671     // should handle nil string1
1672
1673     // should handle nil string2
1674
1675     // should handle nil string1 and nil string2
1676
1677     // should handle empty string1
1678
1679     // should handle empty string2
1680
1681     // should handle empty string1 and empty string2
1682
1683     // shorthand macros should work
1684
1685
1686     // in the case of prefix, suffix and contains tests should die if passed nil "expected" parameter
1687
1688     // should fail
1689     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1690
1691
1692
1693     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1694 }
1695
1696 - (void)testArrayTests
1697 {
1698     // should pass
1699
1700     // should fail
1701     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1702
1703
1704
1705     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1706 }
1707
1708 - (void)testDictionaryTests
1709 {
1710     // should pass
1711
1712     // should fail
1713     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1714
1715
1716
1717     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1718 }
1719
1720 - (void)testShorthandMacros
1721 {
1722     // make sure that the shorthand and longhand test macros are equivalent
1723
1724     // should pass
1725     WO_TEST_TRUE(YES);
1726     WO_TEST(YES);
1727
1728     WO_TEST_EQUAL(100, 100);
1729     WO_TEST_EQ(100, 100);
1730
1731     WO_TEST_NOT_EQUAL(100, 101);
1732     WO_TEST_NE(100, 101);
1733
1734     WO_TEST_GREATER_THAN(200, 100);
1735     WO_TEST_GT(200, 100);
1736
1737     WO_TEST_NOT_GREATER_THAN(100, 200);
1738     WO_TEST_LTE(100, 200);
1739     WO_TEST_NGT(100, 200);
1740
1741     WO_TEST_NOT_GREATER_THAN(100, 100);
1742     WO_TEST_LTE(100, 100);
1743     WO_TEST_NGT(100, 100);
1744
1745     WO_TEST_LESS_THAN(100, 200);
1746     WO_TEST_LT(100, 200);
1747
1748     WO_TEST_NOT_LESS_THAN(200, 100);
1749     WO_TEST_GTE(200, 100);
1750     WO_TEST_NLT(200, 100);
1751
1752     WO_TEST_NOT_LESS_THAN(100, 100);
1753     WO_TEST_GTE(100, 100);
1754     WO_TEST_NLT(100, 100);
1755
1756     // should fail
1757     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1758
1759     WO_TEST_TRUE(NO);
1760     WO_TEST(NO);
1761
1762     WO_TEST_EQUAL(100, 200);
1763     WO_TEST_EQ(100, 200);
1764
1765     WO_TEST_NOT_EQUAL(100, 100);
1766     WO_TEST_NE(100, 100);
1767
1768     WO_TEST_GREATER_THAN(100, 200);
1769     WO_TEST_GT(100, 200);
1770
1771     WO_TEST_NOT_GREATER_THAN(200, 100);
1772     WO_TEST_LTE(200, 100);
1773     WO_TEST_NGT(200, 100);
1774
1775     WO_TEST_LESS_THAN(200, 100);
1776     WO_TEST_LT(200, 100);
1777
1778     WO_TEST_NOT_LESS_THAN(100, 200);
1779     WO_TEST_GTE(100, 200);
1780     WO_TEST_NLT(100, 200);
1781
1782     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1783 }
1784
1785 - (void)testExceptionTests
1786 {
1787     // should pass
1788     WO_TEST_THROWS([self throwException]);
1789     WO_TEST_THROWS([self raiseException]);
1790     WO_TEST_THROWS([self throwWOEnigmaException]);
1791     WO_TEST_THROWS([self throwString]);
1792
1793     // BUG: busted on Leopard
1794     //WO_TEST_THROWS([self throwWORootClassObject]);
1795     WO_TEST_THROWS([self throwObject]);
1796     WO_TEST_THROWS([self makeCocoaThrowException]);
1797     WO_TEST_THROWS([self makeCocoaThrowNSRangeException]);
1798
1799     WO_TEST_DOES_NOT_THROW([self doNotThrowException]);
1800
1801     WO_TEST_THROWS_EXCEPTION_NAMED
1802         ([self throwWOEnigmaException], @"WOEnigmaException");
1803     WO_TEST_THROWS_EXCEPTION_NAMED([self throwString], @"party");
1804
1805     WO_TEST_DOES_NOT_THROW_EXCEPTION_NAMED([self doNotThrowException], @"Roy");
1806     WO_TEST_DOES_NOT_THROW_EXCEPTION_NAMED([self throwException], @"Other");
1807
1808     // BUG: busted on Leopard
1809     //WO_TEST_DOES_NOT_THROW_EXCEPTION_NAMED([self throwWORootClassObject], @"x");
1810     //WO_TEST_THROWS_EXCEPTION_NAMED([self throwWORootClassObject], @"WORootClass");
1811
1812     // should fail
1813     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
1814
1815     WO_TEST_DOES_NOT_THROW([self throwException]);
1816     WO_TEST_DOES_NOT_THROW([self raiseException]);
1817     WO_TEST_DOES_NOT_THROW([self throwWOEnigmaException]);
1818     WO_TEST_DOES_NOT_THROW([self throwString]);
1819
1820     // BUG: Busted on Leopard
1821     //WO_TEST_DOES_NOT_THROW([self throwWORootClassObject]);
1822     WO_TEST_DOES_NOT_THROW([self throwObject]);
1823     WO_TEST_DOES_NOT_THROW([self makeCocoaThrowException]);
1824     WO_TEST_DOES_NOT_THROW([self makeCocoaThrowNSRangeException]);
1825
1826     WO_TEST_THROWS([self doNotThrowException]);
1827
1828     WO_TEST_DOES_NOT_THROW_EXCEPTION_NAMED
1829         ([self throwWOEnigmaException], @"WOEnigmaException");
1830     WO_TEST_DOES_NOT_THROW_EXCEPTION_NAMED([self throwString], @"party");
1831
1832     WO_TEST_THROWS_EXCEPTION_NAMED([self doNotThrowException], @"Roy");
1833     WO_TEST_THROWS_EXCEPTION_NAMED([self throwException], @"Other");
1834
1835     // BUG: busted on Leopard
1836     //WO_TEST_THROWS_EXCEPTION_NAMED([self throwWORootClassObject], @"x");
1837     //WO_TEST_DOES_NOT_THROW_EXCEPTION_NAMED([self throwWORootClassObject], @"WORootClass");
1838
1839     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO]; // restore to default
1840 }
1841
1842 - (void)testLowLevelExceptionTests
1843 {
1844     // BUG: this stuff busted on Leopard
1845     return;
1846
1847     [WO_TEST_SHARED_INSTANCE setExpectLowLevelExceptions:YES];  // will be reset to NO in preflight prior to next method
1848     WO_TEST_PASS;                                               // force update of "lastKnownLocation"
1849     id *object = NULL;                                          // cause a crash, but WOTest should keep running
1850     *object = @"foo";                                           // SIGBUS here
1851     WO_TEST_FAIL;                                               // this line never reached
1852 }
1853
1854 - (void)throwException
1855 {
1856     @throw [NSException exceptionWithName:@"WOBettySmithException" reason:@"None" userInfo:nil];
1857 }
1858
1859 - (void)raiseException
1860 {
1861     [NSException raise:@"Bob" format:@"Unexpected Bob Exception"];
1862 }
1863
1864 - (void)throwWOEnigmaException
1865 {
1866     [NSException raise:@"WOEnigmaException" format:@"Reason"];
1867 }
1868
1869 - (void)throwString
1870 {
1871     NSString *party = @"party";
1872     @throw party;
1873 }
1874
1875 - (void)throwWORootClassObject
1876 {
1877     @throw [WORootClass new];
1878 }
1879
1880 - (void)throwObject
1881 {
1882     @throw [[Object alloc] init];
1883 }
1884
1885 - (void)doNotThrowException
1886 {
1887     [NSDate date];
1888 }
1889
1890 - (void)makeCocoaThrowException
1891 {
1892     // should throw NSInvalidArgumentException
1893     (void)[[NSString alloc] initWithFormat:nil];
1894 }
1895
1896 - (void)makeCocoaThrowNSRangeException
1897 {
1898     [@"short string" characterAtIndex:2000];
1899 }
1900
1901 - (void)testRandomValueGeneratorMethods
1902 {
1903     // should pass
1904     WO_TEST_PASS;
1905
1906     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE anInt]);
1907     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aPositiveInt]);
1908     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aNegativeInt]);
1909     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aZeroInt]);
1910     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aBigInt]);
1911     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aBigPositiveInt]);
1912     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aBigNegativeInt]);
1913     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aSmallInt]);
1914     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aSmallPositiveInt]);
1915     WO_TEST_IS_INT([WO_TEST_SHARED_INSTANCE aSmallNegativeInt]);
1916
1917     WO_TEST_IS_UNSIGNED([WO_TEST_SHARED_INSTANCE anUnsigned]);
1918     WO_TEST_IS_UNSIGNED([WO_TEST_SHARED_INSTANCE aZeroUnsigned]);
1919     WO_TEST_IS_UNSIGNED([WO_TEST_SHARED_INSTANCE aBigUnsigned]);
1920     WO_TEST_IS_UNSIGNED([WO_TEST_SHARED_INSTANCE aSmallUnsigned]);
1921
1922     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aFloat]);
1923     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aPositiveFloat]);
1924     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aNegativeFloat]);
1925     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aZeroFloat]);
1926     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aBigFloat]);
1927     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aBigPositiveFloat]);
1928     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aBigNegativeFloat]);
1929     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aSmallFloat]);
1930     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aSmallPositiveFloat]);
1931     WO_TEST_IS_FLOAT([WO_TEST_SHARED_INSTANCE aSmallNegativeFloat]);
1932
1933     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aDouble]);
1934     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aPositiveDouble]);
1935     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aNegativeDouble]);
1936     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aZeroDouble]);
1937     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aBigDouble]);
1938     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aBigPositiveDouble]);
1939     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aBigNegativeDouble]);
1940     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aSmallDouble]);
1941     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aSmallPositiveDouble]);
1942     WO_TEST_IS_DOUBLE([WO_TEST_SHARED_INSTANCE aSmallNegativeDouble]);
1943
1944     WO_TEST_INT_POSITIVE([WO_TEST_SHARED_INSTANCE aPositiveInt]);
1945     WO_TEST_INT_NEGATIVE([WO_TEST_SHARED_INSTANCE aNegativeInt]);
1946     WO_TEST_INT_ZERO([WO_TEST_SHARED_INSTANCE aZeroInt]);
1947
1948     WO_TEST_INT_NOT_LESS_THAN(abs([WO_TEST_SHARED_INSTANCE aBigInt]),
1949                               (WO_BIG_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1950     WO_TEST_INT_NOT_LESS_THAN([WO_TEST_SHARED_INSTANCE aBigPositiveInt],
1951                               (WO_BIG_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1952     WO_TEST_INT_NOT_GREATER_THAN([WO_TEST_SHARED_INSTANCE aBigNegativeInt],
1953                                  (-WO_BIG_TEST_VALUE + WO_RANDOMIZATION_RANGE));
1954
1955     WO_TEST_INT_NOT_LESS_THAN(abs([WO_TEST_SHARED_INSTANCE aSmallInt]),
1956                               (WO_SMALL_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1957     WO_TEST_INT_NOT_LESS_THAN([WO_TEST_SHARED_INSTANCE aSmallPositiveInt],
1958                               (WO_SMALL_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1959     WO_TEST_INT_NOT_GREATER_THAN([WO_TEST_SHARED_INSTANCE aSmallNegativeInt],
1960                                  (-WO_SMALL_TEST_VALUE + WO_RANDOMIZATION_RANGE));
1961
1962     WO_TEST_UNSIGNED_ZERO([WO_TEST_SHARED_INSTANCE aZeroUnsigned]);
1963
1964     WO_TEST_UNSIGNED_NOT_LESS_THAN([WO_TEST_SHARED_INSTANCE aBigUnsigned],
1965                                    (WO_BIG_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1966
1967     WO_TEST_UNSIGNED_NOT_LESS_THAN([WO_TEST_SHARED_INSTANCE aSmallUnsigned],
1968                                    (WO_SMALL_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1969
1970     WO_TEST_FLOAT_POSITIVE([WO_TEST_SHARED_INSTANCE aPositiveFloat]);
1971     WO_TEST_FLOAT_NEGATIVE([WO_TEST_SHARED_INSTANCE aNegativeFloat]);
1972     WO_TEST_FLOAT_ZERO([WO_TEST_SHARED_INSTANCE aZeroFloat]);
1973
1974     WO_TEST_FLOAT_NOT_LESS_THAN(fabsf([WO_TEST_SHARED_INSTANCE aBigFloat]),
1975                                 (WO_BIG_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1976     WO_TEST_FLOAT_NOT_LESS_THAN([WO_TEST_SHARED_INSTANCE aBigPositiveFloat],
1977                                 (WO_BIG_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1978     WO_TEST_FLOAT_NOT_GREATER_THAN([WO_TEST_SHARED_INSTANCE aBigNegativeFloat],
1979                                    (-WO_BIG_TEST_VALUE + WO_RANDOMIZATION_RANGE));
1980
1981     WO_TEST_FLOAT_NOT_LESS_THAN(fabsf([WO_TEST_SHARED_INSTANCE aSmallFloat]),
1982                                 (WO_SMALL_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1983     WO_TEST_FLOAT_NOT_LESS_THAN([WO_TEST_SHARED_INSTANCE aSmallPositiveFloat],
1984                                 (WO_SMALL_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1985     WO_TEST_FLOAT_NOT_GREATER_THAN([WO_TEST_SHARED_INSTANCE aSmallNegativeFloat],
1986                                    (-WO_SMALL_TEST_VALUE + WO_RANDOMIZATION_RANGE));
1987
1988     WO_TEST_DOUBLE_POSITIVE([WO_TEST_SHARED_INSTANCE aPositiveDouble]);
1989     WO_TEST_DOUBLE_NEGATIVE([WO_TEST_SHARED_INSTANCE aNegativeDouble]);
1990     WO_TEST_DOUBLE_ZERO([WO_TEST_SHARED_INSTANCE aZeroDouble]);
1991
1992     WO_TEST_DOUBLE_NOT_LESS_THAN(fabs([WO_TEST_SHARED_INSTANCE aBigDouble]),
1993                                  (WO_BIG_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1994     WO_TEST_DOUBLE_NOT_LESS_THAN([WO_TEST_SHARED_INSTANCE aBigPositiveDouble],
1995                                  (WO_BIG_TEST_VALUE - WO_RANDOMIZATION_RANGE));
1996     WO_TEST_DOUBLE_NOT_GREATER_THAN([WO_TEST_SHARED_INSTANCE aBigNegativeDouble],
1997                                     (-WO_BIG_TEST_VALUE + WO_RANDOMIZATION_RANGE));
1998
1999     WO_TEST_DOUBLE_NOT_LESS_THAN(fabs([WO_TEST_SHARED_INSTANCE aSmallDouble]),
2000                                  (WO_SMALL_TEST_VALUE - WO_RANDOMIZATION_RANGE));
2001     WO_TEST_DOUBLE_NOT_LESS_THAN([WO_TEST_SHARED_INSTANCE aSmallPositiveDouble],
2002                                  (WO_SMALL_TEST_VALUE - WO_RANDOMIZATION_RANGE));
2003     WO_TEST_DOUBLE_NOT_GREATER_THAN([WO_TEST_SHARED_INSTANCE aSmallNegativeDouble],
2004                                     (-WO_SMALL_TEST_VALUE + WO_RANDOMIZATION_RANGE));
2005
2006     // should fail
2007     [WO_TEST_SHARED_INSTANCE setExpectFailures:YES];
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019     [WO_TEST_SHARED_INSTANCE setExpectFailures:NO];
2020 }
2021
2022 @end