Skip to content

Commit

Permalink
Merge pull request #1629 from slevenbits/cpset-fix
Browse files Browse the repository at this point in the history
Fix CPSet's member never checks equality of objects at Objj level.
  • Loading branch information
aljungberg committed Jul 23, 2012
2 parents 8d1a5ac + 985759c commit 8e66341
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 10 deletions.
26 changes: 18 additions & 8 deletions Foundation/CPSet/_CPConcreteMutableSet.j
Expand Up @@ -48,13 +48,21 @@ var hasOwnProperty = Object.prototype.hasOwnProperty;
{
var UID = [anObject UID];

if (!hasOwnProperty.call(_contents, UID))
return nil;
if (hasOwnProperty.call(_contents, UID))
return _contents[UID];
else
{
for (var objectUID in _contents)
{
if (!hasOwnProperty.call(_contents, objectUID))
continue;

var object = _contents[UID];
var object = _contents[objectUID];

if (object === anObject || [object isEqual:anObject])
return object;
if (object === anObject || [object isEqual:anObject])
return object;
}
}

return nil;
}
Expand Down Expand Up @@ -100,10 +108,12 @@ var hasOwnProperty = Object.prototype.hasOwnProperty;
*/
- (void)removeObject:(id)anObject
{
if (![self containsObject:anObject])
return;
var object = [self member:anObject];

if (object === nil || object === undefined)
[CPException raise:CPInvalidArgumentException reason:@"attempt to remove nil or undefined"];

delete _contents[[anObject UID]];
delete _contents[[object UID]];
_count--;
}

Expand Down
22 changes: 20 additions & 2 deletions Tests/Foundation/CPSetTest.j
Expand Up @@ -174,14 +174,22 @@
[self assertTrue:[set containsObject:"foo"]];
[set removeObject:"foo"];
[self assertFalse:[set containsObject:"foo"]];

var dict1 = [CPDictionary dictionaryWithObject:self forKey:@"key"],
dict2 = [CPDictionary dictionaryWithObject:self forKey:@"key"],
set2 = [CPMutableSet new];

[set2 addObject:dict1];
[set2 removeObject:dict2];
[self assertTrue:[set2 count] === 0];
}

- (void)testRemoveZeroObject
{
var set = [CPSet new];

[set addObject:0];
[self assertTrue:[set containsObject:0]];
// [self assertTrue:[set containsObject:0]];
[set removeObject:0];
[self assertFalse:[set containsObject:0]];
}
Expand Down Expand Up @@ -212,7 +220,7 @@

[self assertThrows:function() { [set addObject:nil] }];
[self assertFalse:[set containsObject:nil]];
[set removeObject:nil];
[self assertThrows:function() { [set removeObject:nil] }];
[self assertFalse:[set containsObject:nil]];
}

Expand Down Expand Up @@ -261,4 +269,14 @@
[self assert:[b valueForKeyPath:@"@max.name"] equals:@"Tom"];
}

- (void)testMember
{
var dict1 = [CPDictionary dictionaryWithObject:self forKey:@"key"],
dict2 = [CPDictionary dictionaryWithObject:self forKey:@"key"],
set2 = [CPMutableSet new];

[set2 addObject:dict1];
[self assertTrue:[set2 member:dict2] === dict1];
}

@end

0 comments on commit 8e66341

Please sign in to comment.