RACDelegateProxySpec.m 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // RACDelegateProxySpec.m
  3. // ReactiveCocoa
  4. //
  5. // Created by Justin Spahr-Summers on 2013-06-22.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import <Quick/Quick.h>
  9. #import <Nimble/Nimble.h>
  10. #import "NSObject+RACSelectorSignal.h"
  11. #import "RACDelegateProxy.h"
  12. #import "RACSignal.h"
  13. #import "RACTuple.h"
  14. #import "RACCompoundDisposable.h"
  15. #import "NSObject+RACDeallocating.h"
  16. @protocol TestDelegateProtocol
  17. - (NSUInteger)lengthOfString:(NSString *)str;
  18. @end
  19. @interface TestDelegate : NSObject <TestDelegateProtocol>
  20. @property (nonatomic, assign) BOOL lengthOfStringInvoked;
  21. @end
  22. QuickSpecBegin(RACDelegateProxySpec)
  23. __block id proxy;
  24. __block TestDelegate *delegate;
  25. __block Protocol *protocol;
  26. qck_beforeEach(^{
  27. protocol = @protocol(TestDelegateProtocol);
  28. expect(protocol).notTo(beNil());
  29. proxy = [[RACDelegateProxy alloc] initWithProtocol:protocol];
  30. expect(proxy).notTo(beNil());
  31. expect([proxy rac_proxiedDelegate]).to(beNil());
  32. delegate = [[TestDelegate alloc] init];
  33. expect(delegate).notTo(beNil());
  34. });
  35. qck_it(@"should not respond to selectors at first", ^{
  36. expect(@([proxy respondsToSelector:@selector(lengthOfString:)])).to(beFalsy());
  37. });
  38. qck_it(@"should send on a signal for a protocol method", ^{
  39. __block RACTuple *tuple;
  40. [[proxy signalForSelector:@selector(lengthOfString:)] subscribeNext:^(RACTuple *t) {
  41. tuple = t;
  42. }];
  43. expect(@([proxy respondsToSelector:@selector(lengthOfString:)])).to(beTruthy());
  44. expect(@([proxy lengthOfString:@"foo"])).to(equal(@0));
  45. expect(tuple).to(equal(RACTuplePack(@"foo")));
  46. });
  47. qck_it(@"should forward to the proxied delegate", ^{
  48. [proxy setRac_proxiedDelegate:delegate];
  49. expect(@([proxy respondsToSelector:@selector(lengthOfString:)])).to(beTruthy());
  50. expect(@([proxy lengthOfString:@"foo"])).to(equal(@3));
  51. expect(@(delegate.lengthOfStringInvoked)).to(beTruthy());
  52. });
  53. qck_it(@"should not send to the delegate when signals are applied", ^{
  54. [proxy setRac_proxiedDelegate:delegate];
  55. __block RACTuple *tuple;
  56. [[proxy signalForSelector:@selector(lengthOfString:)] subscribeNext:^(RACTuple *t) {
  57. tuple = t;
  58. }];
  59. expect(@([proxy respondsToSelector:@selector(lengthOfString:)])).to(beTruthy());
  60. expect(@([proxy lengthOfString:@"foo"])).to(equal(@0));
  61. expect(tuple).to(equal(RACTuplePack(@"foo")));
  62. expect(@(delegate.lengthOfStringInvoked)).to(beFalsy());
  63. });
  64. QuickSpecEnd
  65. @implementation TestDelegate
  66. - (NSUInteger)lengthOfString:(NSString *)str {
  67. self.lengthOfStringInvoked = YES;
  68. return str.length;
  69. }
  70. @end