| // | |
| // RACSerialDisposableSpec.m | |
| // ReactiveCocoa | |
| // | |
| // Created by Justin Spahr-Summers on 2013-07-22. | |
| // Copyright (c) 2013 GitHub, Inc. All rights reserved. | |
| // | |
| #import "RACSerialDisposable.h" | |
| SpecBegin(RACSerialDisposable) | |
| it(@"should initialize with -init", ^{ | |
| RACSerialDisposable *serial = [[RACSerialDisposable alloc] init]; | |
| expect(serial).notTo.beNil(); | |
| expect(serial.disposable).to.beNil(); | |
| }); | |
| it(@"should initialize an inner disposable with -initWithBlock:", ^{ | |
| __block BOOL disposed = NO; | |
| RACSerialDisposable *serial = [RACSerialDisposable disposableWithBlock:^{ | |
| disposed = YES; | |
| }]; | |
| expect(serial).notTo.beNil(); | |
| expect(serial.disposable).notTo.beNil(); | |
| [serial.disposable dispose]; | |
| expect(serial.disposed).to.beFalsy(); | |
| expect(disposed).to.beTruthy(); | |
| }); | |
| it(@"should initialize with a disposable", ^{ | |
| RACDisposable *inner = [[RACDisposable alloc] init]; | |
| RACSerialDisposable *serial = [RACSerialDisposable serialDisposableWithDisposable:inner]; | |
| expect(serial).notTo.beNil(); | |
| expect(serial.disposable).to.equal(inner); | |
| }); | |
| it(@"should dispose of the inner disposable", ^{ | |
| __block BOOL disposed = NO; | |
| RACDisposable *inner = [RACDisposable disposableWithBlock:^{ | |
| disposed = YES; | |
| }]; | |
| RACSerialDisposable *serial = [RACSerialDisposable serialDisposableWithDisposable:inner]; | |
| expect(serial.disposed).to.beFalsy(); | |
| expect(disposed).to.beFalsy(); | |
| [serial dispose]; | |
| expect(serial.disposed).to.beTruthy(); | |
| expect(serial.disposable).to.beNil(); | |
| expect(disposed).to.beTruthy(); | |
| }); | |
| it(@"should dispose of a new inner disposable if it's already been disposed", ^{ | |
| __block BOOL disposed = NO; | |
| RACDisposable *inner = [RACDisposable disposableWithBlock:^{ | |
| disposed = YES; | |
| }]; | |
| RACSerialDisposable *serial = [[RACSerialDisposable alloc] init]; | |
| expect(serial.disposed).to.beFalsy(); | |
| [serial dispose]; | |
| expect(serial.disposed).to.beTruthy(); | |
| expect(disposed).to.beFalsy(); | |
| serial.disposable = inner; | |
| expect(disposed).to.beTruthy(); | |
| expect(serial.disposable).to.beNil(); | |
| }); | |
| it(@"should allow the inner disposable to be set to nil", ^{ | |
| __block BOOL disposed = NO; | |
| RACDisposable *inner = [RACDisposable disposableWithBlock:^{ | |
| disposed = YES; | |
| }]; | |
| RACSerialDisposable *serial = [RACSerialDisposable serialDisposableWithDisposable:inner]; | |
| expect(disposed).to.beFalsy(); | |
| serial.disposable = nil; | |
| expect(serial.disposable).to.beNil(); | |
| serial.disposable = inner; | |
| expect(serial.disposable).to.equal(inner); | |
| [serial dispose]; | |
| expect(disposed).to.beTruthy(); | |
| expect(serial.disposable).to.beNil(); | |
| }); | |
| it(@"should swap inner disposables", ^{ | |
| __block BOOL firstDisposed = NO; | |
| RACDisposable *first = [RACDisposable disposableWithBlock:^{ | |
| firstDisposed = YES; | |
| }]; | |
| __block BOOL secondDisposed = NO; | |
| RACDisposable *second = [RACDisposable disposableWithBlock:^{ | |
| secondDisposed = YES; | |
| }]; | |
| RACSerialDisposable *serial = [RACSerialDisposable serialDisposableWithDisposable:first]; | |
| expect([serial swapInDisposable:second]).to.equal(first); | |
| expect(serial.disposed).to.beFalsy(); | |
| expect(firstDisposed).to.beFalsy(); | |
| expect(secondDisposed).to.beFalsy(); | |
| [serial dispose]; | |
| expect(serial.disposed).to.beTruthy(); | |
| expect(serial.disposable).to.beNil(); | |
| expect(firstDisposed).to.beFalsy(); | |
| expect(secondDisposed).to.beTruthy(); | |
| }); | |
| it(@"should release the inner disposable upon deallocation", ^{ | |
| __weak RACDisposable *weakInnerDisposable; | |
| __weak RACSerialDisposable *weakSerialDisposable; | |
| @autoreleasepool { | |
| RACDisposable *innerDisposable __attribute__((objc_precise_lifetime)) = [[RACDisposable alloc] init]; | |
| weakInnerDisposable = innerDisposable; | |
| RACSerialDisposable *serialDisposable __attribute__((objc_precise_lifetime)) = [[RACSerialDisposable alloc] init]; | |
| serialDisposable.disposable = innerDisposable; | |
| weakSerialDisposable = serialDisposable; | |
| } | |
| expect(weakSerialDisposable).to.beNil(); | |
| expect(weakInnerDisposable).to.beNil(); | |
| }); | |
| SpecEnd |