| // | |
| // RACSequenceAdditionsSpec.m | |
| // ReactiveCocoa | |
| // | |
| // Created by Justin Spahr-Summers on 2012-11-01. | |
| // Copyright (c) 2012 GitHub, Inc. All rights reserved. | |
| // | |
| #import "RACSequenceExamples.h" | |
| #import "NSArray+RACSequenceAdditions.h" | |
| #import "NSDictionary+RACSequenceAdditions.h" | |
| #import "NSOrderedSet+RACSequenceAdditions.h" | |
| #import "NSSet+RACSequenceAdditions.h" | |
| #import "NSString+RACSequenceAdditions.h" | |
| #import "NSIndexSet+RACSequenceAdditions.h" | |
| #import "RACSequence.h" | |
| #import "RACTuple.h" | |
| SpecBegin(RACSequenceAdditions) | |
| __block NSArray *numbers; | |
| beforeEach(^{ | |
| NSMutableArray *mutableNumbers = [NSMutableArray array]; | |
| for (NSUInteger i = 0; i < 100; i++) { | |
| [mutableNumbers addObject:@(i)]; | |
| } | |
| numbers = [mutableNumbers copy]; | |
| }); | |
| describe(@"NSArray sequences", ^{ | |
| __block NSMutableArray *values; | |
| __block RACSequence *sequence; | |
| beforeEach(^{ | |
| values = [numbers mutableCopy]; | |
| sequence = values.rac_sequence; | |
| expect(sequence).notTo.beNil(); | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: values | |
| }; | |
| }); | |
| describe(@"should be immutable", ^{ | |
| __block NSArray *unchangedValues; | |
| beforeEach(^{ | |
| unchangedValues = [values copy]; | |
| [values addObject:@6]; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: unchangedValues | |
| }; | |
| }); | |
| }); | |
| it(@"should fast enumerate after zipping", ^{ | |
| // This certain list of values causes issues, for some reason. | |
| NSArray *values = @[ @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0 ]; | |
| RACSequence *zippedSequence = [RACSequence zip:@[ values.rac_sequence, values.rac_sequence ] reduce:^(id obj1, id obj2) { | |
| return obj1; | |
| }]; | |
| NSMutableArray *collectedValues = [NSMutableArray array]; | |
| for (id value in zippedSequence) { | |
| [collectedValues addObject:value]; | |
| } | |
| expect(collectedValues).to.equal(values); | |
| }); | |
| }); | |
| describe(@"NSDictionary sequences", ^{ | |
| __block NSMutableDictionary *dict; | |
| __block NSMutableArray *tuples; | |
| __block RACSequence *tupleSequence; | |
| __block NSArray *keys; | |
| __block RACSequence *keySequence; | |
| __block NSArray *values; | |
| __block RACSequence *valueSequence; | |
| beforeEach(^{ | |
| dict = [@{ | |
| @"foo": @"bar", | |
| @"baz": @"buzz", | |
| @5: NSNull.null | |
| } mutableCopy]; | |
| tuples = [NSMutableArray array]; | |
| for (id key in dict) { | |
| RACTuple *tuple = [RACTuple tupleWithObjects:key, dict[key], nil]; | |
| [tuples addObject:tuple]; | |
| } | |
| tupleSequence = dict.rac_sequence; | |
| expect(tupleSequence).notTo.beNil(); | |
| keys = [dict.allKeys copy]; | |
| keySequence = dict.rac_keySequence; | |
| expect(keySequence).notTo.beNil(); | |
| values = [dict.allValues copy]; | |
| valueSequence = dict.rac_valueSequence; | |
| expect(valueSequence).notTo.beNil(); | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: tupleSequence, | |
| RACSequenceExampleExpectedValues: tuples | |
| }; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: keySequence, | |
| RACSequenceExampleExpectedValues: keys | |
| }; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: valueSequence, | |
| RACSequenceExampleExpectedValues: values | |
| }; | |
| }); | |
| describe(@"should be immutable", ^{ | |
| beforeEach(^{ | |
| dict[@"foo"] = @"rab"; | |
| dict[@6] = @7; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: tupleSequence, | |
| RACSequenceExampleExpectedValues: tuples | |
| }; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: keySequence, | |
| RACSequenceExampleExpectedValues: keys | |
| }; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: valueSequence, | |
| RACSequenceExampleExpectedValues: values | |
| }; | |
| }); | |
| }); | |
| }); | |
| describe(@"NSOrderedSet sequences", ^{ | |
| __block NSMutableOrderedSet *values; | |
| __block RACSequence *sequence; | |
| beforeEach(^{ | |
| values = [NSMutableOrderedSet orderedSetWithArray:numbers]; | |
| sequence = values.rac_sequence; | |
| expect(sequence).notTo.beNil(); | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: values.array | |
| }; | |
| }); | |
| describe(@"should be immutable", ^{ | |
| __block NSArray *unchangedValues; | |
| beforeEach(^{ | |
| unchangedValues = [values.array copy]; | |
| [values addObject:@6]; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: unchangedValues | |
| }; | |
| }); | |
| }); | |
| }); | |
| describe(@"NSSet sequences", ^{ | |
| __block NSMutableSet *values; | |
| __block RACSequence *sequence; | |
| beforeEach(^{ | |
| values = [NSMutableSet setWithArray:numbers]; | |
| sequence = values.rac_sequence; | |
| expect(sequence).notTo.beNil(); | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: values.allObjects | |
| }; | |
| }); | |
| describe(@"should be immutable", ^{ | |
| __block NSArray *unchangedValues; | |
| beforeEach(^{ | |
| unchangedValues = [values.allObjects copy]; | |
| [values addObject:@6]; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: unchangedValues | |
| }; | |
| }); | |
| }); | |
| }); | |
| describe(@"NSString sequences", ^{ | |
| __block NSMutableString *string; | |
| __block NSArray *values; | |
| __block RACSequence *sequence; | |
| beforeEach(^{ | |
| string = [@"foobar" mutableCopy]; | |
| values = @[ @"f", @"o", @"o", @"b", @"a", @"r" ]; | |
| sequence = string.rac_sequence; | |
| expect(sequence).notTo.beNil(); | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: values | |
| }; | |
| }); | |
| describe(@"should be immutable", ^{ | |
| beforeEach(^{ | |
| [string appendString:@"buzz"]; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: values | |
| }; | |
| }); | |
| }); | |
| it(@"should work with composed characters", ^{ | |
| NSString *string = @"\u2665\uFE0F\u2666\uFE0F"; | |
| NSArray *expectedSequence = @[ @"\u2665\uFE0F", @"\u2666\uFE0F" ]; | |
| expect(string.rac_sequence.array).to.equal(expectedSequence); | |
| }); | |
| }); | |
| describe(@"RACTuple sequences", ^{ | |
| __block RACTuple *tuple; | |
| __block RACSequence *sequence; | |
| beforeEach(^{ | |
| tuple = RACTuplePack(@"foo", nil, @"bar", NSNull.null, RACTupleNil.tupleNil); | |
| sequence = tuple.rac_sequence; | |
| expect(sequence).notTo.beNil(); | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: @[ @"foo", NSNull.null, @"bar", NSNull.null, NSNull.null ] | |
| }; | |
| }); | |
| }); | |
| describe(@"NSIndexSet sequences", ^{ | |
| __block NSMutableIndexSet *values; | |
| __block RACSequence *sequence; | |
| NSArray * (^valuesFromIndexSet)(NSIndexSet *indexSet) = ^NSArray *(NSIndexSet *indexSet) { | |
| NSMutableArray *arr = [NSMutableArray array]; | |
| [values enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { | |
| [arr addObject:@(idx)]; | |
| }]; | |
| return [arr copy]; | |
| }; | |
| beforeEach(^{ | |
| values = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 10)]; | |
| sequence = values.rac_sequence; | |
| expect(sequence).notTo.beNil(); | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: valuesFromIndexSet(values) | |
| }; | |
| }); | |
| describe(@"should be immutable", ^{ | |
| __block NSArray *unchangedValues; | |
| beforeEach(^{ | |
| unchangedValues = valuesFromIndexSet(values); | |
| [values addIndex:20]; | |
| }); | |
| itShouldBehaveLike(RACSequenceExamples, ^{ | |
| return @{ | |
| RACSequenceExampleSequence: sequence, | |
| RACSequenceExampleExpectedValues: unchangedValues | |
| }; | |
| }); | |
| }); | |
| }); | |
| SpecEnd |