| // |
| // RACTestSchedulerSpec.m |
| // ReactiveCocoa |
| // |
| // Created by Justin Spahr-Summers on 2013-07-06. |
| // Copyright (c) 2013 GitHub, Inc. All rights reserved. |
| // |
| |
| #import "RACTestScheduler.h" |
| |
| SpecBegin(RACTestScheduler) |
| |
| __block RACTestScheduler *scheduler; |
| |
| beforeEach(^{ |
| scheduler = [[RACTestScheduler alloc] init]; |
| expect(scheduler).notTo.beNil(); |
| }); |
| |
| it(@"should do nothing when stepping while empty", ^{ |
| [scheduler step]; |
| [scheduler step:5]; |
| [scheduler stepAll]; |
| }); |
| |
| it(@"should execute the earliest enqueued block when stepping", ^{ |
| __block BOOL firstExecuted = NO; |
| [scheduler schedule:^{ |
| firstExecuted = YES; |
| }]; |
| |
| __block BOOL secondExecuted = NO; |
| [scheduler schedule:^{ |
| secondExecuted = YES; |
| }]; |
| |
| expect(firstExecuted).to.beFalsy(); |
| expect(secondExecuted).to.beFalsy(); |
| |
| [scheduler step]; |
| expect(firstExecuted).to.beTruthy(); |
| expect(secondExecuted).to.beFalsy(); |
| |
| [scheduler step]; |
| expect(secondExecuted).to.beTruthy(); |
| }); |
| |
| it(@"should step multiple times", ^{ |
| __block BOOL firstExecuted = NO; |
| [scheduler schedule:^{ |
| firstExecuted = YES; |
| }]; |
| |
| __block BOOL secondExecuted = NO; |
| [scheduler schedule:^{ |
| secondExecuted = YES; |
| }]; |
| |
| __block BOOL thirdExecuted = NO; |
| [scheduler schedule:^{ |
| thirdExecuted = YES; |
| }]; |
| |
| expect(firstExecuted).to.beFalsy(); |
| expect(secondExecuted).to.beFalsy(); |
| expect(thirdExecuted).to.beFalsy(); |
| |
| [scheduler step:2]; |
| expect(firstExecuted).to.beTruthy(); |
| expect(secondExecuted).to.beTruthy(); |
| expect(thirdExecuted).to.beFalsy(); |
| |
| [scheduler step:1]; |
| expect(thirdExecuted).to.beTruthy(); |
| }); |
| |
| it(@"should step through all scheduled blocks", ^{ |
| __block NSUInteger executions = 0; |
| for (NSUInteger i = 0; i < 10; i++) { |
| [scheduler schedule:^{ |
| executions++; |
| }]; |
| } |
| |
| expect(executions).to.equal(0); |
| |
| [scheduler stepAll]; |
| expect(executions).to.equal(10); |
| }); |
| |
| it(@"should execute blocks in date order when stepping", ^{ |
| __block BOOL laterExecuted = NO; |
| [scheduler after:[NSDate distantFuture] schedule:^{ |
| laterExecuted = YES; |
| }]; |
| |
| __block BOOL earlierExecuted = NO; |
| [scheduler after:[NSDate dateWithTimeIntervalSinceNow:20] schedule:^{ |
| earlierExecuted = YES; |
| }]; |
| |
| expect(earlierExecuted).to.beFalsy(); |
| expect(laterExecuted).to.beFalsy(); |
| |
| [scheduler step]; |
| expect(earlierExecuted).to.beTruthy(); |
| expect(laterExecuted).to.beFalsy(); |
| |
| [scheduler step]; |
| expect(laterExecuted).to.beTruthy(); |
| }); |
| |
| it(@"should execute delayed blocks in date order when stepping", ^{ |
| __block BOOL laterExecuted = NO; |
| [scheduler afterDelay:100 schedule:^{ |
| laterExecuted = YES; |
| }]; |
| |
| __block BOOL earlierExecuted = NO; |
| [scheduler afterDelay:50 schedule:^{ |
| earlierExecuted = YES; |
| }]; |
| |
| expect(earlierExecuted).to.beFalsy(); |
| expect(laterExecuted).to.beFalsy(); |
| |
| [scheduler step]; |
| expect(earlierExecuted).to.beTruthy(); |
| expect(laterExecuted).to.beFalsy(); |
| |
| [scheduler step]; |
| expect(laterExecuted).to.beTruthy(); |
| }); |
| |
| it(@"should execute a repeating blocks in date order", ^{ |
| __block NSUInteger firstExecutions = 0; |
| [scheduler after:[NSDate dateWithTimeIntervalSinceNow:20] repeatingEvery:5 withLeeway:0 schedule:^{ |
| firstExecutions++; |
| }]; |
| |
| __block NSUInteger secondExecutions = 0; |
| [scheduler after:[NSDate dateWithTimeIntervalSinceNow:22] repeatingEvery:10 withLeeway:0 schedule:^{ |
| secondExecutions++; |
| }]; |
| |
| expect(firstExecutions).to.equal(0); |
| expect(secondExecutions).to.equal(0); |
| |
| // 20 ticks |
| [scheduler step]; |
| expect(firstExecutions).to.equal(1); |
| expect(secondExecutions).to.equal(0); |
| |
| // 22 ticks |
| [scheduler step]; |
| expect(firstExecutions).to.equal(1); |
| expect(secondExecutions).to.equal(1); |
| |
| // 25 ticks |
| [scheduler step]; |
| expect(firstExecutions).to.equal(2); |
| expect(secondExecutions).to.equal(1); |
| |
| // 30 ticks |
| [scheduler step]; |
| expect(firstExecutions).to.equal(3); |
| expect(secondExecutions).to.equal(1); |
| |
| // 32 ticks |
| [scheduler step]; |
| expect(firstExecutions).to.equal(3); |
| expect(secondExecutions).to.equal(2); |
| }); |
| |
| SpecEnd |