From c83cd11615dc48188882a6cbe7c15c05c172d66e Mon Sep 17 00:00:00 2001 From: "qsr@chromium.org" Date: Fri, 21 Sep 2012 07:55:17 +0000 Subject: Update GTM files to latest from http://google-toolbox-for-mac.googlecode.com/svn/trunk/ Patch by: jakerr@google.com Review: https://breakpad.appspot.com/452002/ git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1045 4c0a9323-5329-0410-9bdc-e9ce6186880e --- src/common/mac/testing/GTMSenTestCase.h | 904 ++++++++++++++++++-------------- 1 file changed, 505 insertions(+), 399 deletions(-) (limited to 'src/common/mac/testing/GTMSenTestCase.h') diff --git a/src/common/mac/testing/GTMSenTestCase.h b/src/common/mac/testing/GTMSenTestCase.h index d425f597..ce3d9022 100644 --- a/src/common/mac/testing/GTMSenTestCase.h +++ b/src/common/mac/testing/GTMSenTestCase.h @@ -6,9 +6,9 @@ // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy // of the License at -// +// // http://www.apache.org/licenses/LICENSE-2.0 -// +// // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -22,44 +22,60 @@ // Copyright (c) 1997-2005, Sen:te (Sente SA). All rights reserved. // // Use of this source code is governed by the following license: -// -// Redistribution and use in source and binary forms, with or without modification, +// +// Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: -// -// (1) Redistributions of source code must retain the above copyright notice, +// +// (1) Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. -// -// (2) Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation +// +// (2) Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -// IN NO EVENT SHALL Sente SA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -// OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL Sente SA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +// OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +// // Note: this license is equivalent to the FreeBSD license. -// +// // This notice may not be removed from this file. -// Some extra test case macros that would have been convenient for SenTestingKit -// to provide. I didn't stick GTM in front of the Macro names, so that they would +// Some extra test case macros that would have been convenient for SenTestingKit +// to provide. I didn't stick GTM in front of the Macro names, so that they would // be easy to remember. #import "GTMDefines.h" -#if (!GTM_IPHONE_SDK) +#if (!GTM_IPHONE_SDK) || (GTM_IPHONE_USE_SENTEST) #import #else #import +#ifdef __cplusplus +extern "C" { +#endif + +#if defined __clang__ +// gcc and gcc-llvm do not allow you to use STAssert(blah, nil) with nil +// as a description if you have the NS_FORMAT_FUNCTION on. +// clang however will not compile without warnings if you don't have it. +NSString *STComposeString(NSString *, ...) NS_FORMAT_FUNCTION(1, 2); +#else NSString *STComposeString(NSString *, ...); +#endif // __clang__ + +#ifdef __cplusplus +} #endif +#endif // !GTM_IPHONE_SDK || GTM_IPHONE_USE_SENTEST + // Generates a failure when a1 != noErr // Args: // a1: should be either an OSErr or an OSStatus @@ -68,25 +84,24 @@ NSString *STComposeString(NSString *, ...); // ...: A variable number of arguments to the format string. Can be absent. #define STAssertNoErr(a1, description, ...) \ do { \ - @try {\ + @try { \ OSStatus a1value = (a1); \ if (a1value != noErr) { \ - NSString *_expression = [NSString stringWithFormat:@"Expected noErr, got %ld for (%s)", a1value, #a1]; \ - if (description) { \ - _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ - } \ - [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ - atLine:__LINE__ \ - withDescription:_expression]]; \ + NSString *_expression = [NSString stringWithFormat:@"Expected noErr, got %ld for (%s)", (long)a1value, #a1]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ } \ - }\ - @catch (id anException) {\ + } \ + @catch (id anException) { \ [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == noErr fails", #a1] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) // Generates a failure when a1 != a2 @@ -98,26 +113,25 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertErr(a1, a2, description, ...) \ do { \ - @try {\ + @try { \ OSStatus a1value = (a1); \ OSStatus a2value = (a2); \ if (a1value != a2value) { \ - NSString *_expression = [NSString stringWithFormat:@"Expected %s(%ld) but got %ld for (%s)", #a2, a2value, a1value, #a1]; \ - if (description) { \ - _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ - } \ - [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ - atLine:__LINE__ \ - withDescription:_expression]]; \ + NSString *_expression = [NSString stringWithFormat:@"Expected %s(%ld) but got %ld for (%s)", #a2, (long)a2value, (long)a1value, #a1]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ } \ - }\ - @catch (id anException) {\ + } \ + @catch (id anException) { \ [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s) fails", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) @@ -129,25 +143,24 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertNotNULL(a1, description, ...) \ do { \ - @try {\ - const void* a1value = (a1); \ - if (a1value == NULL) { \ - NSString *_expression = [NSString stringWithFormat:@"(%s) != NULL", #a1]; \ - if (description) { \ - _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ - } \ - [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ - atLine:__LINE__ \ - withDescription:_expression]]; \ + @try { \ + __typeof__(a1) a1value = (a1); \ + if (a1value == (__typeof__(a1))NULL) { \ + NSString *_expression = [NSString stringWithFormat:@"((%s) != NULL)", #a1]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ } \ - }\ - @catch (id anException) {\ + } \ + @catch (id anException) { \ [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != NULL fails", #a1] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) // Generates a failure when a1 is not NULL @@ -158,28 +171,27 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertNULL(a1, description, ...) \ do { \ - @try {\ - const void* a1value = (a1); \ - if (a1value != NULL) { \ - NSString *_expression = [NSString stringWithFormat:@"(%s) == NULL", #a1]; \ - if (description) { \ - _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ - } \ - [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ - atLine:__LINE__ \ - withDescription:_expression]]; \ + @try { \ + __typeof__(a1) a1value = (a1); \ + if (a1value != (__typeof__(a1))NULL) { \ + NSString *_expression = [NSString stringWithFormat:@"((%s) == NULL)", #a1]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ } \ - }\ - @catch (id anException) {\ + } \ + @catch (id anException) { \ [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == NULL fails", #a1] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) -// Generates a failure when a1 is equal to a2. This test is for C scalars, +// Generates a failure when a1 is equal to a2. This test is for C scalars, // structs and unions. // Args: // a1: argument 1 @@ -189,34 +201,33 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertNotEquals(a1, a2, description, ...) \ do { \ - @try {\ - if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:[[[NSString stringWithFormat:@"Type mismatch (%@/%@) -- ",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ } else { \ __typeof__(a1) a1value = (a1); \ __typeof__(a2) a2value = (a2); \ NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \ NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \ if ([a1encoded isEqualToValue:a2encoded]) { \ - NSString *_expression = [NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2]; \ - if (description) { \ - _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ - } \ - [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ - atLine:__LINE__ \ - withDescription:_expression]]; \ - } \ + NSString *_expression = [NSString stringWithFormat:@"((%s) != (%s))", #a1, #a2]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + }\ } \ } \ - @catch (id anException) {\ + @catch (id anException) { \ [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) // Generates a failure when a1 is equal to a2. This test is for objects. @@ -226,32 +237,30 @@ do { \ // description: A format string as in the printf() function. Can be nil or // an empty string but must be present. // ...: A variable number of arguments to the format string. Can be absent. -#define STAssertNotEqualObjects(a1, a2, desc, ...) \ +#define STAssertNotEqualObjects(a1, a2, description, ...) \ do { \ @try {\ id a1value = (a1); \ id a2value = (a2); \ - if ( (@encode(__typeof__(a1value)) == @encode(id)) && \ - (@encode(__typeof__(a2value)) == @encode(id)) && \ - ![(id)a1value isEqual:(id)a2value] ) continue; \ - NSString *_expression = [NSString stringWithFormat:@"%s('%@') != %s('%@')", #a1, [a1 description], #a2, [a2 description]]; \ - if (desc) { \ - _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(desc, ##__VA_ARGS__)]; \ - } \ - [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ - atLine:__LINE__ \ - withDescription:_expression]]; \ + if ( (strcmp(@encode(__typeof__(a1value)), @encode(id)) == 0) && \ + (strcmp(@encode(__typeof__(a2value)), @encode(id)) == 0) && \ + (![(id)a1value isEqual:(id)a2value]) ) continue; \ + [self failWithException:([NSException failureInEqualityBetweenObject:a1value \ + andObject:a2value \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ }\ @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \ - exception:anException \ - inFile:[NSString stringWithUTF8String:__FILE__] \ - atLine:__LINE__ \ - withDescription:STComposeString(desc, ##__VA_ARGS__)]]; \ + [self failWithException:([NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ }\ } while(0) -// Generates a failure when a1 is not 'op' to a2. This test is for C scalars. +// Generates a failure when a1 is not 'op' to a2. This test is for C scalars. // Args: // a1: argument 1 // a2: argument 2 @@ -261,38 +270,37 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertOperation(a1, a2, op, description, ...) \ do { \ - @try {\ - if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:[[[NSString stringWithFormat:@"Type mismatch (%@/%@) -- ",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ } else { \ __typeof__(a1) a1value = (a1); \ __typeof__(a2) a2value = (a2); \ if (!(a1value op a2value)) { \ double a1DoubleValue = a1value; \ double a2DoubleValue = a2value; \ - NSString *_expression = [NSString stringWithFormat:@"%s (%lg) %s %s (%lg)", #a1, a1DoubleValue, #op, #a2, a2DoubleValue]; \ - if (description) { \ - _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ - } \ - [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ - atLine:__LINE__ \ - withDescription:_expression]]; \ + NSString *_expression = [NSString stringWithFormat:@"(%s (%lg) %s %s (%lg))", #a1, a1DoubleValue, #op, #a2, a2DoubleValue]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ } \ } \ } \ - @catch (id anException) {\ + @catch (id anException) { \ [self failWithException:[NSException \ failureInRaise:[NSString stringWithFormat:@"(%s) %s (%s)", #a1, #op, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) -// Generates a failure when a1 is not > a2. This test is for C scalars. +// Generates a failure when a1 is not > a2. This test is for C scalars. // Args: // a1: argument 1 // a2: argument 2 @@ -303,7 +311,7 @@ do { \ #define STAssertGreaterThan(a1, a2, description, ...) \ STAssertOperation(a1, a2, >, description, ##__VA_ARGS__) -// Generates a failure when a1 is not >= a2. This test is for C scalars. +// Generates a failure when a1 is not >= a2. This test is for C scalars. // Args: // a1: argument 1 // a2: argument 2 @@ -314,7 +322,7 @@ do { \ #define STAssertGreaterThanOrEqual(a1, a2, description, ...) \ STAssertOperation(a1, a2, >=, description, ##__VA_ARGS__) -// Generates a failure when a1 is not < a2. This test is for C scalars. +// Generates a failure when a1 is not < a2. This test is for C scalars. // Args: // a1: argument 1 // a2: argument 2 @@ -325,7 +333,7 @@ do { \ #define STAssertLessThan(a1, a2, description, ...) \ STAssertOperation(a1, a2, <, description, ##__VA_ARGS__) -// Generates a failure when a1 is not <= a2. This test is for C scalars. +// Generates a failure when a1 is not <= a2. This test is for C scalars. // Args: // a1: argument 1 // a2: argument 2 @@ -349,26 +357,26 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertEqualStrings(a1, a2, description, ...) \ do { \ - @try {\ + @try { \ id a1value = (a1); \ id a2value = (a2); \ if (a1value == a2value) continue; \ if ([a1value isKindOfClass:[NSString class]] && \ [a2value isKindOfClass:[NSString class]] && \ [a1value compare:a2value options:0] == NSOrderedSame) continue; \ - [self failWithException:[NSException failureInEqualityBetweenObject: a1value \ - andObject: a2value \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ - }\ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + [self failWithException:[NSException failureInEqualityBetweenObject:a1value \ + andObject:a2value \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) // Generates a failure when string a1 is equal to string a2. This call @@ -384,25 +392,25 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertNotEqualStrings(a1, a2, description, ...) \ do { \ - @try {\ + @try { \ id a1value = (a1); \ id a2value = (a2); \ if ([a1value isKindOfClass:[NSString class]] && \ [a2value isKindOfClass:[NSString class]] && \ [a1value compare:a2value options:0] != NSOrderedSame) continue; \ - [self failWithException:[NSException failureInEqualityBetweenObject: a1value \ - andObject: a2value \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ - }\ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \ + [self failWithException:[NSException failureInEqualityBetweenObject:a1value \ + andObject:a2value \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) // Generates a failure when c-string a1 is not equal to c-string a2. @@ -414,24 +422,24 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertEqualCStrings(a1, a2, description, ...) \ do { \ - @try {\ + @try { \ const char* a1value = (a1); \ const char* a2value = (a2); \ if (a1value == a2value) continue; \ if (strcmp(a1value, a2value) == 0) continue; \ - [self failWithException:[NSException failureInEqualityBetweenObject: [NSString stringWithUTF8String:a1value] \ - andObject: [NSString stringWithUTF8String:a2value] \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ - }\ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + [self failWithException:[NSException failureInEqualityBetweenObject:[NSString stringWithUTF8String:a1value] \ + andObject:[NSString stringWithUTF8String:a2value] \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) // Generates a failure when c-string a1 is equal to c-string a2. @@ -443,30 +451,97 @@ do { \ // ...: A variable number of arguments to the format string. Can be absent. #define STAssertNotEqualCStrings(a1, a2, description, ...) \ do { \ - @try {\ + @try { \ const char* a1value = (a1); \ const char* a2value = (a2); \ if (strcmp(a1value, a2value) != 0) continue; \ - [self failWithException:[NSException failureInEqualityBetweenObject: [NSString stringWithUTF8String:a1value] \ - andObject: [NSString stringWithUTF8String:a2value] \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ - }\ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \ + [self failWithException:[NSException failureInEqualityBetweenObject:[NSString stringWithUTF8String:a1value] \ + andObject:[NSString stringWithUTF8String:a2value] \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +/*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false. + This test is for GLKit types (GLKVector, GLKMatrix) where small differences + could make these items not exactly equal. Do not use this version directly. + Use the explicit STAssertEqualGLKVectors and STAssertEqualGLKMatrices defined + below. + _{a1 The GLKType on the left.} + _{a2 The GLKType on the right.} + _{accuracy The maximum difference between a1 and a2 for these values to be + considered equal.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ + +#define STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ...) \ +do { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ + } else { \ + __typeof__(a1) a1GLKValue = (a1); \ + __typeof__(a2) a2GLKValue = (a2); \ + __typeof__(accuracy) accuracyvalue = (accuracy); \ + float *a1FloatValue = ((float*)&a1GLKValue); \ + float *a2FloatValue = ((float*)&a2GLKValue); \ + for (size_t i = 0; i < sizeof(__typeof__(a1)) / sizeof(float); ++i) { \ + float a1value = a1FloatValue[i]; \ + float a2value = a2FloatValue[i]; \ + if (STAbsoluteDifference(a1value, a2value) > accuracyvalue) { \ + NSMutableArray *strings = [NSMutableArray arrayWithCapacity:sizeof(a1) / sizeof(float)]; \ + NSString *string; \ + for (size_t j = 0; j < sizeof(__typeof__(a1)) / sizeof(float); ++j) { \ + string = [NSString stringWithFormat:@"(%0.3f == %0.3f)", a1FloatValue[j], a2FloatValue[j]]; \ + [strings addObject:string]; \ + } \ + string = [strings componentsJoinedByString:@", "]; \ + NSString *desc = STComposeString(description, ##__VA_ARGS__); \ + desc = [NSString stringWithFormat:@"%@ With Accuracy %0.3f: %@", string, (float)accuracyvalue, desc]; \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", desc]]; \ + break; \ + } \ + } \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) -#if GTM_IPHONE_SDK +#define STAssertEqualGLKVectors(a1, a2, accuracy, description, ...) \ + STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) + +#define STAssertEqualGLKMatrices(a1, a2, accuracy, description, ...) \ + STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) + +#define STAssertEqualGLKQuaternions(a1, a2, accuracy, description, ...) \ + STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) + +#if GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST +// When not using the Xcode provided version, define everything ourselves. // SENTE_BEGIN -/*" Generates a failure when !{ [a1 isEqualTo:a2] } is false - (or one is nil and the other is not). +/*" Generates a failure when !{ [a1 isEqualTo:a2] } is false + (or one is nil and the other is not). _{a1 The object on the left.} _{a2 The object on the right.} _{description A format string as in the printf() function. Can be nil or @@ -475,26 +550,26 @@ do { \ "*/ #define STAssertEqualObjects(a1, a2, description, ...) \ do { \ - @try {\ + @try { \ id a1value = (a1); \ id a2value = (a2); \ if (a1value == a2value) continue; \ - if ( (@encode(__typeof__(a1value)) == @encode(id)) && \ - (@encode(__typeof__(a2value)) == @encode(id)) && \ - [(id)a1value isEqual: (id)a2value] ) continue; \ - [self failWithException:[NSException failureInEqualityBetweenObject: a1value \ - andObject: a2value \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ - }\ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + if ((strcmp(@encode(__typeof__(a1value)), @encode(id)) == 0) && \ + (strcmp(@encode(__typeof__(a2value)), @encode(id)) == 0) && \ + [(id)a1value isEqual:(id)a2value]) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject:a1value \ + andObject:a2value \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) @@ -508,40 +583,40 @@ do { \ "*/ #define STAssertEquals(a1, a2, description, ...) \ do { \ - @try {\ - if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:[[NSString stringWithFormat:@"Type mismatch (%@/%@) -- ",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ } else { \ __typeof__(a1) a1value = (a1); \ __typeof__(a2) a2value = (a2); \ - NSValue *a1encoded = [NSValue value:&a1value withObjCType: @encode(__typeof__(a1))]; \ - NSValue *a2encoded = [NSValue value:&a2value withObjCType: @encode(__typeof__(a2))]; \ + NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \ + NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \ if (![a1encoded isEqualToValue:a2encoded]) { \ - [self failWithException:[NSException failureInEqualityBetweenValue: a1encoded \ - andValue: a2encoded \ - withAccuracy: nil \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + [self failWithException:[NSException failureInEqualityBetweenValue:a1encoded \ + andValue:a2encoded \ + withAccuracy:nil \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } \ } \ } \ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) #define STAbsoluteDifference(left,right) (MAX(left,right)-MIN(left,right)) -/*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false. - This test is for scalars such as floats and doubles where small differences +/*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false. + This test is for scalars such as floats and doubles where small differences could make these items not exactly equal, but also works for all scalars. _{a1 The scalar on the left.} _{a2 The scalar on the right.} @@ -554,11 +629,11 @@ do { \ #define STAssertEqualsWithAccuracy(a1, a2, accuracy, description, ...) \ do { \ - @try {\ - if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:[[[NSString stringWithFormat:@"Type mismatch (%@/%@) -- ",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ } else { \ __typeof__(a1) a1value = (a1); \ __typeof__(a2) a2value = (a2); \ @@ -567,35 +642,35 @@ do { \ NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \ NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \ NSValue *accuracyencoded = [NSValue value:&accuracyvalue withObjCType:@encode(__typeof__(accuracy))]; \ - [self failWithException:[NSException failureInEqualityBetweenValue: a1encoded \ - andValue: a2encoded \ - withAccuracy: accuracyencoded \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + [self failWithException:[NSException failureInEqualityBetweenValue:a1encoded \ + andValue:a2encoded \ + withAccuracy:accuracyencoded \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } \ } \ } \ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) -/*" Generates a failure unconditionally. +/*" Generates a failure unconditionally. _{description A format string as in the printf() function. Can be nil or an empty string but must be present.} _{... A variable number of arguments to the format string. Can be absent.} "*/ #define STFail(description, ...) \ -[self failWithException:[NSException failureInFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]] +[self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]] @@ -607,25 +682,25 @@ do { \ "*/ #define STAssertNil(a1, description, ...) \ do { \ - @try {\ + @try { \ id a1value = (a1); \ if (a1value != nil) { \ - NSString *_a1 = [NSString stringWithUTF8String: #a1]; \ + NSString *_a1 = [NSString stringWithUTF8String:#a1]; \ NSString *_expression = [NSString stringWithFormat:@"((%@) == nil)", _a1]; \ - [self failWithException:[NSException failureInCondition: _expression \ - isTrue: NO \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } \ - }\ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == nil fails", #a1] \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == nil fails", #a1] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) @@ -637,29 +712,29 @@ do { \ "*/ #define STAssertNotNil(a1, description, ...) \ do { \ - @try {\ + @try { \ id a1value = (a1); \ if (a1value == nil) { \ - NSString *_a1 = [NSString stringWithUTF8String: #a1]; \ + NSString *_a1 = [NSString stringWithUTF8String:#a1]; \ NSString *_expression = [NSString stringWithFormat:@"((%@) != nil)", _a1]; \ - [self failWithException:[NSException failureInCondition: _expression \ - isTrue: NO \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } \ - }\ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != nil fails", #a1] \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != nil fails", #a1] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while(0) -/*" Generates a failure when expression evaluates to false. +/*" Generates a failure when expression evaluates to false. _{expr The expression that is tested.} _{description A format string as in the printf() function. Can be nil or an empty string but must be present.} @@ -667,20 +742,20 @@ do { \ "*/ #define STAssertTrue(expr, description, ...) \ do { \ - BOOL _evaluatedExpression = (expr);\ - if (!_evaluatedExpression) {\ - NSString *_expression = [NSString stringWithUTF8String: #expr];\ - [self failWithException:[NSException failureInCondition: _expression \ - isTrue: NO \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + BOOL _evaluatedExpression = (expr); \ + if (!_evaluatedExpression) { \ + NSString *_expression = [NSString stringWithUTF8String:#expr]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } \ } while (0) -/*" Generates a failure when expression evaluates to false and in addition will - generate error messages if an exception is encountered. +/*" Generates a failure when expression evaluates to false and in addition will + generate error messages if an exception is encountered. _{expr The expression that is tested.} _{description A format string as in the printf() function. Can be nil or an empty string but must be present.} @@ -688,28 +763,28 @@ do { \ "*/ #define STAssertTrueNoThrow(expr, description, ...) \ do { \ - @try {\ - BOOL _evaluatedExpression = (expr);\ - if (!_evaluatedExpression) {\ - NSString *_expression = [NSString stringWithUTF8String: #expr];\ - [self failWithException:[NSException failureInCondition: _expression \ - isTrue: NO \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + @try { \ + BOOL _evaluatedExpression = (expr); \ + if (!_evaluatedExpression) { \ + NSString *_expression = [NSString stringWithUTF8String:#expr]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } \ } \ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) ", #expr] \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) ", #expr] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while (0) -/*" Generates a failure when the expression evaluates to true. +/*" Generates a failure when the expression evaluates to true. _{expr The expression that is tested.} _{description A format string as in the printf() function. Can be nil or an empty string but must be present.} @@ -717,19 +792,19 @@ do { \ "*/ #define STAssertFalse(expr, description, ...) \ do { \ - BOOL _evaluatedExpression = (expr);\ - if (_evaluatedExpression) {\ - NSString *_expression = [NSString stringWithUTF8String: #expr];\ - [self failWithException:[NSException failureInCondition: _expression \ - isTrue: YES \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + BOOL _evaluatedExpression = (expr); \ + if (_evaluatedExpression) { \ + NSString *_expression = [NSString stringWithUTF8String:#expr]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:YES \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } \ } while (0) -/*" Generates a failure when the expression evaluates to true and in addition +/*" Generates a failure when the expression evaluates to true and in addition will generate error messages if an exception is encountered. _{expr The expression that is tested.} _{description A format string as in the printf() function. Can be nil or @@ -738,28 +813,28 @@ do { \ "*/ #define STAssertFalseNoThrow(expr, description, ...) \ do { \ - @try {\ - BOOL _evaluatedExpression = (expr);\ - if (_evaluatedExpression) {\ - NSString *_expression = [NSString stringWithUTF8String: #expr];\ - [self failWithException:[NSException failureInCondition: _expression \ - isTrue: YES \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + @try { \ + BOOL _evaluatedExpression = (expr); \ + if (_evaluatedExpression) { \ + NSString *_expression = [NSString stringWithUTF8String:#expr]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:YES \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } \ } \ - @catch (id anException) {\ - [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"!(%s) ", #expr] \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"!(%s) ", #expr] \ exception:anException \ inFile:[NSString stringWithUTF8String:__FILE__] \ atLine:__LINE__ \ - withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while (0) -/*" Generates a failure when expression does not throw an exception. +/*" Generates a failure when expression does not throw an exception. _{expression The expression that is evaluated.} _{description A format string as in the printf() function. Can be nil or an empty string but must be present.} @@ -768,21 +843,21 @@ do { \ #define STAssertThrows(expr, description, ...) \ do { \ @try { \ - (expr);\ + (expr); \ } \ @catch (id anException) { \ continue; \ - }\ - [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: nil \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:nil \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ } while (0) -/*" Generates a failure when expression does not throw an exception of a - specific class. +/*" Generates a failure when expression does not throw an exception of a + specific class. _{expression The expression that is evaluated.} _{specificException The specified class of the exception.} _{description A format string as in the printf() function. Can be nil or @@ -792,32 +867,32 @@ do { \ #define STAssertThrowsSpecific(expr, specificException, description, ...) \ do { \ @try { \ - (expr);\ + (expr); \ } \ @catch (specificException *anException) { \ continue; \ - }\ - @catch (id anException) {\ - NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\ - [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: anException \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ continue; \ - }\ - NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\ - [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: nil \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + } \ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:nil \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ } while (0) -/*" Generates a failure when expression does not throw an exception of a +/*" Generates a failure when expression does not throw an exception of a specific class with a specific name. Useful for those frameworks like - AppKit or Foundation that throw generic NSException w/specific names + AppKit or Foundation that throw generic NSException w/specific names (NSInvalidArgumentException, etc). _{expression The expression that is evaluated.} _{specificException The specified class of the exception.} @@ -830,40 +905,40 @@ do { \ #define STAssertThrowsSpecificNamed(expr, specificException, aName, description, ...) \ do { \ @try { \ - (expr);\ + (expr); \ } \ @catch (specificException *anException) { \ - if ([aName isEqualToString: [anException name]]) continue; \ - NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description);\ + if ([aName isEqualToString:[anException name]]) continue; \ + NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description); \ [self failWithException: \ - [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: anException \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ continue; \ - }\ - @catch (id anException) {\ - NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\ + } \ + @catch (id anException) { \ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \ [self failWithException: \ - [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: anException \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ continue; \ - }\ - NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\ + } \ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \ [self failWithException: \ - [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: nil \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:nil \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ } while (0) -/*" Generates a failure when expression does throw an exception. +/*" Generates a failure when expression does throw an exception. _{expression The expression that is evaluated.} _{description A format string as in the printf() function. Can be nil or an empty string but must be present.} @@ -872,15 +947,15 @@ do { \ #define STAssertNoThrow(expr, description, ...) \ do { \ @try { \ - (expr);\ + (expr); \ } \ @catch (id anException) { \ - [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: anException \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ - }\ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ } while (0) @@ -895,24 +970,24 @@ do { \ #define STAssertNoThrowSpecific(expr, specificException, description, ...) \ do { \ @try { \ - (expr);\ + (expr); \ } \ @catch (specificException *anException) { \ - [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: anException \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ - }\ - @catch (id anythingElse) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anythingElse) { \ ; \ - }\ + } \ } while (0) -/*" Generates a failure when expression does throw an exception of a +/*" Generates a failure when expression does throw an exception of a specific class with a specific name. Useful for those frameworks like - AppKit or Foundation that throw generic NSException w/specific names + AppKit or Foundation that throw generic NSException w/specific names (NSInvalidArgumentException, etc). _{expression The expression that is evaluated.} _{specificException The specified class of the exception.} @@ -925,69 +1000,77 @@ do { \ #define STAssertNoThrowSpecificNamed(expr, specificException, aName, description, ...) \ do { \ @try { \ - (expr);\ + (expr); \ } \ @catch (specificException *anException) { \ - if ([aName isEqualToString: [anException name]]) { \ - NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description);\ + if ([aName isEqualToString:[anException name]]) { \ + NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description); \ [self failWithException: \ - [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ - exception: anException \ - inFile: [NSString stringWithUTF8String:__FILE__] \ - atLine: __LINE__ \ - withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ } \ continue; \ - }\ - @catch (id anythingElse) {\ + } \ + @catch (id anythingElse) { \ ; \ - }\ + } \ } while (0) @interface NSException (GTMSenTestAdditions) -+ (NSException *)failureInFile:(NSString *)filename - atLine:(int)lineNumber - withDescription:(NSString *)formatString, ...; -+ (NSException *)failureInCondition:(NSString *)condition - isTrue:(BOOL)isTrue - inFile:(NSString *)filename - atLine:(int)lineNumber - withDescription:(NSString *)formatString, ...; ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(3, 4); ++ (NSException *)failureInCondition:(NSString *)condition + isTrue:(BOOL)isTrue + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6); + (NSException *)failureInEqualityBetweenObject:(id)left andObject:(id)right inFile:(NSString *)filename atLine:(int)lineNumber - withDescription:(NSString *)formatString, ...; -+ (NSException *)failureInEqualityBetweenValue:(NSValue *)left - andValue:(NSValue *)right - withAccuracy:(NSValue *)accuracy - inFile:(NSString *)filename + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6); ++ (NSException *)failureInEqualityBetweenValue:(NSValue *)left + andValue:(NSValue *)right + withAccuracy:(NSValue *)accuracy + inFile:(NSString *)filename atLine:(int) ineNumber - withDescription:(NSString *)formatString, ...; -+ (NSException *)failureInRaise:(NSString *)expression - inFile:(NSString *)filename + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(6, 7); ++ (NSException *)failureInRaise:(NSString *)expression + inFile:(NSString *)filename atLine:(int)lineNumber - withDescription:(NSString *)formatString, ...; -+ (NSException *)failureInRaise:(NSString *)expression - exception:(NSException *)exception - inFile:(NSString *)filename - atLine:(int)lineNumber - withDescription:(NSString *)formatString, ...; + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(4, 5); ++ (NSException *)failureInRaise:(NSString *)expression + exception:(NSException *)exception + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6); @end // SENTE_END -@interface SenTestCase : NSObject { - SEL currentSelector_; -} - +@protocol SenTestCase ++ (id)testCaseWithInvocation:(NSInvocation *)anInvocation; +- (id)initWithInvocation:(NSInvocation *)anInvocation; - (void)setUp; - (void)invokeTest; - (void)tearDown; -- (void)performTest:(SEL)sel; +- (void)performTest; - (void)failWithException:(NSException*)exception; +- (NSInvocation *)invocation; +- (SEL)selector; ++ (NSArray *)testInvocations; +@end + +@interface SenTestCase : NSObject { + @private + NSInvocation *invocation_; +} @end GTM_EXTERN NSString *const SenTestFailureException; @@ -995,10 +1078,33 @@ GTM_EXTERN NSString *const SenTestFailureException; GTM_EXTERN NSString *const SenTestFilenameKey; GTM_EXTERN NSString *const SenTestLineNumberKey; -#endif // GTM_IPHONE_SDK +#endif // GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST // All unittest cases in GTM should inherit from GTMTestCase. It makes sure // to set up our logging system correctly to verify logging calls. // See GTMUnitTestDevLog.h for details @interface GTMTestCase : SenTestCase + +// Returns YES if this is an abstract testCase class as opposed to a concrete +// testCase class that you want tests run against. SenTestCase is not designed +// out of the box to handle an abstract class hierarchy descending from it with +// some concrete subclasses. In some cases we want all the "concrete" +// subclasses of an abstract subclass of SenTestCase to run a test, but we don't +// want that test to be run against an instance of an abstract subclass itself. +// By returning "YES" here, the tests defined by this class won't be run against +// an instance of this class. As an example class hierarchy: +// +// FooExtensionTestCase +// GTMTestCase <- ExtensionAbstractTestCase < +// BarExtensionTestCase +// +// So FooExtensionTestCase and BarExtensionTestCase inherit from +// ExtensionAbstractTestCase (and probably FooExtension and BarExtension inherit +// from a class named Extension). We want the tests in ExtensionAbstractTestCase +// to be run as part of FooExtensionTestCase and BarExtensionTestCase, but we +// don't want them run against ExtensionAbstractTestCase. The default +// implementation checks to see if the name of the class contains the word +// "AbstractTest" (case sensitive). ++ (BOOL)isAbstractTestCase; + @end -- cgit v1.2.1