blob: cdf35f5750488c1e8459de29cc5a43b0b786a196 [file] [log] [blame] [edit]
//
// 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