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