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 // 18 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. 49 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. 53 54 #import "GTMDefines.h" 55 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 63 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__ 72 73 #ifdef __cplusplus 74 } 75 #endif 76 77 #endif // !GTM_IPHONE_SDK || GTM_IPHONE_USE_SENTEST 78 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) 106 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) 136 137 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) 165 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) 193 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) 232 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) 262 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) 302 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__) 313 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__) 324 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__) 335 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__) 346 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) 381 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) 415 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) 444 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) 472 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 "*/ 486 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) 529 530 #define STAssertEqualGLKVectors(a1, a2, accuracy, description, ...) \ 531 STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) 532 533 #define STAssertEqualGLKMatrices(a1, a2, accuracy, description, ...) \ 534 STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) 535 536 #define STAssertEqualGLKQuaternions(a1, a2, accuracy, description, ...) \ 537 STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) 538 539 #if GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST 540 // When not using the Xcode provided version, define everything ourselves. 541 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) 574 575 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) 614 615 #define STAbsoluteDifference(left,right) (MAX(left,right)-MIN(left,right)) 616 617 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 "*/ 629 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) 662 663 664 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__)]] 674 675 676 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) 705 706 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) 735 736 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) 755 756 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) 785 786 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) 805 806 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) 835 836 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) 857 858 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) 891 892 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.} 903 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) 939 940 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) 960 961 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) 986 987 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.} 998 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) 1021 1022 1023 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 1054 1055 // SENTE_END 1056 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 1069 1070 @interface SenTestCase : NSObject<SenTestCase> { 1071 @private 1072 NSInvocation *invocation_; 1073 } 1074 @end 1075 1076 GTM_EXTERN NSString *const SenTestFailureException; 1077 1078 GTM_EXTERN NSString *const SenTestFilenameKey; 1079 GTM_EXTERN NSString *const SenTestLineNumberKey; 1080 1081 #endif // GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST 1082 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 1087 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; 1109 1110 @end 1111