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