blob: 831c3a34a840c5821dfe080be331e0768881761f [file] [log] [blame]
//
// RACDelegateProxySpec.m
// ReactiveCocoa
//
// Created by Justin Spahr-Summers on 2013-06-22.
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
//
#import "NSObject+RACSelectorSignal.h"
#import "RACDelegateProxy.h"
#import "RACSignal.h"
#import "RACTuple.h"
#import "RACCompoundDisposable.h"
#import "NSObject+RACDeallocating.h"
@protocol TestDelegateProtocol
- (NSUInteger)lengthOfString:(NSString *)str;
@end
@interface TestDelegate : NSObject <TestDelegateProtocol>
@property (nonatomic, assign) BOOL lengthOfStringInvoked;
@end
SpecBegin(RACDelegateProxy)
__block id proxy;
__block TestDelegate *delegate;
__block Protocol *protocol;
beforeEach(^{
protocol = @protocol(TestDelegateProtocol);
expect(protocol).notTo.beNil();
proxy = [[RACDelegateProxy alloc] initWithProtocol:protocol];
expect(proxy).notTo.beNil();
expect([proxy rac_proxiedDelegate]).to.beNil();
delegate = [[TestDelegate alloc] init];
expect(delegate).notTo.beNil();
});
it(@"should not respond to selectors at first", ^{
expect([proxy respondsToSelector:@selector(lengthOfString:)]).to.beFalsy();
});
it(@"should send on a signal for a protocol method", ^{
__block RACTuple *tuple;
[[proxy signalForSelector:@selector(lengthOfString:)] subscribeNext:^(RACTuple *t) {
tuple = t;
}];
expect([proxy respondsToSelector:@selector(lengthOfString:)]).to.beTruthy();
expect([proxy lengthOfString:@"foo"]).to.equal(0);
expect(tuple).to.equal(RACTuplePack(@"foo"));
});
it(@"should forward to the proxied delegate", ^{
[proxy setRac_proxiedDelegate:delegate];
expect([proxy respondsToSelector:@selector(lengthOfString:)]).to.beTruthy();
expect([proxy lengthOfString:@"foo"]).to.equal(3);
expect(delegate.lengthOfStringInvoked).to.beTruthy();
});
it(@"should not send to the delegate when signals are applied", ^{
[proxy setRac_proxiedDelegate:delegate];
__block RACTuple *tuple;
[[proxy signalForSelector:@selector(lengthOfString:)] subscribeNext:^(RACTuple *t) {
tuple = t;
}];
expect([proxy respondsToSelector:@selector(lengthOfString:)]).to.beTruthy();
expect([proxy lengthOfString:@"foo"]).to.equal(0);
expect(tuple).to.equal(RACTuplePack(@"foo"));
expect(delegate.lengthOfStringInvoked).to.beFalsy();
});
SpecEnd
@implementation TestDelegate
- (NSUInteger)lengthOfString:(NSString *)str {
self.lengthOfStringInvoked = YES;
return str.length;
}
@end