xref: /aosp_15_r20/external/google-breakpad/src/common/mac/testing/GTMSenTestCase.h (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle //
2*9712c20fSFrederick Mayle //  GTMSenTestCase.h
3*9712c20fSFrederick Mayle //
4*9712c20fSFrederick Mayle //  Copyright 2007-2008 Google LLC
5*9712c20fSFrederick Mayle //
6*9712c20fSFrederick Mayle //  Licensed under the Apache License, Version 2.0 (the "License"); you may not
7*9712c20fSFrederick Mayle //  use this file except in compliance with the License.  You may obtain a copy
8*9712c20fSFrederick Mayle //  of the License at
9*9712c20fSFrederick Mayle //
10*9712c20fSFrederick Mayle //  http://www.apache.org/licenses/LICENSE-2.0
11*9712c20fSFrederick Mayle //
12*9712c20fSFrederick Mayle //  Unless required by applicable law or agreed to in writing, software
13*9712c20fSFrederick Mayle //  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14*9712c20fSFrederick Mayle //  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
15*9712c20fSFrederick Mayle //  License for the specific language governing permissions and limitations under
16*9712c20fSFrederick Mayle //  the License.
17*9712c20fSFrederick Mayle //
18*9712c20fSFrederick Mayle 
19*9712c20fSFrederick Mayle // Portions of this file fall under the following license, marked with
20*9712c20fSFrederick Mayle // SENTE_BEGIN - SENTE_END
21*9712c20fSFrederick Mayle //
22*9712c20fSFrederick Mayle // Copyright (c) 1997-2005, Sen:te (Sente SA).  All rights reserved.
23*9712c20fSFrederick Mayle //
24*9712c20fSFrederick Mayle // Use of this source code is governed by the following license:
25*9712c20fSFrederick Mayle //
26*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without modification,
27*9712c20fSFrederick Mayle // are permitted provided that the following conditions are met:
28*9712c20fSFrederick Mayle //
29*9712c20fSFrederick Mayle // (1) Redistributions of source code must retain the above copyright notice,
30*9712c20fSFrederick Mayle // this list of conditions and the following disclaimer.
31*9712c20fSFrederick Mayle //
32*9712c20fSFrederick Mayle // (2) Redistributions in binary form must reproduce the above copyright notice,
33*9712c20fSFrederick Mayle // this list of conditions and the following disclaimer in the documentation
34*9712c20fSFrederick Mayle // and/or other materials provided with the distribution.
35*9712c20fSFrederick Mayle //
36*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
37*9712c20fSFrederick Mayle // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
38*9712c20fSFrederick Mayle // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
39*9712c20fSFrederick Mayle // IN NO EVENT SHALL Sente SA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
41*9712c20fSFrederick Mayle // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
42*9712c20fSFrederick Mayle // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
43*9712c20fSFrederick Mayle // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
44*9712c20fSFrederick Mayle // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45*9712c20fSFrederick Mayle //
46*9712c20fSFrederick Mayle // Note: this license is equivalent to the FreeBSD license.
47*9712c20fSFrederick Mayle //
48*9712c20fSFrederick Mayle // This notice may not be removed from this file.
49*9712c20fSFrederick Mayle 
50*9712c20fSFrederick Mayle // Some extra test case macros that would have been convenient for SenTestingKit
51*9712c20fSFrederick Mayle // to provide. I didn't stick GTM in front of the Macro names, so that they would
52*9712c20fSFrederick Mayle // be easy to remember.
53*9712c20fSFrederick Mayle 
54*9712c20fSFrederick Mayle #import "GTMDefines.h"
55*9712c20fSFrederick Mayle 
56*9712c20fSFrederick Mayle #if (!GTM_IPHONE_SDK) || (GTM_IPHONE_USE_SENTEST)
57*9712c20fSFrederick Mayle #import <SenTestingKit/SenTestingKit.h>
58*9712c20fSFrederick Mayle #else
59*9712c20fSFrederick Mayle #import <Foundation/Foundation.h>
60*9712c20fSFrederick Mayle #ifdef __cplusplus
61*9712c20fSFrederick Mayle extern "C" {
62*9712c20fSFrederick Mayle #endif
63*9712c20fSFrederick Mayle 
64*9712c20fSFrederick Mayle #if defined __clang__
65*9712c20fSFrederick Mayle // gcc and gcc-llvm do not allow you to use STAssert(blah, nil) with nil
66*9712c20fSFrederick Mayle // as a description if you have the NS_FORMAT_FUNCTION on.
67*9712c20fSFrederick Mayle // clang however will not compile without warnings if you don't have it.
68*9712c20fSFrederick Mayle NSString *STComposeString(NSString *, ...) NS_FORMAT_FUNCTION(1, 2);
69*9712c20fSFrederick Mayle #else
70*9712c20fSFrederick Mayle NSString *STComposeString(NSString *, ...);
71*9712c20fSFrederick Mayle #endif  // __clang__
72*9712c20fSFrederick Mayle 
73*9712c20fSFrederick Mayle #ifdef __cplusplus
74*9712c20fSFrederick Mayle }
75*9712c20fSFrederick Mayle #endif
76*9712c20fSFrederick Mayle 
77*9712c20fSFrederick Mayle #endif  // !GTM_IPHONE_SDK || GTM_IPHONE_USE_SENTEST
78*9712c20fSFrederick Mayle 
79*9712c20fSFrederick Mayle // Generates a failure when a1 != noErr
80*9712c20fSFrederick Mayle //  Args:
81*9712c20fSFrederick Mayle //    a1: should be either an OSErr or an OSStatus
82*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
83*9712c20fSFrederick Mayle //                 an empty string but must be present.
84*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
85*9712c20fSFrederick Mayle #define STAssertNoErr(a1, description, ...) \
86*9712c20fSFrederick Mayle do { \
87*9712c20fSFrederick Mayle   @try { \
88*9712c20fSFrederick Mayle     OSStatus a1value = (a1); \
89*9712c20fSFrederick Mayle     if (a1value != noErr) { \
90*9712c20fSFrederick Mayle       NSString *_expression = [NSString stringWithFormat:@"Expected noErr, got %ld for (%s)", (long)a1value, #a1]; \
91*9712c20fSFrederick Mayle       [self failWithException:([NSException failureInCondition:_expression \
92*9712c20fSFrederick Mayle                        isTrue:NO \
93*9712c20fSFrederick Mayle                        inFile:[NSString stringWithUTF8String:__FILE__] \
94*9712c20fSFrederick Mayle                        atLine:__LINE__ \
95*9712c20fSFrederick Mayle               withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \
96*9712c20fSFrederick Mayle     } \
97*9712c20fSFrederick Mayle   } \
98*9712c20fSFrederick Mayle   @catch (id anException) { \
99*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == noErr fails", #a1] \
100*9712c20fSFrederick Mayle                                               exception:anException \
101*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
102*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
103*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
104*9712c20fSFrederick Mayle   } \
105*9712c20fSFrederick Mayle } while(0)
106*9712c20fSFrederick Mayle 
107*9712c20fSFrederick Mayle // Generates a failure when a1 != a2
108*9712c20fSFrederick Mayle //  Args:
109*9712c20fSFrederick Mayle //    a1: received value. Should be either an OSErr or an OSStatus
110*9712c20fSFrederick Mayle //    a2: expected value. Should be either an OSErr or an OSStatus
111*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
112*9712c20fSFrederick Mayle //                 an empty string but must be present.
113*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
114*9712c20fSFrederick Mayle #define STAssertErr(a1, a2, description, ...) \
115*9712c20fSFrederick Mayle do { \
116*9712c20fSFrederick Mayle   @try { \
117*9712c20fSFrederick Mayle     OSStatus a1value = (a1); \
118*9712c20fSFrederick Mayle     OSStatus a2value = (a2); \
119*9712c20fSFrederick Mayle     if (a1value != a2value) { \
120*9712c20fSFrederick Mayle       NSString *_expression = [NSString stringWithFormat:@"Expected %s(%ld) but got %ld for (%s)", #a2, (long)a2value, (long)a1value, #a1]; \
121*9712c20fSFrederick Mayle       [self failWithException:([NSException failureInCondition:_expression \
122*9712c20fSFrederick Mayle                        isTrue:NO \
123*9712c20fSFrederick Mayle                        inFile:[NSString stringWithUTF8String:__FILE__] \
124*9712c20fSFrederick Mayle                        atLine:__LINE__ \
125*9712c20fSFrederick Mayle               withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \
126*9712c20fSFrederick Mayle     } \
127*9712c20fSFrederick Mayle   } \
128*9712c20fSFrederick Mayle   @catch (id anException) { \
129*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s) fails", #a1, #a2] \
130*9712c20fSFrederick Mayle                                               exception:anException \
131*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
132*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
133*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
134*9712c20fSFrederick Mayle   } \
135*9712c20fSFrederick Mayle } while(0)
136*9712c20fSFrederick Mayle 
137*9712c20fSFrederick Mayle 
138*9712c20fSFrederick Mayle // Generates a failure when a1 is NULL
139*9712c20fSFrederick Mayle //  Args:
140*9712c20fSFrederick Mayle //    a1: should be a pointer (use STAssertNotNil for an object)
141*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
142*9712c20fSFrederick Mayle //                 an empty string but must be present.
143*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
144*9712c20fSFrederick Mayle #define STAssertNotNULL(a1, description, ...) \
145*9712c20fSFrederick Mayle do { \
146*9712c20fSFrederick Mayle   @try { \
147*9712c20fSFrederick Mayle     __typeof__(a1) a1value = (a1); \
148*9712c20fSFrederick Mayle     if (a1value == (__typeof__(a1))NULL) { \
149*9712c20fSFrederick Mayle       NSString *_expression = [NSString stringWithFormat:@"((%s) != NULL)", #a1]; \
150*9712c20fSFrederick Mayle       [self failWithException:([NSException failureInCondition:_expression \
151*9712c20fSFrederick Mayle                        isTrue:NO \
152*9712c20fSFrederick Mayle                        inFile:[NSString stringWithUTF8String:__FILE__] \
153*9712c20fSFrederick Mayle                        atLine:__LINE__ \
154*9712c20fSFrederick Mayle               withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \
155*9712c20fSFrederick Mayle     } \
156*9712c20fSFrederick Mayle   } \
157*9712c20fSFrederick Mayle   @catch (id anException) { \
158*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != NULL fails", #a1] \
159*9712c20fSFrederick Mayle                                               exception:anException \
160*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
161*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
162*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
163*9712c20fSFrederick Mayle   } \
164*9712c20fSFrederick Mayle } while(0)
165*9712c20fSFrederick Mayle 
166*9712c20fSFrederick Mayle // Generates a failure when a1 is not NULL
167*9712c20fSFrederick Mayle //  Args:
168*9712c20fSFrederick Mayle //    a1: should be a pointer (use STAssertNil for an object)
169*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
170*9712c20fSFrederick Mayle //                 an empty string but must be present.
171*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
172*9712c20fSFrederick Mayle #define STAssertNULL(a1, description, ...) \
173*9712c20fSFrederick Mayle do { \
174*9712c20fSFrederick Mayle   @try { \
175*9712c20fSFrederick Mayle     __typeof__(a1) a1value = (a1); \
176*9712c20fSFrederick Mayle     if (a1value != (__typeof__(a1))NULL) { \
177*9712c20fSFrederick Mayle       NSString *_expression = [NSString stringWithFormat:@"((%s) == NULL)", #a1]; \
178*9712c20fSFrederick Mayle       [self failWithException:([NSException failureInCondition:_expression \
179*9712c20fSFrederick Mayle                                                         isTrue:NO \
180*9712c20fSFrederick Mayle                                                         inFile:[NSString stringWithUTF8String:__FILE__] \
181*9712c20fSFrederick Mayle                                                         atLine:__LINE__ \
182*9712c20fSFrederick Mayle                                                withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \
183*9712c20fSFrederick Mayle     } \
184*9712c20fSFrederick Mayle   } \
185*9712c20fSFrederick Mayle   @catch (id anException) { \
186*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == NULL fails", #a1] \
187*9712c20fSFrederick Mayle                                               exception:anException \
188*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
189*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
190*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
191*9712c20fSFrederick Mayle   } \
192*9712c20fSFrederick Mayle } while(0)
193*9712c20fSFrederick Mayle 
194*9712c20fSFrederick Mayle // Generates a failure when a1 is equal to a2. This test is for C scalars,
195*9712c20fSFrederick Mayle // structs and unions.
196*9712c20fSFrederick Mayle //  Args:
197*9712c20fSFrederick Mayle //    a1: argument 1
198*9712c20fSFrederick Mayle //    a2: argument 2
199*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
200*9712c20fSFrederick Mayle //                 an empty string but must be present.
201*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
202*9712c20fSFrederick Mayle #define STAssertNotEquals(a1, a2, description, ...) \
203*9712c20fSFrederick Mayle do { \
204*9712c20fSFrederick Mayle   @try { \
205*9712c20fSFrederick Mayle     if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \
206*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
207*9712c20fSFrederick Mayle                                                   atLine:__LINE__ \
208*9712c20fSFrederick Mayle                                          withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \
209*9712c20fSFrederick Mayle     } else { \
210*9712c20fSFrederick Mayle       __typeof__(a1) a1value = (a1); \
211*9712c20fSFrederick Mayle       __typeof__(a2) a2value = (a2); \
212*9712c20fSFrederick Mayle       NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \
213*9712c20fSFrederick Mayle       NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \
214*9712c20fSFrederick Mayle       if ([a1encoded isEqualToValue:a2encoded]) { \
215*9712c20fSFrederick Mayle         NSString *_expression = [NSString stringWithFormat:@"((%s) != (%s))", #a1, #a2]; \
216*9712c20fSFrederick Mayle         [self failWithException:([NSException failureInCondition:_expression \
217*9712c20fSFrederick Mayle                          isTrue:NO \
218*9712c20fSFrederick Mayle                          inFile:[NSString stringWithUTF8String:__FILE__] \
219*9712c20fSFrederick Mayle                          atLine:__LINE__ \
220*9712c20fSFrederick Mayle                 withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \
221*9712c20fSFrederick Mayle       }\
222*9712c20fSFrederick Mayle     } \
223*9712c20fSFrederick Mayle   } \
224*9712c20fSFrederick Mayle   @catch (id anException) { \
225*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \
226*9712c20fSFrederick Mayle                                               exception:anException \
227*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
228*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
229*9712c20fSFrederick Mayle             withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
230*9712c20fSFrederick Mayle   } \
231*9712c20fSFrederick Mayle } while(0)
232*9712c20fSFrederick Mayle 
233*9712c20fSFrederick Mayle // Generates a failure when a1 is equal to a2. This test is for objects.
234*9712c20fSFrederick Mayle //  Args:
235*9712c20fSFrederick Mayle //    a1: argument 1. object.
236*9712c20fSFrederick Mayle //    a2: argument 2. object.
237*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
238*9712c20fSFrederick Mayle //                 an empty string but must be present.
239*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
240*9712c20fSFrederick Mayle #define STAssertNotEqualObjects(a1, a2, description, ...) \
241*9712c20fSFrederick Mayle do { \
242*9712c20fSFrederick Mayle   @try {\
243*9712c20fSFrederick Mayle     id a1value = (a1); \
244*9712c20fSFrederick Mayle     id a2value = (a2); \
245*9712c20fSFrederick Mayle     if ( (strcmp(@encode(__typeof__(a1value)), @encode(id)) == 0) && \
246*9712c20fSFrederick Mayle          (strcmp(@encode(__typeof__(a2value)), @encode(id)) == 0) && \
247*9712c20fSFrederick Mayle          (![(id)a1value isEqual:(id)a2value]) ) continue; \
248*9712c20fSFrederick Mayle     [self failWithException:([NSException failureInEqualityBetweenObject:a1value \
249*9712c20fSFrederick Mayle                   andObject:a2value \
250*9712c20fSFrederick Mayle                      inFile:[NSString stringWithUTF8String:__FILE__] \
251*9712c20fSFrederick Mayle                      atLine:__LINE__ \
252*9712c20fSFrederick Mayle             withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \
253*9712c20fSFrederick Mayle   }\
254*9712c20fSFrederick Mayle   @catch (id anException) {\
255*9712c20fSFrederick Mayle     [self failWithException:([NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \
256*9712c20fSFrederick Mayle                                                exception:anException \
257*9712c20fSFrederick Mayle                                                   inFile:[NSString stringWithUTF8String:__FILE__] \
258*9712c20fSFrederick Mayle                                                   atLine:__LINE__ \
259*9712c20fSFrederick Mayle                                          withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \
260*9712c20fSFrederick Mayle   }\
261*9712c20fSFrederick Mayle } while(0)
262*9712c20fSFrederick Mayle 
263*9712c20fSFrederick Mayle // Generates a failure when a1 is not 'op' to a2. This test is for C scalars.
264*9712c20fSFrederick Mayle //  Args:
265*9712c20fSFrederick Mayle //    a1: argument 1
266*9712c20fSFrederick Mayle //    a2: argument 2
267*9712c20fSFrederick Mayle //    op: operation
268*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
269*9712c20fSFrederick Mayle //                 an empty string but must be present.
270*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
271*9712c20fSFrederick Mayle #define STAssertOperation(a1, a2, op, description, ...) \
272*9712c20fSFrederick Mayle do { \
273*9712c20fSFrederick Mayle   @try { \
274*9712c20fSFrederick Mayle     if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \
275*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
276*9712c20fSFrederick Mayle                                                   atLine:__LINE__ \
277*9712c20fSFrederick Mayle                                          withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \
278*9712c20fSFrederick Mayle     } else { \
279*9712c20fSFrederick Mayle       __typeof__(a1) a1value = (a1); \
280*9712c20fSFrederick Mayle       __typeof__(a2) a2value = (a2); \
281*9712c20fSFrederick Mayle       if (!(a1value op a2value)) { \
282*9712c20fSFrederick Mayle         double a1DoubleValue = a1value; \
283*9712c20fSFrederick Mayle         double a2DoubleValue = a2value; \
284*9712c20fSFrederick Mayle         NSString *_expression = [NSString stringWithFormat:@"(%s (%lg) %s %s (%lg))", #a1, a1DoubleValue, #op, #a2, a2DoubleValue]; \
285*9712c20fSFrederick Mayle         [self failWithException:([NSException failureInCondition:_expression \
286*9712c20fSFrederick Mayle                          isTrue:NO \
287*9712c20fSFrederick Mayle                          inFile:[NSString stringWithUTF8String:__FILE__] \
288*9712c20fSFrederick Mayle                          atLine:__LINE__ \
289*9712c20fSFrederick Mayle                 withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \
290*9712c20fSFrederick Mayle       } \
291*9712c20fSFrederick Mayle     } \
292*9712c20fSFrederick Mayle   } \
293*9712c20fSFrederick Mayle   @catch (id anException) { \
294*9712c20fSFrederick Mayle     [self failWithException:[NSException \
295*9712c20fSFrederick Mayle              failureInRaise:[NSString stringWithFormat:@"(%s) %s (%s)", #a1, #op, #a2] \
296*9712c20fSFrederick Mayle                   exception:anException \
297*9712c20fSFrederick Mayle                      inFile:[NSString stringWithUTF8String:__FILE__] \
298*9712c20fSFrederick Mayle                      atLine:__LINE__ \
299*9712c20fSFrederick Mayle             withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
300*9712c20fSFrederick Mayle   } \
301*9712c20fSFrederick Mayle } while(0)
302*9712c20fSFrederick Mayle 
303*9712c20fSFrederick Mayle // Generates a failure when a1 is not > a2. This test is for C scalars.
304*9712c20fSFrederick Mayle //  Args:
305*9712c20fSFrederick Mayle //    a1: argument 1
306*9712c20fSFrederick Mayle //    a2: argument 2
307*9712c20fSFrederick Mayle //    op: operation
308*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
309*9712c20fSFrederick Mayle //                 an empty string but must be present.
310*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
311*9712c20fSFrederick Mayle #define STAssertGreaterThan(a1, a2, description, ...) \
312*9712c20fSFrederick Mayle   STAssertOperation(a1, a2, >, description, ##__VA_ARGS__)
313*9712c20fSFrederick Mayle 
314*9712c20fSFrederick Mayle // Generates a failure when a1 is not >= a2. This test is for C scalars.
315*9712c20fSFrederick Mayle //  Args:
316*9712c20fSFrederick Mayle //    a1: argument 1
317*9712c20fSFrederick Mayle //    a2: argument 2
318*9712c20fSFrederick Mayle //    op: operation
319*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
320*9712c20fSFrederick Mayle //                 an empty string but must be present.
321*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
322*9712c20fSFrederick Mayle #define STAssertGreaterThanOrEqual(a1, a2, description, ...) \
323*9712c20fSFrederick Mayle   STAssertOperation(a1, a2, >=, description, ##__VA_ARGS__)
324*9712c20fSFrederick Mayle 
325*9712c20fSFrederick Mayle // Generates a failure when a1 is not < a2. This test is for C scalars.
326*9712c20fSFrederick Mayle //  Args:
327*9712c20fSFrederick Mayle //    a1: argument 1
328*9712c20fSFrederick Mayle //    a2: argument 2
329*9712c20fSFrederick Mayle //    op: operation
330*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
331*9712c20fSFrederick Mayle //                 an empty string but must be present.
332*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
333*9712c20fSFrederick Mayle #define STAssertLessThan(a1, a2, description, ...) \
334*9712c20fSFrederick Mayle   STAssertOperation(a1, a2, <, description, ##__VA_ARGS__)
335*9712c20fSFrederick Mayle 
336*9712c20fSFrederick Mayle // Generates a failure when a1 is not <= a2. This test is for C scalars.
337*9712c20fSFrederick Mayle //  Args:
338*9712c20fSFrederick Mayle //    a1: argument 1
339*9712c20fSFrederick Mayle //    a2: argument 2
340*9712c20fSFrederick Mayle //    op: operation
341*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
342*9712c20fSFrederick Mayle //                 an empty string but must be present.
343*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
344*9712c20fSFrederick Mayle #define STAssertLessThanOrEqual(a1, a2, description, ...) \
345*9712c20fSFrederick Mayle   STAssertOperation(a1, a2, <=, description, ##__VA_ARGS__)
346*9712c20fSFrederick Mayle 
347*9712c20fSFrederick Mayle // Generates a failure when string a1 is not equal to string a2. This call
348*9712c20fSFrederick Mayle // differs from STAssertEqualObjects in that strings that are different in
349*9712c20fSFrederick Mayle // composition (precomposed vs decomposed) will compare equal if their final
350*9712c20fSFrederick Mayle // representation is equal.
351*9712c20fSFrederick Mayle // ex O + umlaut decomposed is the same as O + umlaut composed.
352*9712c20fSFrederick Mayle //  Args:
353*9712c20fSFrederick Mayle //    a1: string 1
354*9712c20fSFrederick Mayle //    a2: string 2
355*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
356*9712c20fSFrederick Mayle //                 an empty string but must be present.
357*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
358*9712c20fSFrederick Mayle #define STAssertEqualStrings(a1, a2, description, ...) \
359*9712c20fSFrederick Mayle do { \
360*9712c20fSFrederick Mayle   @try { \
361*9712c20fSFrederick Mayle     id a1value = (a1); \
362*9712c20fSFrederick Mayle     id a2value = (a2); \
363*9712c20fSFrederick Mayle     if (a1value == a2value) continue; \
364*9712c20fSFrederick Mayle     if ([a1value isKindOfClass:[NSString class]] && \
365*9712c20fSFrederick Mayle         [a2value isKindOfClass:[NSString class]] && \
366*9712c20fSFrederick Mayle         [a1value compare:a2value options:0] == NSOrderedSame) continue; \
367*9712c20fSFrederick Mayle      [self failWithException:[NSException failureInEqualityBetweenObject:a1value \
368*9712c20fSFrederick Mayle                                                                andObject:a2value \
369*9712c20fSFrederick Mayle                                                                   inFile:[NSString stringWithUTF8String:__FILE__] \
370*9712c20fSFrederick Mayle                                                                   atLine:__LINE__ \
371*9712c20fSFrederick Mayle                                                          withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
372*9712c20fSFrederick Mayle   } \
373*9712c20fSFrederick Mayle   @catch (id anException) { \
374*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \
375*9712c20fSFrederick Mayle                                               exception:anException \
376*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
377*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
378*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
379*9712c20fSFrederick Mayle   } \
380*9712c20fSFrederick Mayle } while(0)
381*9712c20fSFrederick Mayle 
382*9712c20fSFrederick Mayle // Generates a failure when string a1 is equal to string a2. This call
383*9712c20fSFrederick Mayle // differs from STAssertEqualObjects in that strings that are different in
384*9712c20fSFrederick Mayle // composition (precomposed vs decomposed) will compare equal if their final
385*9712c20fSFrederick Mayle // representation is equal.
386*9712c20fSFrederick Mayle // ex O + umlaut decomposed is the same as O + umlaut composed.
387*9712c20fSFrederick Mayle //  Args:
388*9712c20fSFrederick Mayle //    a1: string 1
389*9712c20fSFrederick Mayle //    a2: string 2
390*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
391*9712c20fSFrederick Mayle //                 an empty string but must be present.
392*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
393*9712c20fSFrederick Mayle #define STAssertNotEqualStrings(a1, a2, description, ...) \
394*9712c20fSFrederick Mayle do { \
395*9712c20fSFrederick Mayle   @try { \
396*9712c20fSFrederick Mayle     id a1value = (a1); \
397*9712c20fSFrederick Mayle     id a2value = (a2); \
398*9712c20fSFrederick Mayle     if ([a1value isKindOfClass:[NSString class]] && \
399*9712c20fSFrederick Mayle         [a2value isKindOfClass:[NSString class]] && \
400*9712c20fSFrederick Mayle         [a1value compare:a2value options:0] != NSOrderedSame) continue; \
401*9712c20fSFrederick Mayle      [self failWithException:[NSException failureInEqualityBetweenObject:a1value \
402*9712c20fSFrederick Mayle                                                                andObject:a2value \
403*9712c20fSFrederick Mayle                                                                   inFile:[NSString stringWithUTF8String:__FILE__] \
404*9712c20fSFrederick Mayle                                                                   atLine:__LINE__ \
405*9712c20fSFrederick Mayle                                                          withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
406*9712c20fSFrederick Mayle   } \
407*9712c20fSFrederick Mayle   @catch (id anException) { \
408*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \
409*9712c20fSFrederick Mayle                                               exception:anException \
410*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
411*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
412*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
413*9712c20fSFrederick Mayle   } \
414*9712c20fSFrederick Mayle } while(0)
415*9712c20fSFrederick Mayle 
416*9712c20fSFrederick Mayle // Generates a failure when c-string a1 is not equal to c-string a2.
417*9712c20fSFrederick Mayle //  Args:
418*9712c20fSFrederick Mayle //    a1: string 1
419*9712c20fSFrederick Mayle //    a2: string 2
420*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
421*9712c20fSFrederick Mayle //                 an empty string but must be present.
422*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
423*9712c20fSFrederick Mayle #define STAssertEqualCStrings(a1, a2, description, ...) \
424*9712c20fSFrederick Mayle do { \
425*9712c20fSFrederick Mayle   @try { \
426*9712c20fSFrederick Mayle     const char* a1value = (a1); \
427*9712c20fSFrederick Mayle     const char* a2value = (a2); \
428*9712c20fSFrederick Mayle     if (a1value == a2value) continue; \
429*9712c20fSFrederick Mayle     if (strcmp(a1value, a2value) == 0) continue; \
430*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInEqualityBetweenObject:[NSString stringWithUTF8String:a1value] \
431*9712c20fSFrederick Mayle                                                               andObject:[NSString stringWithUTF8String:a2value] \
432*9712c20fSFrederick Mayle                                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
433*9712c20fSFrederick Mayle                                                                  atLine:__LINE__ \
434*9712c20fSFrederick Mayle                                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
435*9712c20fSFrederick Mayle   } \
436*9712c20fSFrederick Mayle   @catch (id anException) { \
437*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \
438*9712c20fSFrederick Mayle                                               exception:anException \
439*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
440*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
441*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
442*9712c20fSFrederick Mayle   } \
443*9712c20fSFrederick Mayle } while(0)
444*9712c20fSFrederick Mayle 
445*9712c20fSFrederick Mayle // Generates a failure when c-string a1 is equal to c-string a2.
446*9712c20fSFrederick Mayle //  Args:
447*9712c20fSFrederick Mayle //    a1: string 1
448*9712c20fSFrederick Mayle //    a2: string 2
449*9712c20fSFrederick Mayle //    description: A format string as in the printf() function. Can be nil or
450*9712c20fSFrederick Mayle //                 an empty string but must be present.
451*9712c20fSFrederick Mayle //    ...: A variable number of arguments to the format string. Can be absent.
452*9712c20fSFrederick Mayle #define STAssertNotEqualCStrings(a1, a2, description, ...) \
453*9712c20fSFrederick Mayle do { \
454*9712c20fSFrederick Mayle   @try { \
455*9712c20fSFrederick Mayle     const char* a1value = (a1); \
456*9712c20fSFrederick Mayle     const char* a2value = (a2); \
457*9712c20fSFrederick Mayle     if (strcmp(a1value, a2value) != 0) continue; \
458*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInEqualityBetweenObject:[NSString stringWithUTF8String:a1value] \
459*9712c20fSFrederick Mayle                                                               andObject:[NSString stringWithUTF8String:a2value] \
460*9712c20fSFrederick Mayle                                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
461*9712c20fSFrederick Mayle                                                                  atLine:__LINE__ \
462*9712c20fSFrederick Mayle                                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
463*9712c20fSFrederick Mayle   } \
464*9712c20fSFrederick Mayle   @catch (id anException) { \
465*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \
466*9712c20fSFrederick Mayle                                               exception:anException \
467*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
468*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
469*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
470*9712c20fSFrederick Mayle   } \
471*9712c20fSFrederick Mayle } while(0)
472*9712c20fSFrederick Mayle 
473*9712c20fSFrederick Mayle /*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false.
474*9712c20fSFrederick Mayle   This test is for GLKit types (GLKVector, GLKMatrix) where small differences
475*9712c20fSFrederick Mayle   could  make these items not exactly equal. Do not use this version directly.
476*9712c20fSFrederick Mayle   Use the explicit STAssertEqualGLKVectors and STAssertEqualGLKMatrices defined
477*9712c20fSFrederick Mayle   below.
478*9712c20fSFrederick Mayle   _{a1    The GLKType on the left.}
479*9712c20fSFrederick Mayle   _{a2    The GLKType on the right.}
480*9712c20fSFrederick Mayle   _{accuracy  The maximum difference between a1 and a2 for these values to be
481*9712c20fSFrederick Mayle   considered equal.}
482*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
483*9712c20fSFrederick Mayle                       an empty string but must be present.}
484*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
485*9712c20fSFrederick Mayle "*/
486*9712c20fSFrederick Mayle 
487*9712c20fSFrederick Mayle #define STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ...) \
488*9712c20fSFrederick Mayle do { \
489*9712c20fSFrederick Mayle   @try { \
490*9712c20fSFrederick Mayle     if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \
491*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
492*9712c20fSFrederick Mayle                                                                                  atLine:__LINE__ \
493*9712c20fSFrederick Mayle                                                                         withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \
494*9712c20fSFrederick Mayle     } else { \
495*9712c20fSFrederick Mayle       __typeof__(a1) a1GLKValue = (a1); \
496*9712c20fSFrederick Mayle       __typeof__(a2) a2GLKValue = (a2); \
497*9712c20fSFrederick Mayle       __typeof__(accuracy) accuracyvalue = (accuracy); \
498*9712c20fSFrederick Mayle       float *a1FloatValue = ((float*)&a1GLKValue); \
499*9712c20fSFrederick Mayle       float *a2FloatValue = ((float*)&a2GLKValue); \
500*9712c20fSFrederick Mayle       for (size_t i = 0; i < sizeof(__typeof__(a1)) / sizeof(float); ++i) { \
501*9712c20fSFrederick Mayle         float a1value = a1FloatValue[i]; \
502*9712c20fSFrederick Mayle         float a2value = a2FloatValue[i]; \
503*9712c20fSFrederick Mayle         if (STAbsoluteDifference(a1value, a2value) > accuracyvalue) { \
504*9712c20fSFrederick Mayle           NSMutableArray *strings = [NSMutableArray arrayWithCapacity:sizeof(a1) / sizeof(float)]; \
505*9712c20fSFrederick Mayle           NSString *string; \
506*9712c20fSFrederick Mayle           for (size_t j = 0; j < sizeof(__typeof__(a1)) / sizeof(float); ++j) { \
507*9712c20fSFrederick Mayle             string = [NSString stringWithFormat:@"(%0.3f == %0.3f)", a1FloatValue[j], a2FloatValue[j]]; \
508*9712c20fSFrederick Mayle             [strings addObject:string]; \
509*9712c20fSFrederick Mayle           } \
510*9712c20fSFrederick Mayle           string = [strings componentsJoinedByString:@", "]; \
511*9712c20fSFrederick Mayle           NSString *desc = STComposeString(description, ##__VA_ARGS__); \
512*9712c20fSFrederick Mayle           desc = [NSString stringWithFormat:@"%@ With Accuracy %0.3f: %@", string, (float)accuracyvalue, desc]; \
513*9712c20fSFrederick Mayle           [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
514*9712c20fSFrederick Mayle                                                       atLine:__LINE__ \
515*9712c20fSFrederick Mayle                                              withDescription:@"%@", desc]]; \
516*9712c20fSFrederick Mayle           break; \
517*9712c20fSFrederick Mayle         } \
518*9712c20fSFrederick Mayle       } \
519*9712c20fSFrederick Mayle     } \
520*9712c20fSFrederick Mayle   } \
521*9712c20fSFrederick Mayle   @catch (id anException) { \
522*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \
523*9712c20fSFrederick Mayle                                               exception:anException \
524*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
525*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
526*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
527*9712c20fSFrederick Mayle   } \
528*9712c20fSFrederick Mayle } while(0)
529*9712c20fSFrederick Mayle 
530*9712c20fSFrederick Mayle #define STAssertEqualGLKVectors(a1, a2, accuracy, description, ...) \
531*9712c20fSFrederick Mayle      STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__)
532*9712c20fSFrederick Mayle 
533*9712c20fSFrederick Mayle #define STAssertEqualGLKMatrices(a1, a2, accuracy, description, ...) \
534*9712c20fSFrederick Mayle      STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__)
535*9712c20fSFrederick Mayle 
536*9712c20fSFrederick Mayle #define STAssertEqualGLKQuaternions(a1, a2, accuracy, description, ...) \
537*9712c20fSFrederick Mayle      STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__)
538*9712c20fSFrederick Mayle 
539*9712c20fSFrederick Mayle #if GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST
540*9712c20fSFrederick Mayle // When not using the Xcode provided version, define everything ourselves.
541*9712c20fSFrederick Mayle 
542*9712c20fSFrederick Mayle // SENTE_BEGIN
543*9712c20fSFrederick Mayle /*" Generates a failure when !{ [a1 isEqualTo:a2] } is false
544*9712c20fSFrederick Mayle 	(or one is nil and the other is not).
545*9712c20fSFrederick Mayle 	_{a1    The object on the left.}
546*9712c20fSFrederick Mayle 	_{a2    The object on the right.}
547*9712c20fSFrederick Mayle 	_{description A format string as in the printf() function. Can be nil or
548*9712c20fSFrederick Mayle 		an empty string but must be present.}
549*9712c20fSFrederick Mayle 	_{... A variable number of arguments to the format string. Can be absent.}
550*9712c20fSFrederick Mayle "*/
551*9712c20fSFrederick Mayle #define STAssertEqualObjects(a1, a2, description, ...) \
552*9712c20fSFrederick Mayle do { \
553*9712c20fSFrederick Mayle   @try { \
554*9712c20fSFrederick Mayle     id a1value = (a1); \
555*9712c20fSFrederick Mayle     id a2value = (a2); \
556*9712c20fSFrederick Mayle     if (a1value == a2value) continue; \
557*9712c20fSFrederick Mayle     if ((strcmp(@encode(__typeof__(a1value)), @encode(id)) == 0) && \
558*9712c20fSFrederick Mayle         (strcmp(@encode(__typeof__(a2value)), @encode(id)) == 0) && \
559*9712c20fSFrederick Mayle         [(id)a1value isEqual:(id)a2value]) continue; \
560*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInEqualityBetweenObject:a1value \
561*9712c20fSFrederick Mayle                                                               andObject:a2value \
562*9712c20fSFrederick Mayle                                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
563*9712c20fSFrederick Mayle                                                                  atLine:__LINE__ \
564*9712c20fSFrederick Mayle                                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
565*9712c20fSFrederick Mayle   } \
566*9712c20fSFrederick Mayle   @catch (id anException) { \
567*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \
568*9712c20fSFrederick Mayle                                               exception:anException \
569*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
570*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
571*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
572*9712c20fSFrederick Mayle   } \
573*9712c20fSFrederick Mayle } while(0)
574*9712c20fSFrederick Mayle 
575*9712c20fSFrederick Mayle 
576*9712c20fSFrederick Mayle /*" Generates a failure when a1 is not equal to a2. This test is for
577*9712c20fSFrederick Mayle     C scalars, structs and unions.
578*9712c20fSFrederick Mayle     _{a1    The argument on the left.}
579*9712c20fSFrederick Mayle     _{a2    The argument on the right.}
580*9712c20fSFrederick Mayle     _{description A format string as in the printf() function. Can be nil or
581*9712c20fSFrederick Mayle                         an empty string but must be present.}
582*9712c20fSFrederick Mayle     _{... A variable number of arguments to the format string. Can be absent.}
583*9712c20fSFrederick Mayle "*/
584*9712c20fSFrederick Mayle #define STAssertEquals(a1, a2, description, ...) \
585*9712c20fSFrederick Mayle do { \
586*9712c20fSFrederick Mayle   @try { \
587*9712c20fSFrederick Mayle     if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \
588*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
589*9712c20fSFrederick Mayle                                                                                  atLine:__LINE__ \
590*9712c20fSFrederick Mayle                                                                         withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \
591*9712c20fSFrederick Mayle     } else { \
592*9712c20fSFrederick Mayle       __typeof__(a1) a1value = (a1); \
593*9712c20fSFrederick Mayle       __typeof__(a2) a2value = (a2); \
594*9712c20fSFrederick Mayle       NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \
595*9712c20fSFrederick Mayle       NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \
596*9712c20fSFrederick Mayle       if (![a1encoded isEqualToValue:a2encoded]) { \
597*9712c20fSFrederick Mayle         [self failWithException:[NSException failureInEqualityBetweenValue:a1encoded \
598*9712c20fSFrederick Mayle                                                                   andValue:a2encoded \
599*9712c20fSFrederick Mayle                                                               withAccuracy:nil \
600*9712c20fSFrederick Mayle                                                                     inFile:[NSString stringWithUTF8String:__FILE__] \
601*9712c20fSFrederick Mayle                                                                     atLine:__LINE__ \
602*9712c20fSFrederick Mayle                                                            withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
603*9712c20fSFrederick Mayle       } \
604*9712c20fSFrederick Mayle     } \
605*9712c20fSFrederick Mayle   } \
606*9712c20fSFrederick Mayle   @catch (id anException) { \
607*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \
608*9712c20fSFrederick Mayle                                               exception:anException \
609*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
610*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
611*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
612*9712c20fSFrederick Mayle   } \
613*9712c20fSFrederick Mayle } while(0)
614*9712c20fSFrederick Mayle 
615*9712c20fSFrederick Mayle #define STAbsoluteDifference(left,right) (MAX(left,right)-MIN(left,right))
616*9712c20fSFrederick Mayle 
617*9712c20fSFrederick Mayle 
618*9712c20fSFrederick Mayle /*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false.
619*9712c20fSFrederick Mayle   This test is for scalars such as floats and doubles where small differences
620*9712c20fSFrederick Mayle   could make these items not exactly equal, but also works for all scalars.
621*9712c20fSFrederick Mayle   _{a1    The scalar on the left.}
622*9712c20fSFrederick Mayle   _{a2    The scalar on the right.}
623*9712c20fSFrederick Mayle   _{accuracy  The maximum difference between a1 and a2 for these values to be
624*9712c20fSFrederick Mayle   considered equal.}
625*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
626*9712c20fSFrederick Mayle                       an empty string but must be present.}
627*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
628*9712c20fSFrederick Mayle "*/
629*9712c20fSFrederick Mayle 
630*9712c20fSFrederick Mayle #define STAssertEqualsWithAccuracy(a1, a2, accuracy, description, ...) \
631*9712c20fSFrederick Mayle do { \
632*9712c20fSFrederick Mayle   @try { \
633*9712c20fSFrederick Mayle     if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \
634*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
635*9712c20fSFrederick Mayle                                                                                  atLine:__LINE__ \
636*9712c20fSFrederick Mayle                                                                         withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \
637*9712c20fSFrederick Mayle     } else { \
638*9712c20fSFrederick Mayle       __typeof__(a1) a1value = (a1); \
639*9712c20fSFrederick Mayle       __typeof__(a2) a2value = (a2); \
640*9712c20fSFrederick Mayle       __typeof__(accuracy) accuracyvalue = (accuracy); \
641*9712c20fSFrederick Mayle       if (STAbsoluteDifference(a1value, a2value) > accuracyvalue) { \
642*9712c20fSFrederick Mayle               NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \
643*9712c20fSFrederick Mayle               NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \
644*9712c20fSFrederick Mayle               NSValue *accuracyencoded = [NSValue value:&accuracyvalue withObjCType:@encode(__typeof__(accuracy))]; \
645*9712c20fSFrederick Mayle               [self failWithException:[NSException failureInEqualityBetweenValue:a1encoded \
646*9712c20fSFrederick Mayle                                                                         andValue:a2encoded \
647*9712c20fSFrederick Mayle                                                                     withAccuracy:accuracyencoded \
648*9712c20fSFrederick Mayle                                                                           inFile:[NSString stringWithUTF8String:__FILE__] \
649*9712c20fSFrederick Mayle                                                                           atLine:__LINE__ \
650*9712c20fSFrederick Mayle                                                                  withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
651*9712c20fSFrederick Mayle       } \
652*9712c20fSFrederick Mayle     } \
653*9712c20fSFrederick Mayle   } \
654*9712c20fSFrederick Mayle   @catch (id anException) { \
655*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \
656*9712c20fSFrederick Mayle                                                                          exception:anException \
657*9712c20fSFrederick Mayle                                                                             inFile:[NSString stringWithUTF8String:__FILE__] \
658*9712c20fSFrederick Mayle                                                                             atLine:__LINE__ \
659*9712c20fSFrederick Mayle                                                                    withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
660*9712c20fSFrederick Mayle   } \
661*9712c20fSFrederick Mayle } while(0)
662*9712c20fSFrederick Mayle 
663*9712c20fSFrederick Mayle 
664*9712c20fSFrederick Mayle 
665*9712c20fSFrederick Mayle /*" Generates a failure unconditionally.
666*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
667*9712c20fSFrederick Mayle                       an empty string but must be present.}
668*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
669*9712c20fSFrederick Mayle "*/
670*9712c20fSFrederick Mayle #define STFail(description, ...) \
671*9712c20fSFrederick Mayle [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
672*9712c20fSFrederick Mayle                                             atLine:__LINE__ \
673*9712c20fSFrederick Mayle                                    withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]
674*9712c20fSFrederick Mayle 
675*9712c20fSFrederick Mayle 
676*9712c20fSFrederick Mayle 
677*9712c20fSFrederick Mayle /*" Generates a failure when a1 is not nil.
678*9712c20fSFrederick Mayle   _{a1    An object.}
679*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
680*9712c20fSFrederick Mayle     an empty string but must be present.}
681*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
682*9712c20fSFrederick Mayle "*/
683*9712c20fSFrederick Mayle #define STAssertNil(a1, description, ...) \
684*9712c20fSFrederick Mayle do { \
685*9712c20fSFrederick Mayle   @try { \
686*9712c20fSFrederick Mayle     id a1value = (a1); \
687*9712c20fSFrederick Mayle     if (a1value != nil) { \
688*9712c20fSFrederick Mayle       NSString *_a1 = [NSString stringWithUTF8String:#a1]; \
689*9712c20fSFrederick Mayle       NSString *_expression = [NSString stringWithFormat:@"((%@) == nil)", _a1]; \
690*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInCondition:_expression \
691*9712c20fSFrederick Mayle                                                        isTrue:NO \
692*9712c20fSFrederick Mayle                                                        inFile:[NSString stringWithUTF8String:__FILE__] \
693*9712c20fSFrederick Mayle                                                        atLine:__LINE__ \
694*9712c20fSFrederick Mayle                                               withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
695*9712c20fSFrederick Mayle     } \
696*9712c20fSFrederick Mayle   } \
697*9712c20fSFrederick Mayle   @catch (id anException) { \
698*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == nil fails", #a1] \
699*9712c20fSFrederick Mayle                                               exception:anException \
700*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
701*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
702*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
703*9712c20fSFrederick Mayle   } \
704*9712c20fSFrederick Mayle } while(0)
705*9712c20fSFrederick Mayle 
706*9712c20fSFrederick Mayle 
707*9712c20fSFrederick Mayle /*" Generates a failure when a1 is nil.
708*9712c20fSFrederick Mayle   _{a1    An object.}
709*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
710*9712c20fSFrederick Mayle   an empty string but must be present.}
711*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
712*9712c20fSFrederick Mayle "*/
713*9712c20fSFrederick Mayle #define STAssertNotNil(a1, description, ...) \
714*9712c20fSFrederick Mayle do { \
715*9712c20fSFrederick Mayle   @try { \
716*9712c20fSFrederick Mayle     id a1value = (a1); \
717*9712c20fSFrederick Mayle     if (a1value == nil) { \
718*9712c20fSFrederick Mayle       NSString *_a1 = [NSString stringWithUTF8String:#a1]; \
719*9712c20fSFrederick Mayle       NSString *_expression = [NSString stringWithFormat:@"((%@) != nil)", _a1]; \
720*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInCondition:_expression \
721*9712c20fSFrederick Mayle                                                        isTrue:NO \
722*9712c20fSFrederick Mayle                                                        inFile:[NSString stringWithUTF8String:__FILE__] \
723*9712c20fSFrederick Mayle                                                        atLine:__LINE__ \
724*9712c20fSFrederick Mayle                                               withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
725*9712c20fSFrederick Mayle     } \
726*9712c20fSFrederick Mayle   } \
727*9712c20fSFrederick Mayle   @catch (id anException) { \
728*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != nil fails", #a1] \
729*9712c20fSFrederick Mayle                                               exception:anException \
730*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
731*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
732*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
733*9712c20fSFrederick Mayle   } \
734*9712c20fSFrederick Mayle } while(0)
735*9712c20fSFrederick Mayle 
736*9712c20fSFrederick Mayle 
737*9712c20fSFrederick Mayle /*" Generates a failure when expression evaluates to false.
738*9712c20fSFrederick Mayle   _{expr    The expression that is tested.}
739*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
740*9712c20fSFrederick Mayle   an empty string but must be present.}
741*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
742*9712c20fSFrederick Mayle "*/
743*9712c20fSFrederick Mayle #define STAssertTrue(expr, description, ...) \
744*9712c20fSFrederick Mayle do { \
745*9712c20fSFrederick Mayle   BOOL _evaluatedExpression = (expr); \
746*9712c20fSFrederick Mayle   if (!_evaluatedExpression) { \
747*9712c20fSFrederick Mayle     NSString *_expression = [NSString stringWithUTF8String:#expr]; \
748*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInCondition:_expression \
749*9712c20fSFrederick Mayle                                                      isTrue:NO \
750*9712c20fSFrederick Mayle                                                      inFile:[NSString stringWithUTF8String:__FILE__] \
751*9712c20fSFrederick Mayle                                                      atLine:__LINE__ \
752*9712c20fSFrederick Mayle                                             withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
753*9712c20fSFrederick Mayle   } \
754*9712c20fSFrederick Mayle } while (0)
755*9712c20fSFrederick Mayle 
756*9712c20fSFrederick Mayle 
757*9712c20fSFrederick Mayle /*" Generates a failure when expression evaluates to false and in addition will
758*9712c20fSFrederick Mayle   generate error messages if an exception is encountered.
759*9712c20fSFrederick Mayle   _{expr    The expression that is tested.}
760*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
761*9712c20fSFrederick Mayle   an empty string but must be present.}
762*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
763*9712c20fSFrederick Mayle "*/
764*9712c20fSFrederick Mayle #define STAssertTrueNoThrow(expr, description, ...) \
765*9712c20fSFrederick Mayle do { \
766*9712c20fSFrederick Mayle   @try { \
767*9712c20fSFrederick Mayle     BOOL _evaluatedExpression = (expr); \
768*9712c20fSFrederick Mayle     if (!_evaluatedExpression) { \
769*9712c20fSFrederick Mayle       NSString *_expression = [NSString stringWithUTF8String:#expr]; \
770*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInCondition:_expression \
771*9712c20fSFrederick Mayle                                                        isTrue:NO \
772*9712c20fSFrederick Mayle                                                        inFile:[NSString stringWithUTF8String:__FILE__] \
773*9712c20fSFrederick Mayle                                                        atLine:__LINE__ \
774*9712c20fSFrederick Mayle                                               withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
775*9712c20fSFrederick Mayle     } \
776*9712c20fSFrederick Mayle   } \
777*9712c20fSFrederick Mayle   @catch (id anException) { \
778*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) ", #expr] \
779*9712c20fSFrederick Mayle                                               exception:anException \
780*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
781*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
782*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
783*9712c20fSFrederick Mayle   } \
784*9712c20fSFrederick Mayle } while (0)
785*9712c20fSFrederick Mayle 
786*9712c20fSFrederick Mayle 
787*9712c20fSFrederick Mayle /*" Generates a failure when the expression evaluates to true.
788*9712c20fSFrederick Mayle   _{expr    The expression that is tested.}
789*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
790*9712c20fSFrederick Mayle   an empty string but must be present.}
791*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
792*9712c20fSFrederick Mayle "*/
793*9712c20fSFrederick Mayle #define STAssertFalse(expr, description, ...) \
794*9712c20fSFrederick Mayle do { \
795*9712c20fSFrederick Mayle   BOOL _evaluatedExpression = (expr); \
796*9712c20fSFrederick Mayle   if (_evaluatedExpression) { \
797*9712c20fSFrederick Mayle     NSString *_expression = [NSString stringWithUTF8String:#expr]; \
798*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInCondition:_expression \
799*9712c20fSFrederick Mayle                                                      isTrue:YES \
800*9712c20fSFrederick Mayle                                                      inFile:[NSString stringWithUTF8String:__FILE__] \
801*9712c20fSFrederick Mayle                                                      atLine:__LINE__ \
802*9712c20fSFrederick Mayle                                             withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
803*9712c20fSFrederick Mayle   } \
804*9712c20fSFrederick Mayle } while (0)
805*9712c20fSFrederick Mayle 
806*9712c20fSFrederick Mayle 
807*9712c20fSFrederick Mayle /*" Generates a failure when the expression evaluates to true and in addition
808*9712c20fSFrederick Mayle   will generate error messages if an exception is encountered.
809*9712c20fSFrederick Mayle   _{expr    The expression that is tested.}
810*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
811*9712c20fSFrederick Mayle   an empty string but must be present.}
812*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
813*9712c20fSFrederick Mayle "*/
814*9712c20fSFrederick Mayle #define STAssertFalseNoThrow(expr, description, ...) \
815*9712c20fSFrederick Mayle do { \
816*9712c20fSFrederick Mayle   @try { \
817*9712c20fSFrederick Mayle     BOOL _evaluatedExpression = (expr); \
818*9712c20fSFrederick Mayle     if (_evaluatedExpression) { \
819*9712c20fSFrederick Mayle       NSString *_expression = [NSString stringWithUTF8String:#expr]; \
820*9712c20fSFrederick Mayle       [self failWithException:[NSException failureInCondition:_expression \
821*9712c20fSFrederick Mayle                                                        isTrue:YES \
822*9712c20fSFrederick Mayle                                                        inFile:[NSString stringWithUTF8String:__FILE__] \
823*9712c20fSFrederick Mayle                                                        atLine:__LINE__ \
824*9712c20fSFrederick Mayle                                               withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
825*9712c20fSFrederick Mayle     } \
826*9712c20fSFrederick Mayle   } \
827*9712c20fSFrederick Mayle   @catch (id anException) { \
828*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"!(%s) ", #expr] \
829*9712c20fSFrederick Mayle                                               exception:anException \
830*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
831*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
832*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
833*9712c20fSFrederick Mayle   } \
834*9712c20fSFrederick Mayle } while (0)
835*9712c20fSFrederick Mayle 
836*9712c20fSFrederick Mayle 
837*9712c20fSFrederick Mayle /*" Generates a failure when expression does not throw an exception.
838*9712c20fSFrederick Mayle   _{expression    The expression that is evaluated.}
839*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
840*9712c20fSFrederick Mayle   an empty string but must be present.}
841*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.
842*9712c20fSFrederick Mayle "*/
843*9712c20fSFrederick Mayle #define STAssertThrows(expr, description, ...) \
844*9712c20fSFrederick Mayle do { \
845*9712c20fSFrederick Mayle   @try { \
846*9712c20fSFrederick Mayle     (expr); \
847*9712c20fSFrederick Mayle   } \
848*9712c20fSFrederick Mayle   @catch (id anException) { \
849*9712c20fSFrederick Mayle     continue; \
850*9712c20fSFrederick Mayle   } \
851*9712c20fSFrederick Mayle   [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
852*9712c20fSFrederick Mayle                                             exception:nil \
853*9712c20fSFrederick Mayle                                                inFile:[NSString stringWithUTF8String:__FILE__] \
854*9712c20fSFrederick Mayle                                                atLine:__LINE__ \
855*9712c20fSFrederick Mayle                                       withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
856*9712c20fSFrederick Mayle } while (0)
857*9712c20fSFrederick Mayle 
858*9712c20fSFrederick Mayle 
859*9712c20fSFrederick Mayle /*" Generates a failure when expression does not throw an exception of a
860*9712c20fSFrederick Mayle   specific class.
861*9712c20fSFrederick Mayle   _{expression    The expression that is evaluated.}
862*9712c20fSFrederick Mayle   _{specificException    The specified class of the exception.}
863*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
864*9712c20fSFrederick Mayle   an empty string but must be present.}
865*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
866*9712c20fSFrederick Mayle "*/
867*9712c20fSFrederick Mayle #define STAssertThrowsSpecific(expr, specificException, description, ...) \
868*9712c20fSFrederick Mayle do { \
869*9712c20fSFrederick Mayle   @try { \
870*9712c20fSFrederick Mayle     (expr); \
871*9712c20fSFrederick Mayle   } \
872*9712c20fSFrederick Mayle   @catch (specificException *anException) { \
873*9712c20fSFrederick Mayle     continue; \
874*9712c20fSFrederick Mayle   } \
875*9712c20fSFrederick Mayle   @catch (id anException) { \
876*9712c20fSFrederick Mayle     NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \
877*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
878*9712c20fSFrederick Mayle                                               exception:anException \
879*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
880*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
881*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \
882*9712c20fSFrederick Mayle                                             continue; \
883*9712c20fSFrederick Mayle   } \
884*9712c20fSFrederick Mayle   NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \
885*9712c20fSFrederick Mayle   [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
886*9712c20fSFrederick Mayle                                             exception:nil \
887*9712c20fSFrederick Mayle                                                inFile:[NSString stringWithUTF8String:__FILE__] \
888*9712c20fSFrederick Mayle                                                atLine:__LINE__ \
889*9712c20fSFrederick Mayle                                       withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \
890*9712c20fSFrederick Mayle } while (0)
891*9712c20fSFrederick Mayle 
892*9712c20fSFrederick Mayle 
893*9712c20fSFrederick Mayle /*" Generates a failure when expression does not throw an exception of a
894*9712c20fSFrederick Mayle   specific class with a specific name.  Useful for those frameworks like
895*9712c20fSFrederick Mayle   AppKit or Foundation that throw generic NSException w/specific names
896*9712c20fSFrederick Mayle   (NSInvalidArgumentException, etc).
897*9712c20fSFrederick Mayle   _{expression    The expression that is evaluated.}
898*9712c20fSFrederick Mayle   _{specificException    The specified class of the exception.}
899*9712c20fSFrederick Mayle   _{aName    The name of the specified exception.}
900*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
901*9712c20fSFrederick Mayle   an empty string but must be present.}
902*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
903*9712c20fSFrederick Mayle 
904*9712c20fSFrederick Mayle "*/
905*9712c20fSFrederick Mayle #define STAssertThrowsSpecificNamed(expr, specificException, aName, description, ...) \
906*9712c20fSFrederick Mayle do { \
907*9712c20fSFrederick Mayle   @try { \
908*9712c20fSFrederick Mayle     (expr); \
909*9712c20fSFrederick Mayle   } \
910*9712c20fSFrederick Mayle   @catch (specificException *anException) { \
911*9712c20fSFrederick Mayle     if ([aName isEqualToString:[anException name]]) continue; \
912*9712c20fSFrederick Mayle     NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description); \
913*9712c20fSFrederick Mayle     [self failWithException: \
914*9712c20fSFrederick Mayle       [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
915*9712c20fSFrederick Mayle                         exception:anException \
916*9712c20fSFrederick Mayle                            inFile:[NSString stringWithUTF8String:__FILE__] \
917*9712c20fSFrederick Mayle                            atLine:__LINE__ \
918*9712c20fSFrederick Mayle                   withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \
919*9712c20fSFrederick Mayle     continue; \
920*9712c20fSFrederick Mayle   } \
921*9712c20fSFrederick Mayle   @catch (id anException) { \
922*9712c20fSFrederick Mayle     NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \
923*9712c20fSFrederick Mayle     [self failWithException: \
924*9712c20fSFrederick Mayle       [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
925*9712c20fSFrederick Mayle                         exception:anException \
926*9712c20fSFrederick Mayle                            inFile:[NSString stringWithUTF8String:__FILE__] \
927*9712c20fSFrederick Mayle                            atLine:__LINE__ \
928*9712c20fSFrederick Mayle                   withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \
929*9712c20fSFrederick Mayle     continue; \
930*9712c20fSFrederick Mayle   } \
931*9712c20fSFrederick Mayle   NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \
932*9712c20fSFrederick Mayle   [self failWithException: \
933*9712c20fSFrederick Mayle     [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
934*9712c20fSFrederick Mayle                       exception:nil \
935*9712c20fSFrederick Mayle                          inFile:[NSString stringWithUTF8String:__FILE__] \
936*9712c20fSFrederick Mayle                          atLine:__LINE__ \
937*9712c20fSFrederick Mayle                 withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \
938*9712c20fSFrederick Mayle } while (0)
939*9712c20fSFrederick Mayle 
940*9712c20fSFrederick Mayle 
941*9712c20fSFrederick Mayle /*" Generates a failure when expression does throw an exception.
942*9712c20fSFrederick Mayle   _{expression    The expression that is evaluated.}
943*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
944*9712c20fSFrederick Mayle   an empty string but must be present.}
945*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
946*9712c20fSFrederick Mayle "*/
947*9712c20fSFrederick Mayle #define STAssertNoThrow(expr, description, ...) \
948*9712c20fSFrederick Mayle do { \
949*9712c20fSFrederick Mayle   @try { \
950*9712c20fSFrederick Mayle     (expr); \
951*9712c20fSFrederick Mayle   } \
952*9712c20fSFrederick Mayle   @catch (id anException) { \
953*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
954*9712c20fSFrederick Mayle                                               exception:anException \
955*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
956*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
957*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
958*9712c20fSFrederick Mayle   } \
959*9712c20fSFrederick Mayle } while (0)
960*9712c20fSFrederick Mayle 
961*9712c20fSFrederick Mayle 
962*9712c20fSFrederick Mayle /*" Generates a failure when expression does throw an exception of the specitied
963*9712c20fSFrederick Mayle   class. Any other exception is okay (i.e. does not generate a failure).
964*9712c20fSFrederick Mayle   _{expression    The expression that is evaluated.}
965*9712c20fSFrederick Mayle   _{specificException    The specified class of the exception.}
966*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
967*9712c20fSFrederick Mayle   an empty string but must be present.}
968*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
969*9712c20fSFrederick Mayle "*/
970*9712c20fSFrederick Mayle #define STAssertNoThrowSpecific(expr, specificException, description, ...) \
971*9712c20fSFrederick Mayle do { \
972*9712c20fSFrederick Mayle   @try { \
973*9712c20fSFrederick Mayle     (expr); \
974*9712c20fSFrederick Mayle   } \
975*9712c20fSFrederick Mayle   @catch (specificException *anException) { \
976*9712c20fSFrederick Mayle     [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
977*9712c20fSFrederick Mayle                                               exception:anException \
978*9712c20fSFrederick Mayle                                                  inFile:[NSString stringWithUTF8String:__FILE__] \
979*9712c20fSFrederick Mayle                                                  atLine:__LINE__ \
980*9712c20fSFrederick Mayle                                         withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \
981*9712c20fSFrederick Mayle   } \
982*9712c20fSFrederick Mayle   @catch (id anythingElse) { \
983*9712c20fSFrederick Mayle     ; \
984*9712c20fSFrederick Mayle   } \
985*9712c20fSFrederick Mayle } while (0)
986*9712c20fSFrederick Mayle 
987*9712c20fSFrederick Mayle 
988*9712c20fSFrederick Mayle /*" Generates a failure when expression does throw an exception of a
989*9712c20fSFrederick Mayle   specific class with a specific name.  Useful for those frameworks like
990*9712c20fSFrederick Mayle   AppKit or Foundation that throw generic NSException w/specific names
991*9712c20fSFrederick Mayle   (NSInvalidArgumentException, etc).
992*9712c20fSFrederick Mayle   _{expression    The expression that is evaluated.}
993*9712c20fSFrederick Mayle   _{specificException    The specified class of the exception.}
994*9712c20fSFrederick Mayle   _{aName    The name of the specified exception.}
995*9712c20fSFrederick Mayle   _{description A format string as in the printf() function. Can be nil or
996*9712c20fSFrederick Mayle   an empty string but must be present.}
997*9712c20fSFrederick Mayle   _{... A variable number of arguments to the format string. Can be absent.}
998*9712c20fSFrederick Mayle 
999*9712c20fSFrederick Mayle "*/
1000*9712c20fSFrederick Mayle #define STAssertNoThrowSpecificNamed(expr, specificException, aName, description, ...) \
1001*9712c20fSFrederick Mayle do { \
1002*9712c20fSFrederick Mayle   @try { \
1003*9712c20fSFrederick Mayle     (expr); \
1004*9712c20fSFrederick Mayle   } \
1005*9712c20fSFrederick Mayle   @catch (specificException *anException) { \
1006*9712c20fSFrederick Mayle     if ([aName isEqualToString:[anException name]]) { \
1007*9712c20fSFrederick Mayle       NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description); \
1008*9712c20fSFrederick Mayle       [self failWithException: \
1009*9712c20fSFrederick Mayle         [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \
1010*9712c20fSFrederick Mayle                           exception:anException \
1011*9712c20fSFrederick Mayle                              inFile:[NSString stringWithUTF8String:__FILE__] \
1012*9712c20fSFrederick Mayle                              atLine:__LINE__ \
1013*9712c20fSFrederick Mayle                     withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \
1014*9712c20fSFrederick Mayle     } \
1015*9712c20fSFrederick Mayle     continue; \
1016*9712c20fSFrederick Mayle   } \
1017*9712c20fSFrederick Mayle   @catch (id anythingElse) { \
1018*9712c20fSFrederick Mayle     ; \
1019*9712c20fSFrederick Mayle   } \
1020*9712c20fSFrederick Mayle } while (0)
1021*9712c20fSFrederick Mayle 
1022*9712c20fSFrederick Mayle 
1023*9712c20fSFrederick Mayle 
1024*9712c20fSFrederick Mayle @interface NSException (GTMSenTestAdditions)
1025*9712c20fSFrederick Mayle + (NSException *)failureInFile:(NSString *)filename
1026*9712c20fSFrederick Mayle                         atLine:(int)lineNumber
1027*9712c20fSFrederick Mayle                withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(3, 4);
1028*9712c20fSFrederick Mayle + (NSException *)failureInCondition:(NSString *)condition
1029*9712c20fSFrederick Mayle                              isTrue:(BOOL)isTrue
1030*9712c20fSFrederick Mayle                              inFile:(NSString *)filename
1031*9712c20fSFrederick Mayle                              atLine:(int)lineNumber
1032*9712c20fSFrederick Mayle                     withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6);
1033*9712c20fSFrederick Mayle + (NSException *)failureInEqualityBetweenObject:(id)left
1034*9712c20fSFrederick Mayle                                       andObject:(id)right
1035*9712c20fSFrederick Mayle                                          inFile:(NSString *)filename
1036*9712c20fSFrederick Mayle                                          atLine:(int)lineNumber
1037*9712c20fSFrederick Mayle                                 withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6);
1038*9712c20fSFrederick Mayle + (NSException *)failureInEqualityBetweenValue:(NSValue *)left
1039*9712c20fSFrederick Mayle                                       andValue:(NSValue *)right
1040*9712c20fSFrederick Mayle                                   withAccuracy:(NSValue *)accuracy
1041*9712c20fSFrederick Mayle                                         inFile:(NSString *)filename
1042*9712c20fSFrederick Mayle                                         atLine:(int) ineNumber
1043*9712c20fSFrederick Mayle                                withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(6, 7);
1044*9712c20fSFrederick Mayle + (NSException *)failureInRaise:(NSString *)expression
1045*9712c20fSFrederick Mayle                          inFile:(NSString *)filename
1046*9712c20fSFrederick Mayle                          atLine:(int)lineNumber
1047*9712c20fSFrederick Mayle                 withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(4, 5);
1048*9712c20fSFrederick Mayle + (NSException *)failureInRaise:(NSString *)expression
1049*9712c20fSFrederick Mayle                       exception:(NSException *)exception
1050*9712c20fSFrederick Mayle                          inFile:(NSString *)filename
1051*9712c20fSFrederick Mayle                          atLine:(int)lineNumber
1052*9712c20fSFrederick Mayle                 withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6);
1053*9712c20fSFrederick Mayle @end
1054*9712c20fSFrederick Mayle 
1055*9712c20fSFrederick Mayle // SENTE_END
1056*9712c20fSFrederick Mayle 
1057*9712c20fSFrederick Mayle @protocol SenTestCase
1058*9712c20fSFrederick Mayle + (id)testCaseWithInvocation:(NSInvocation *)anInvocation;
1059*9712c20fSFrederick Mayle - (id)initWithInvocation:(NSInvocation *)anInvocation;
1060*9712c20fSFrederick Mayle - (void)setUp;
1061*9712c20fSFrederick Mayle - (void)invokeTest;
1062*9712c20fSFrederick Mayle - (void)tearDown;
1063*9712c20fSFrederick Mayle - (void)performTest;
1064*9712c20fSFrederick Mayle - (void)failWithException:(NSException*)exception;
1065*9712c20fSFrederick Mayle - (NSInvocation *)invocation;
1066*9712c20fSFrederick Mayle - (SEL)selector;
1067*9712c20fSFrederick Mayle + (NSArray *)testInvocations;
1068*9712c20fSFrederick Mayle @end
1069*9712c20fSFrederick Mayle 
1070*9712c20fSFrederick Mayle @interface SenTestCase : NSObject<SenTestCase> {
1071*9712c20fSFrederick Mayle  @private
1072*9712c20fSFrederick Mayle   NSInvocation *invocation_;
1073*9712c20fSFrederick Mayle }
1074*9712c20fSFrederick Mayle @end
1075*9712c20fSFrederick Mayle 
1076*9712c20fSFrederick Mayle GTM_EXTERN NSString *const SenTestFailureException;
1077*9712c20fSFrederick Mayle 
1078*9712c20fSFrederick Mayle GTM_EXTERN NSString *const SenTestFilenameKey;
1079*9712c20fSFrederick Mayle GTM_EXTERN NSString *const SenTestLineNumberKey;
1080*9712c20fSFrederick Mayle 
1081*9712c20fSFrederick Mayle #endif // GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST
1082*9712c20fSFrederick Mayle 
1083*9712c20fSFrederick Mayle // All unittest cases in GTM should inherit from GTMTestCase. It makes sure
1084*9712c20fSFrederick Mayle // to set up our logging system correctly to verify logging calls.
1085*9712c20fSFrederick Mayle // See GTMUnitTestDevLog.h for details
1086*9712c20fSFrederick Mayle @interface GTMTestCase : SenTestCase
1087*9712c20fSFrederick Mayle 
1088*9712c20fSFrederick Mayle // Returns YES if this is an abstract testCase class as opposed to a concrete
1089*9712c20fSFrederick Mayle // testCase class that you want tests run against. SenTestCase is not designed
1090*9712c20fSFrederick Mayle // out of the box to handle an abstract class hierarchy descending from it with
1091*9712c20fSFrederick Mayle // some concrete subclasses.  In some cases we want all the "concrete"
1092*9712c20fSFrederick Mayle // subclasses of an abstract subclass of SenTestCase to run a test, but we don't
1093*9712c20fSFrederick Mayle // want that test to be run against an instance of an abstract subclass itself.
1094*9712c20fSFrederick Mayle // By returning "YES" here, the tests defined by this class won't be run against
1095*9712c20fSFrederick Mayle // an instance of this class. As an example class hierarchy:
1096*9712c20fSFrederick Mayle //
1097*9712c20fSFrederick Mayle //                                            FooExtensionTestCase
1098*9712c20fSFrederick Mayle // GTMTestCase <- ExtensionAbstractTestCase <
1099*9712c20fSFrederick Mayle //                                            BarExtensionTestCase
1100*9712c20fSFrederick Mayle //
1101*9712c20fSFrederick Mayle // So FooExtensionTestCase and BarExtensionTestCase inherit from
1102*9712c20fSFrederick Mayle // ExtensionAbstractTestCase (and probably FooExtension and BarExtension inherit
1103*9712c20fSFrederick Mayle // from a class named Extension). We want the tests in ExtensionAbstractTestCase
1104*9712c20fSFrederick Mayle // to be run as part of FooExtensionTestCase and BarExtensionTestCase, but we
1105*9712c20fSFrederick Mayle // don't want them run against ExtensionAbstractTestCase. The default
1106*9712c20fSFrederick Mayle // implementation checks to see if the name of the class contains the word
1107*9712c20fSFrederick Mayle // "AbstractTest" (case sensitive).
1108*9712c20fSFrederick Mayle + (BOOL)isAbstractTestCase;
1109*9712c20fSFrederick Mayle 
1110*9712c20fSFrederick Mayle @end
1111