diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j index ffc056c7f..f0908805d 100755 --- a/Foundation/CPArray.j +++ b/Foundation/CPArray.j @@ -814,10 +814,7 @@ CPEnumerationReverse = 1 << 1; */ - (CPArray)arrayByAddingObject:(id)anObject { - var array = [self copy]; - array.push(anObject); - - return array; + return self.concat(anObject); } /*! @@ -826,7 +823,7 @@ CPEnumerationReverse = 1 << 1; */ - (CPArray)arrayByAddingObjectsFromArray:(CPArray)anArray { - return slice(0).concat(anArray); + return self.concat(anArray); } /* diff --git a/Foundation/CPKeyValueCoding.j b/Foundation/CPKeyValueCoding.j index 1dfca2f54..b6012e75b 100644 --- a/Foundation/CPKeyValueCoding.j +++ b/Foundation/CPKeyValueCoding.j @@ -356,6 +356,12 @@ var CPObjectAccessorsForClassKey = @"$CPObjectAccessorsForClassKey", SEL _memberOfSelector; } +// This allows things like setByAddingObject: to work (since they use [[self class] alloc] internally). +- (id)initWithObjects:(CPArray)objects count:(CPUInteger)aCount +{ + return [[CPSet alloc] initWithObjects:objects count:aCount]; +} + - (id)initWithTarget:(id)aTarget key:(CPString)aKey { self = [super initWithObjects:nil count:0]; @@ -368,7 +374,7 @@ var CPObjectAccessorsForClassKey = @"$CPObjectAccessorsForClassKey", _countOfSelector = CPSelectorFromString("countOf" + capitalizedKey); _enumeratorOfSelector = CPSelectorFromString("enumeratorOf" + capitalizedKey); - _memberOfSelector = CPSelectorFromString("memberOf" + capitalizedKey); + _memberOfSelector = CPSelectorFromString("memberOf" + capitalizedKey + ":"); } return self; diff --git a/Foundation/CPSet.j b/Foundation/CPSet.j index 9563291f1..d6aef74ae 100644 --- a/Foundation/CPSet.j +++ b/Foundation/CPSet.j @@ -102,6 +102,21 @@ return [[self alloc] initWithSet:set]; } +- (id)setByAddingObject:(id)anObject +{ + return [[self class] setWithArray:[[self allObjects] arrayByAddingObject:anObject]]; +} + +- (id)setByAddingObjectsFromSet:(CPSet)aSet +{ + return [self setByAddingObjectsFromArray:[aSet allObjects]]; +} + +- (id)setByAddingObjectsFromArray:(CPArray)anArray +{ + return [[self class] setWithArray:[[self allObjects] arrayByAddingObjectsFromArray:anArray]]; +} + /* Basic initializer, returns an empty set */ diff --git a/Tests/Foundation/CPKeyValueCodingTest.j b/Tests/Foundation/CPKeyValueCodingTest.j index 909ea8021..7719d13c2 100644 --- a/Tests/Foundation/CPKeyValueCodingTest.j +++ b/Tests/Foundation/CPKeyValueCodingTest.j @@ -612,3 +612,76 @@ var accessIVARS = YES; } @end + + +@implementation UnorderedAccessorClass : CPObject +{ +} + +- (id)memberOfObjects:(id)anObject +{ + if ([[0, 1, 3, 5, 7] indexOfObjectIdenticalTo:anObject] !== CPNotFound) + return anObject; + + return nil; +} + +- (CPEnumerator)enumeratorOfObjects +{ + return [[0, 1, 3, 5, 7] objectEnumerator]; +} + +- (CPUInteger)countOfObjects +{ + return 5; +} + +@end + +@implementation CPKeyValueCodingTest (UnorderedAccessorPattern) + +- (void)testUnorderedAccessorPattern +{ + var object = [UnorderedAccessorClass new], + set = [object valueForKey:@"objects"]; + + [self assert:set equals:[CPSet setWithObjects:0, 1, 3, 5, 7]]; + + [self assertTrue:[set containsObject:0]]; + [self assertTrue:[set containsObject:1]]; + [self assertTrue:[set containsObject:3]]; + [self assertTrue:[set containsObject:5]]; + [self assertTrue:[set containsObject:7]]; + + [self assertFalse:[set containsObject:2]]; + [self assertFalse:[set containsObject:4]]; + [self assertFalse:[set containsObject:6]]; + [self assertFalse:[set containsObject:8]]; + [self assertFalse:[set containsObject:10]]; + + [self assert:[set setByAddingObjectsFromArray:[2, 3, 4, 5, 6]] + equals:[CPSet setWithObjects:0, 1, 2, 3, 4, 5, 6, 7]]; +} + +- (void)testObjectsAtIndexes_ +{ + var object = [ObjectsAtIndexesClass new], + array = [object valueForKey:@"objects"]; + + [self assert:5 equals:[array count]]; + + [self assert:@"one" equals:[array objectAtIndex:0]]; + [self assert:@"two" equals:[array objectAtIndex:1]]; + [self assert:@"three" equals:[array objectAtIndex:2]]; + [self assert:@"four" equals:[array objectAtIndex:3]]; + [self assert:@"five" equals:[array objectAtIndex:4]]; + + var indexes = [CPIndexSet indexSet]; + + [indexes addIndex:1]; + [indexes addIndex:3]; + + [self assert:[@"two", @"four"] equals:[array objectsAtIndexes:indexes]]; +} + +@end