diff --git a/Tests/base/NSFastEnumeration/TestInfo b/Tests/base/NSFastEnumeration/TestInfo new file mode 100644 index 000000000..e69de29bb diff --git a/Tests/base/NSFastEnumeration/basic.m b/Tests/base/NSFastEnumeration/basic.m new file mode 100644 index 000000000..13607769c --- /dev/null +++ b/Tests/base/NSFastEnumeration/basic.m @@ -0,0 +1,95 @@ +#import +#import +#import +#import +#import +#import "ObjectTesting.h" +#import "../../../Source/GSFastEnumeration.h" + +void fast_enumeration_mutation_add(id mutableCollection) +{ + NSUInteger i = 0; + FOR_IN(id, o, mutableCollection) + if (i == [mutableCollection count]/2) { + if ([mutableCollection isKindOfClass:[NSMutableDictionary class]]) { + [mutableCollection setObject:@"boom" forKey:@"boom"]; + } else { + [mutableCollection addObject:@"boom"]; + } + } + i++; + END_FOR_IN(mutableCollection) +} + +void fast_enumeration_mutation_remove(id mutableCollection) +{ + NSUInteger i = 0; + FOR_IN(id, o, mutableCollection) + if (i == [mutableCollection count]/2) { + if ([mutableCollection isKindOfClass:[NSMutableDictionary class]]) { + [mutableCollection removeObjectForKey:o]; + } else { + [mutableCollection removeObject:o]; + } + } + i++; + END_FOR_IN(mutableCollection) +} + +void test_fast_enumeration(id collection, NSArray *objects) +{ + NSMutableArray *returnedObjects = [[NSMutableArray alloc] init]; + FOR_IN(id, o, collection) + [returnedObjects addObject:o]; + END_FOR_IN(collection) + if (!([collection isKindOfClass:[NSArray class]] || + [collection isKindOfClass:[NSOrderedSet class]])) { + [returnedObjects sortUsingSelector:@selector(compare:)]; + } + PASS_EQUAL(returnedObjects, objects, "fast enumeration returns all objects"); + + id mutableCollection = [collection mutableCopy]; + PASS_EXCEPTION( + fast_enumeration_mutation_add(mutableCollection), + NSGenericException, + "Fast enumeration mutation add properly calls @\"NSGenericException\""); + PASS_EXCEPTION( + fast_enumeration_mutation_remove(mutableCollection), + NSGenericException, + "Fast enumeration mutation remove properly calls @\"NSGenericException\""); + [mutableCollection release]; +} + +int main() +{ + NSAutoreleasePool *arp = [NSAutoreleasePool new]; + + NSMutableArray *objects = [NSMutableArray array]; + int i; + for (i = 0; i < 10000; i++) { + [objects addObject:[NSString stringWithFormat:@"%.4d", i]]; + } + + START_SET("NSArray") + id array = [NSArray arrayWithArray:objects]; + test_fast_enumeration(array, objects); + END_SET("NSArray") + + START_SET("NSSet") + id set = [NSSet setWithArray:objects]; + test_fast_enumeration(set, objects); + END_SET("NSSet") + + START_SET("NSOrderedSet") + id orderedSet = [NSOrderedSet orderedSetWithArray:objects]; + test_fast_enumeration(orderedSet, objects); + END_SET("NSOrderedSet") + + START_SET("NSDictionary") + id dict = [NSDictionary dictionaryWithObjects:objects forKeys:objects]; + test_fast_enumeration(dict, objects); + END_SET("NSDictionary") + + [arp release]; arp = nil; + return 0; +}