aboutsummaryrefslogtreecommitdiff
path: root/UnitTesting/GTMNSObject+BindingUnitTesting.m
diff options
context:
space:
mode:
authorGravatar thomasvl@gmail.com <thomasvl@gmail.com@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2008-10-22 19:16:19 +0000
committerGravatar thomasvl@gmail.com <thomasvl@gmail.com@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2008-10-22 19:16:19 +0000
commit11938e47355bfbf3b81f1ff5b15f1222b83d4f47 (patch)
tree3794c78559472e4b2efe5eabc0e094d7c14a9743 /UnitTesting/GTMNSObject+BindingUnitTesting.m
parent90eba8f973c0b77f36dc7084163ff0d43675a1a8 (diff)
- GTM_INLINE will make sure a function gets inlined, and provides a consistent
way for all GTM code to do it. - Added GTMDebugThreadValidation to allow you to enforce the fact that your code must run in the main thread in DEBUG builds. - Updated some internals of the iPhone unittesting so it doesn't double print the test descriptions, file names, or lines numbers of a test failure line. Also includes the test names in the error output. - Changed the xcconfigs so that know it's easier to set different settings at the different levels and not accidentally overwrite settings set at lower levels in the "settings collapse". Also tightened up warnings significantly. - Changed how gtm_unitTestExposedBindingsTestValues works. If you have an implementation of gtm_unitTestExposedBindingsTestValues in your own code you will need to update to the new way of calling. See implementations in GTMNSObject+BindingUnitTesting.m for details. - Added support for grabbing the build number for a particular OS in GTMSystemVersion and easily comparing it to known build numbers, and switched some types from in GTMSystemVersion from "int" to SInt32 to make 64 bit work better. - Added support for SnowLeopard (10A96). We build cleanly with the 10.6 SDKs and all radar checks were updated accordingly. Build All script was also updated to build on SnowLeopard if you have the SDK available. - Turned off building ppc64 GTM because the SnowLeopard SDK currently doesn't have ppc64 support, so SenTestCase isn't defined. This makes it impossible to build the ppc64 10.5 config on SnowLeopard. We have left the setting in the xcconfig for those of you who need it, but have disabled it in the GTM project settings. - Turned on stack smashing protection on the debug builds for all Leopard and above. - Added ability to easily do leak checking by defining the GTM_ENABLE_LEAKS environment variable. It isn't on by default because several of Apple's frameworks leak. You can work around these false positives by using the GTM_LEAKS_SYMBOLS_TO_IGNORE environment variable. Also if you turn on leaks make sure to turn off zombies by defining the GTM_DISABLE_ZOMBIES variable, otherwise every memory allocation you do will look like a leak.
Diffstat (limited to 'UnitTesting/GTMNSObject+BindingUnitTesting.m')
-rw-r--r--UnitTesting/GTMNSObject+BindingUnitTesting.m347
1 files changed, 234 insertions, 113 deletions
diff --git a/UnitTesting/GTMNSObject+BindingUnitTesting.m b/UnitTesting/GTMNSObject+BindingUnitTesting.m
index 7773542..1ce1c88 100644
--- a/UnitTesting/GTMNSObject+BindingUnitTesting.m
+++ b/UnitTesting/GTMNSObject+BindingUnitTesting.m
@@ -20,6 +20,7 @@
#import "GTMDefines.h"
#import "GTMNSObject+BindingUnitTesting.h"
+#import "GTMSystemVersion.h"
BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
NSArray **errors) {
@@ -36,8 +37,10 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
if (![bindingsToIgnore containsObject:bindingKey]) {
Class theClass = [object valueClassForBinding:bindingKey];
if (!theClass) {
- [errorArray addObject:[NSString stringWithFormat:@"%@ should have valueClassForBinding '%@'",
- object, bindingKey]];
+ NSString *error
+ = [NSString stringWithFormat:@"%@ should have valueClassForBinding '%@'",
+ object, bindingKey];
+ [errorArray addObject:error];
continue;
}
@try {
@@ -45,32 +48,41 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
[object valueForKey:bindingKey];
}
@catch (NSException *e) {
- _GTMDevLog(@"%@ is not key value coding compliant for key %@", object, bindingKey);
+ _GTMDevLog(@"%@ is not key value coding compliant for key %@",
+ object, bindingKey);
continue;
} // COV_NF_LINE - compiler bug
- NSDictionary *testValues = [object gtm_unitTestExposedBindingsTestValues:bindingKey];
- NSEnumerator *testEnum = [testValues keyEnumerator];
- id testValue;
- while ((testValue = [testEnum nextObject])) {
- [object setValue:testValue forKey:bindingKey];
- id value = [object valueForKey:bindingKey];
- id desiredValue = [testValues objectForKey:testValue];
- if (![desiredValue gtm_unitTestIsEqualTo:value]) {
- [errorArray addObject:[NSString stringWithFormat:@"%@ unequal to %@ for binding '%@'",
- value, desiredValue, bindingKey]];
+ NSArray *testValues
+ = [object gtm_unitTestExposedBindingsTestValues:bindingKey];
+ NSEnumerator *testEnum = [testValues objectEnumerator];
+ GTMBindingUnitTestData *testData;
+ while ((testData = [testEnum nextObject])) {
+ id valueToSet = [testData valueToSet];
+ [object setValue:valueToSet forKey:bindingKey];
+ id valueReceived = [object valueForKey:bindingKey];
+ id desiredValue = [testData expectedValue];
+ if (![desiredValue gtm_unitTestIsEqualTo:valueReceived]) {
+ NSString *error
+ = [NSString stringWithFormat:@"%@ unequal to expected %@ for binding '%@'",
+ valueReceived, desiredValue, bindingKey];
+ [errorArray addObject:error];
continue;
}
}
}
@catch(NSException *e) {
- [errorArray addObject:[NSString stringWithFormat:@"%@:%@-> Binding %@",
- [e name], [e reason], bindingKey]];
+ NSString *error
+ = [NSString stringWithFormat:@"%@:%@-> Binding %@",
+ [e name], [e reason], bindingKey];
+ [errorArray addObject:error];
} // COV_NF_LINE - compiler bug
}
}
} else {
- [errorArray addObject:[NSString stringWithFormat:@"%@ does not have any exposed bindings",
- object]];
+ NSString *error =
+ [NSString stringWithFormat:@"%@ does not have any exposed bindings",
+ object];
+ [errorArray addObject:error];
}
if (errors) {
*errors = errorArray;
@@ -78,10 +90,51 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
return [errorArray count] == 0;
}
-// Utility for simplifying unitTestExposedBindingsTestValues implementations
-@interface NSMutableDictionary (GTMUnitTestingAdditions)
-// Sets an object and a key to the same value in a dictionary.
-- (void)gtm_setObjectAndKey:(id)objectAndKey;
+@implementation GTMBindingUnitTestData
++ (id)testWithIdentityValue:(id)value {
+ return [self testWithValue:value expecting:value];
+}
+
++ (id)testWithValue:(id)value expecting:(id)expecting {
+ return [[[self alloc] initWithValue:value expecting:expecting] autorelease];
+}
+
+- (id)initWithValue:(id)value expecting:(id)expecting {
+ if ((self = [super init])) {
+ valueToSet_ = [value retain];
+ expectedValue_ = [expecting retain];
+ }
+ return self;
+}
+
+- (BOOL)isEqual:(id)object {
+ BOOL isEqual = [object isMemberOfClass:[self class]];
+ if (isEqual) {
+ id objValue = [object valueToSet];
+ id objExpect = [object expectedValue];
+ isEqual = (((valueToSet_ == objValue) || ([valueToSet_ isEqual:objValue]))
+ && ((expectedValue_ == objExpect) || ([expectedValue_ isEqual:objExpect])));
+ }
+ return isEqual;
+}
+
+- (NSUInteger)hash {
+ return [valueToSet_ hash] + [expectedValue_ hash];
+}
+
+- (void)dealloc {
+ [valueToSet_ release];
+ [expectedValue_ release];
+ [super dealloc];
+}
+
+- (id)valueToSet {
+ return valueToSet_;
+}
+
+- (id)expectedValue {
+ return expectedValue_;
+}
@end
@implementation NSObject (GTMBindingUnitTestingAdditions)
@@ -98,14 +151,14 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
return array;
}
-- (NSMutableDictionary*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding {
+- (NSMutableArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding {
- NSMutableDictionary *dict = [NSMutableDictionary dictionary];
+ NSMutableArray *array = [NSMutableArray array];
id value = [self valueForKey:binding];
// Always test identity if possible
if (value) {
- [dict gtm_setObjectAndKey:value];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
}
// Now some default test values for a variety of bindings to make
@@ -114,21 +167,30 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
// If anybody can think of more to add, please go nuts.
if ([binding isEqualToString:NSAlignmentBinding]) {
- [dict gtm_setObjectAndKey:[NSNumber numberWithInt:NSLeftTextAlignment]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithInt:NSRightTextAlignment]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithInt:NSCenterTextAlignment]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithInt:NSJustifiedTextAlignment]];
- NSNumber *natural = [NSNumber numberWithInt:NSNaturalTextAlignment];
- [dict gtm_setObjectAndKey:natural];
- [dict setObject:natural forKey:[NSNumber numberWithInt:500]];
- [dict setObject:natural forKey:[NSNumber numberWithInt:-1]];
+ value = [NSNumber numberWithInt:NSLeftTextAlignment];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithInt:NSRightTextAlignment];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithInt:NSCenterTextAlignment];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithInt:NSJustifiedTextAlignment];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithInt:NSNaturalTextAlignment];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ NSNumber *valueToSet = [NSNumber numberWithInt:500];
+ [array addObject:[GTMBindingUnitTestData testWithValue:valueToSet
+ expecting:value]];
+ valueToSet = [NSNumber numberWithInt:-1];
+ [array addObject:[GTMBindingUnitTestData testWithValue:valueToSet
+ expecting:value]];
} else if ([binding isEqualToString:NSAlternateImageBinding] ||
[binding isEqualToString:NSImageBinding] ||
[binding isEqualToString:NSMixedStateImageBinding] ||
[binding isEqualToString:NSOffStateImageBinding] ||
[binding isEqualToString:NSOnStateImageBinding]) {
// This handles all image bindings
- [dict gtm_setObjectAndKey:[NSImage imageNamed:@"NSApplicationIcon"]];
+ value = [NSImage imageNamed:@"NSApplicationIcon"];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else if ([binding isEqualToString:NSAnimateBinding] ||
[binding isEqualToString:NSDocumentEditedBinding] ||
[binding isEqualToString:NSEditableBinding] ||
@@ -139,57 +201,88 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
// NSTranparentBinding 10.5 only
[binding isEqualToString:@"transparent"]) {
// This handles all bool value bindings
- [dict gtm_setObjectAndKey:[NSNumber numberWithBool:YES]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithBool:NO]];
+ value = [NSNumber numberWithBool:YES];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithBool:NO];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else if ([binding isEqualToString:NSAlternateTitleBinding] ||
[binding isEqualToString:NSHeaderTitleBinding] ||
[binding isEqualToString:NSLabelBinding] ||
[binding isEqualToString:NSTitleBinding] ||
[binding isEqualToString:NSToolTipBinding]) {
// This handles all string value bindings
- [dict gtm_setObjectAndKey:@"happy"];
- [dict gtm_setObjectAndKey:@""];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"happy"]];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@""]];
// Test some non-ascii roman text
char a_not_alpha[] = { 'A', 0xE2, 0x89, 0xA2, 0xCE, 0x91, '.', 0x00 };
- [dict gtm_setObjectAndKey:[NSString stringWithUTF8String:a_not_alpha]];
+ value = [NSString stringWithUTF8String:a_not_alpha];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
// Test some korean
char hangugo[] = { 0xED, 0x95, 0x9C, 0xEA, 0xB5,
- 0xAD, 0xEC, 0x96, 0xB4, 0x00 };
- [dict gtm_setObjectAndKey:[NSString stringWithUTF8String:hangugo]];
+ 0xAD, 0xEC, 0x96, 0xB4, 0x00 };
+ value = [NSString stringWithUTF8String:hangugo];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
// Test some japanese
char nihongo[] = { 0xE6, 0x97, 0xA5, 0xE6, 0x9C,
0xAC, 0xE8, 0xAA, 0x9E, 0x00 };
- [dict gtm_setObjectAndKey:[NSString stringWithUTF8String:nihongo]];
+ value = [NSString stringWithUTF8String:nihongo];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
// Test some arabic
char arabic[] = { 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xa7, 0x00 };
- [dict gtm_setObjectAndKey:[NSString stringWithUTF8String:arabic]];
+ value = [NSString stringWithUTF8String:arabic];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else if ([binding isEqualToString:NSRepresentedFilenameBinding]) {
// This handles all path bindings
- [dict gtm_setObjectAndKey:@"/happy"];
- [dict gtm_setObjectAndKey:@"/"];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"/happy"]];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"/"]];
// Test some non-ascii roman text
char a_not_alpha[] = { '/', 'A', 0xE2, 0x89, 0xA2, 0xCE, 0x91, '.', 0x00 };
- [dict gtm_setObjectAndKey:[NSString stringWithUTF8String:a_not_alpha]];
+ value = [NSString stringWithUTF8String:a_not_alpha];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
// Test some korean
char hangugo[] = { '/', 0xED, 0x95, 0x9C, 0xEA, 0xB5,
- 0xAD, 0xEC, 0x96, 0xB4, 0x00 };
- [dict gtm_setObjectAndKey:[NSString stringWithUTF8String:hangugo]];
+ 0xAD, 0xEC, 0x96, 0xB4, 0x00 };
+ value = [NSString stringWithUTF8String:hangugo];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
// Test some japanese
char nihongo[] = { '/', 0xE6, 0x97, 0xA5, 0xE6, 0x9C,
- 0xAC, 0xE8, 0xAA, 0x9E, 0x00 };
- [dict gtm_setObjectAndKey:[NSString stringWithUTF8String:nihongo]];
+ 0xAC, 0xE8, 0xAA, 0x9E, 0x00 };
+ value = [NSString stringWithUTF8String:nihongo];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
// Test some arabic
char arabic[] = { '/', 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xa7, 0x00 };
- [dict gtm_setObjectAndKey:[NSString stringWithUTF8String:arabic]];
- } else if ([binding isEqualToString:NSMaximumRecentsBinding] ||
- [binding isEqualToString:NSRowHeightBinding]) {
- // This handles all int value bindings
- [dict gtm_setObjectAndKey:[NSNumber numberWithInt:0]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithInt:-1]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithInt:INT16_MAX]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithInt:INT16_MIN]];
+ value = [NSString stringWithUTF8String:arabic];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ } else if ([binding isEqualToString:NSMaximumRecentsBinding]) {
+ value = [NSNumber numberWithInt:0];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithInt:-1];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithInt:INT16_MAX];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithInt:INT16_MIN];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ } else if ([binding isEqualToString:NSRowHeightBinding]) {
+ NSNumber *valueOne = [NSNumber numberWithInt:1];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:valueOne]];
+ value = [NSNumber numberWithInt:0];
+ id value2 = [NSNumber numberWithInt:INT16_MIN];
+ // Row height no longer accepts <= 0 values on SnowLeopard
+ // which is a good thing.
+ if ([GTMSystemVersion isSnowLeopardOrGreater]) {
+ [array addObject:[GTMBindingUnitTestData testWithValue:value
+ expecting:valueOne]];
+
+ [array addObject:[GTMBindingUnitTestData testWithValue:value2
+ expecting:valueOne]];
+ } else {
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value2]];
+ }
+ value = [NSNumber numberWithInt:INT16_MAX];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else if ([binding isEqualToString:NSMaxValueBinding] ||
[binding isEqualToString:NSMaxWidthBinding] ||
[binding isEqualToString:NSMinValueBinding] ||
@@ -198,39 +291,57 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
[binding isEqualToString:NSContentHeightBinding] ||
[binding isEqualToString:NSWidthBinding] ||
[binding isEqualToString:NSAnimationDelayBinding]) {
+ // NSAnimationDelay is deprecated on SnowLeopard. We continue to test it
+ // to make sure it doesn't get broken.
+
// This handles all float value bindings
- [dict gtm_setObjectAndKey:[NSNumber numberWithFloat:0]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithFloat:FLT_MAX]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithFloat:-FLT_MAX]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithFloat:FLT_MIN]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithFloat:-FLT_MIN]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithFloat:FLT_EPSILON]];
- [dict gtm_setObjectAndKey:[NSNumber numberWithFloat:-FLT_EPSILON]];
+ value = [NSNumber numberWithFloat:0];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithFloat:FLT_MAX];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithFloat:-FLT_MAX];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithFloat:FLT_MIN];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithFloat:-FLT_MIN];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithFloat:FLT_EPSILON];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSNumber numberWithFloat:-FLT_EPSILON];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else if ([binding isEqualToString:NSTextColorBinding]) {
// This handles all color value bindings
- [dict gtm_setObjectAndKey:[NSColor colorWithCalibratedWhite:1.0 alpha:1.0]];
- [dict gtm_setObjectAndKey:[NSColor colorWithCalibratedWhite:1.0 alpha:0.0]];
- [dict gtm_setObjectAndKey:[NSColor colorWithCalibratedWhite:1.0 alpha:0.5]];
- [dict gtm_setObjectAndKey:[NSColor colorWithCalibratedRed:0.5 green:0.5
- blue:0.5 alpha:0.5]];
- [dict gtm_setObjectAndKey:[NSColor colorWithDeviceCyan:0.25 magenta:0.25
- yellow:0.25 black:0.25
- alpha:0.25]];
+ value = [NSColor colorWithCalibratedWhite:1.0 alpha:1.0];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSColor colorWithCalibratedWhite:1.0 alpha:0.0];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSColor colorWithCalibratedWhite:1.0 alpha:0.5];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSColor colorWithCalibratedRed:0.5 green:0.5 blue:0.5 alpha:0.5];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSColor colorWithDeviceCyan:0.25 magenta:0.25 yellow:0.25
+ black:0.25 alpha:0.25];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else if ([binding isEqualToString:NSFontBinding]) {
// This handles all font value bindings
- [dict gtm_setObjectAndKey:[NSFont boldSystemFontOfSize:[NSFont systemFontSize]]];
- [dict gtm_setObjectAndKey:[NSFont toolTipsFontOfSize:[NSFont smallSystemFontSize]]];
- [dict gtm_setObjectAndKey:[NSFont labelFontOfSize:144.0]];
+ value = [NSFont boldSystemFontOfSize:[NSFont systemFontSize]];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSFont toolTipsFontOfSize:[NSFont smallSystemFontSize]];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
+ value = [NSFont labelFontOfSize:144.0];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else if ([binding isEqualToString:NSRecentSearchesBinding] ||
[binding isEqualToString:NSSortDescriptorsBinding]) {
// This handles all array value bindings
- [dict gtm_setObjectAndKey:[NSArray array]];
+ value = [NSArray array];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else if ([binding isEqualToString:NSTargetBinding]) {
- [dict gtm_setObjectAndKey:[NSNull null]];
+ value = [NSNull null];
+ [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]];
} else {
_GTMDevLog(@"Skipped Binding: %@ for %@", binding, self); // COV_NF_LINE
}
- return dict;
+ return array;
}
- (BOOL)gtm_unitTestIsEqualTo:(id)value {
@@ -239,13 +350,6 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
@end
-@implementation NSMutableDictionary (GTMUnitTestingAdditions)
-// Sets an object and a key to the same value in a dictionary.
-- (void)gtm_setObjectAndKey:(id)objectAndKey {
- [self setObject:objectAndKey forKey:objectAndKey];
-}
-@end
-
#pragma mark -
#pragma mark All the special AppKit Bindings issues below
@@ -267,10 +371,17 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
@implementation NSScroller (GTMBindingUnitTestingAdditions)
- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore {
NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore];
- // rdar://5849154 - NSScroller exposes binding with no value class for NSValueBinding
- [array addObject:NSValueBinding];
- // rdar://5849236 - NSScroller exposes binding for NSFontBinding
- [array addObject:NSFontBinding];
+ SInt32 major, minor, bugFix;
+ [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix];
+ if (major <= 10 && minor <= 5 && bugFix <= 5) {
+ // rdar://5849154 - NSScroller exposes binding with no value class for NSValueBinding
+ [array addObject:NSValueBinding];
+ }
+ if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) {
+ // Broken on SnowLeopard WWDC and below
+ // rdar://5849236 - NSScroller exposes binding for NSFontBinding
+ [array addObject:NSFontBinding];
+ }
return array;
}
@end
@@ -289,13 +400,22 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
return array;
}
-- (NSMutableDictionary*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding {
- NSMutableDictionary *dict = [super gtm_unitTestExposedBindingsTestValues:binding];
+- (NSMutableArray *)gtm_unitTestExposedBindingsTestValues:(NSString*)binding {
+ NSMutableArray *array = [super gtm_unitTestExposedBindingsTestValues:binding];
if ([binding isEqualToString:NSAlignmentBinding]) {
- // rdar://5851487 - If NSAlignmentBinding for a NSTextField is set to -1 and then got it returns 7
- [dict setObject:[NSNumber numberWithInt:7] forKey:[NSNumber numberWithInt:-1]];
+ if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) {
+ // rdar://5851487 - If NSAlignmentBinding for a NSTextField is set to -1 and then got it returns 7
+ GTMBindingUnitTestData *dataToRemove =
+ [GTMBindingUnitTestData testWithValue:[NSNumber numberWithInt:-1]
+ expecting:[NSNumber numberWithInt:NSNaturalTextAlignment]];
+ [array removeObject:dataToRemove];
+ GTMBindingUnitTestData *dataToAdd =
+ [GTMBindingUnitTestData testWithValue:[NSNumber numberWithInt:-1]
+ expecting:[NSNumber numberWithInt:7]];
+ [array addObject:dataToAdd];
+ }
}
- return dict;
+ return array;
}
@end
@@ -304,21 +424,15 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
@implementation NSSearchField (GTMBindingUnitTestingAdditions)
-- (NSMutableDictionary*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding {
- NSMutableDictionary *dict = [super gtm_unitTestExposedBindingsTestValues:binding];
-#if !__LP64__
- if ([binding isEqualToString:NSAlignmentBinding]) {
- // rdar://5851491 - Setting NSAlignmentBinding of search field to NSCenterTextAlignment broken
- // This appears to not be a bug in 64 bit. Strange.
- [dict setObject:[NSNumber numberWithInt:NSNaturalTextAlignment]
- forKey:[NSNumber numberWithInt:NSCenterTextAlignment]];
- }
-#endif
- return dict;
-}
-
- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore {
NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore];
+ SInt32 major, minor, bugFix;
+ [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix];
+ if (major <= 10 && minor <= 5 && bugFix <= 5) {
+ // rdar://5851491 - Setting NSAlignmentBinding of search field to NSCenterTextAlignment broken
+ // Broken on 10.5.5 and below.
+ [array addObject:NSAlignmentBinding];
+ }
// Not KVC Compliant
[array addObject:NSPredicateBinding];
return array;
@@ -367,8 +481,11 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore {
NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore];
- // rdar://5849684 - NSTableView should throw exception when attempting to set NSFontBinding
- [array addObject:NSFontBinding];
+ if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) {
+ // rdar://6288332 - NSTableView does not respond to NSFontBinding
+ // Broken on 10.5, and SnowLeopard WWDC
+ [array addObject:NSFontBinding];
+ }
// Not KVC Compliant
[array addObject:NSContentBinding];
[array addObject:NSDoubleClickTargetBinding];
@@ -386,8 +503,10 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore {
NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore];
- //rdar://5849335 - NSTextView only partially KVC compliant for key NSAttributedStringBinding
- [array addObject:NSAttributedStringBinding];
+ if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) {
+ //rdar://5849335 - NSTextView only partially KVC compliant for key NSAttributedStringBinding
+ [array addObject:NSAttributedStringBinding];
+ }
// Not KVC Compliant
[array addObject:NSDataBinding];
[array addObject:NSValueURLBinding];
@@ -404,8 +523,10 @@ BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object,
- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore {
NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore];
- // rdar://5849248 - NSTabView exposes binding with no value class for NSSelectedIdentifierBinding
- [array addObject:NSSelectedIdentifierBinding];
+ if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) {
+ // rdar://5849248 - NSTabView exposes binding with no value class for NSSelectedIdentifierBinding
+ [array addObject:NSSelectedIdentifierBinding];
+ }
// Not KVC Compliant
[array addObject:NSSelectedIndexBinding];
[array addObject:NSSelectedLabelBinding];