| // | |
| // 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 |