| // | |
| // RACSequenceExamples.m | |
| // ReactiveCocoa | |
| // | |
| // Created by Justin Spahr-Summers on 2012-11-01. | |
| // Copyright (c) 2012 GitHub, Inc. All rights reserved. | |
| // | |
| #import "RACSequenceExamples.h" | |
| #import "RACScheduler.h" | |
| #import "RACSequence.h" | |
| #import "RACSignal+Operations.h" | |
| NSString * const RACSequenceExamples = @"RACSequenceExamples"; | |
| NSString * const RACSequenceExampleSequence = @"RACSequenceExampleSequence"; | |
| NSString * const RACSequenceExampleExpectedValues = @"RACSequenceExampleExpectedValues"; | |
| SharedExampleGroupsBegin(RACSequenceExamples); | |
| sharedExamplesFor(RACSequenceExamples, ^(NSDictionary *data) { | |
| __block RACSequence *sequence; | |
| __block NSArray *values; | |
| beforeEach(^{ | |
| sequence = data[RACSequenceExampleSequence]; | |
| values = [data[RACSequenceExampleExpectedValues] copy]; | |
| }); | |
| it(@"should implement <NSFastEnumeration>", ^{ | |
| NSMutableArray *collectedValues = [NSMutableArray array]; | |
| for (id value in sequence) { | |
| [collectedValues addObject:value]; | |
| } | |
| expect(collectedValues).to.equal(values); | |
| }); | |
| it(@"should return an array", ^{ | |
| expect(sequence.array).to.equal(values); | |
| }); | |
| describe(@"-signalWithScheduler:", ^{ | |
| it(@"should return an immediately scheduled signal", ^{ | |
| RACSignal *signal = [sequence signalWithScheduler:RACScheduler.immediateScheduler]; | |
| expect(signal.toArray).to.equal(values); | |
| }); | |
| it(@"should return a background scheduled signal", ^{ | |
| RACSignal *signal = [sequence signalWithScheduler:[RACScheduler scheduler]]; | |
| expect(signal.toArray).to.equal(values); | |
| }); | |
| it(@"should only evaluate one value per scheduling", ^{ | |
| RACSignal *signal = [sequence signalWithScheduler:RACScheduler.mainThreadScheduler]; | |
| __block BOOL flag = YES; | |
| __block BOOL completed = NO; | |
| [signal subscribeNext:^(id x) { | |
| expect(flag).to.beTruthy(); | |
| flag = NO; | |
| [RACScheduler.mainThreadScheduler schedule:^{ | |
| // This should get executed before the next value (which | |
| // verifies that it's YES). | |
| flag = YES; | |
| }]; | |
| } completed:^{ | |
| completed = YES; | |
| }]; | |
| expect(completed).will.beTruthy(); | |
| }); | |
| }); | |
| it(@"should be equal to itself", ^{ | |
| expect(sequence).to.equal(sequence); | |
| }); | |
| it(@"should be equal to the same sequence of values", ^{ | |
| RACSequence *newSequence = RACSequence.empty; | |
| for (id value in values) { | |
| RACSequence *valueSeq = [RACSequence return:value]; | |
| expect(valueSeq).notTo.beNil(); | |
| newSequence = [newSequence concat:valueSeq]; | |
| } | |
| expect(sequence).to.equal(newSequence); | |
| expect(sequence.hash).to.equal(newSequence.hash); | |
| }); | |
| it(@"should not be equal to a different sequence of values", ^{ | |
| RACSequence *anotherSequence = [RACSequence return:@(-1)]; | |
| expect(sequence).notTo.equal(anotherSequence); | |
| }); | |
| it(@"should return an identical object for -copy", ^{ | |
| expect([sequence copy]).to.beIdenticalTo(sequence); | |
| }); | |
| it(@"should archive", ^{ | |
| NSData *data = [NSKeyedArchiver archivedDataWithRootObject:sequence]; | |
| expect(data).notTo.beNil(); | |
| RACSequence *unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data]; | |
| expect(unarchived).to.equal(sequence); | |
| }); | |
| it(@"should fold right", ^{ | |
| RACSequence *result = [sequence foldRightWithStart:[RACSequence empty] reduce:^(id first, RACSequence *rest) { | |
| return [rest.head startWith:first]; | |
| }]; | |
| expect(result.array).to.equal(values); | |
| }); | |
| it(@"should fold left", ^{ | |
| RACSequence *result = [sequence foldLeftWithStart:[RACSequence empty] reduce:^(RACSequence *first, id rest) { | |
| return [first concat:[RACSequence return:rest]]; | |
| }]; | |
| expect(result.array).to.equal(values); | |
| }); | |
| }); | |
| SharedExampleGroupsEnd |