RACPropertySignalExamples.m 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //
  2. // RACPropertySignalExamples.m
  3. // ReactiveCocoa
  4. //
  5. // Created by Josh Abernathy on 9/28/12.
  6. // Copyright (c) 2012 GitHub, Inc. All rights reserved.
  7. //
  8. #import <Quick/Quick.h>
  9. #import <Nimble/Nimble.h>
  10. #import "RACTestObject.h"
  11. #import <ReactiveCocoa/EXTKeyPathCoding.h>
  12. #import "NSObject+RACDeallocating.h"
  13. #import "NSObject+RACPropertySubscribing.h"
  14. #import "NSObject+RACSelectorSignal.h"
  15. #import "RACCompoundDisposable.h"
  16. #import "RACDisposable.h"
  17. #import "RACSubject.h"
  18. NSString * const RACPropertySignalExamples = @"RACPropertySignalExamples";
  19. NSString * const RACPropertySignalExamplesSetupBlock = @"RACPropertySignalExamplesSetupBlock";
  20. QuickConfigurationBegin(RACPropertySignalExampleGroups)
  21. + (void)configure:(Configuration *)configuration {
  22. sharedExamples(RACPropertySignalExamples, ^(QCKDSLSharedExampleContext exampleContext) {
  23. __block RACTestObject *testObject = nil;
  24. __block void (^setupBlock)(RACTestObject *, NSString *keyPath, id nilValue, RACSignal *);
  25. qck_beforeEach(^{
  26. setupBlock = exampleContext()[RACPropertySignalExamplesSetupBlock];
  27. testObject = [[RACTestObject alloc] init];
  28. });
  29. qck_it(@"should set the value of the property with the latest value from the signal", ^{
  30. RACSubject *subject = [RACSubject subject];
  31. setupBlock(testObject, @keypath(testObject.objectValue), nil, subject);
  32. expect(testObject.objectValue).to(beNil());
  33. [subject sendNext:@1];
  34. expect(testObject.objectValue).to(equal(@1));
  35. [subject sendNext:@2];
  36. expect(testObject.objectValue).to(equal(@2));
  37. [subject sendNext:nil];
  38. expect(testObject.objectValue).to(beNil());
  39. });
  40. qck_it(@"should set the given nilValue for an object property", ^{
  41. RACSubject *subject = [RACSubject subject];
  42. setupBlock(testObject, @keypath(testObject.objectValue), @"foo", subject);
  43. expect(testObject.objectValue).to(beNil());
  44. [subject sendNext:@1];
  45. expect(testObject.objectValue).to(equal(@1));
  46. [subject sendNext:@2];
  47. expect(testObject.objectValue).to(equal(@2));
  48. [subject sendNext:nil];
  49. expect(testObject.objectValue).to(equal(@"foo"));
  50. });
  51. qck_it(@"should leave the value of the property alone after the signal completes", ^{
  52. RACSubject *subject = [RACSubject subject];
  53. setupBlock(testObject, @keypath(testObject.objectValue), nil, subject);
  54. expect(testObject.objectValue).to(beNil());
  55. [subject sendNext:@1];
  56. expect(testObject.objectValue).to(equal(@1));
  57. [subject sendCompleted];
  58. expect(testObject.objectValue).to(equal(@1));
  59. });
  60. qck_it(@"should set the value of a non-object property with the latest value from the signal", ^{
  61. RACSubject *subject = [RACSubject subject];
  62. setupBlock(testObject, @keypath(testObject.integerValue), nil, subject);
  63. expect(@(testObject.integerValue)).to(equal(@0));
  64. [subject sendNext:@1];
  65. expect(@(testObject.integerValue)).to(equal(@1));
  66. [subject sendNext:@2];
  67. expect(@(testObject.integerValue)).to(equal(@2));
  68. [subject sendNext:@0];
  69. expect(@(testObject.integerValue)).to(equal(@0));
  70. });
  71. qck_it(@"should set the given nilValue for a non-object property", ^{
  72. RACSubject *subject = [RACSubject subject];
  73. setupBlock(testObject, @keypath(testObject.integerValue), @42, subject);
  74. expect(@(testObject.integerValue)).to(equal(@0));
  75. [subject sendNext:@1];
  76. expect(@(testObject.integerValue)).to(equal(@1));
  77. [subject sendNext:@2];
  78. expect(@(testObject.integerValue)).to(equal(@2));
  79. [subject sendNext:nil];
  80. expect(@(testObject.integerValue)).to(equal(@42));
  81. });
  82. qck_it(@"should not invoke -setNilValueForKey: with a nilValue", ^{
  83. RACSubject *subject = [RACSubject subject];
  84. setupBlock(testObject, @keypath(testObject.integerValue), @42, subject);
  85. __block BOOL setNilValueForKeyInvoked = NO;
  86. [[testObject rac_signalForSelector:@selector(setNilValueForKey:)] subscribeNext:^(NSString *key) {
  87. setNilValueForKeyInvoked = YES;
  88. }];
  89. [subject sendNext:nil];
  90. expect(@(testObject.integerValue)).to(equal(@42));
  91. expect(@(setNilValueForKeyInvoked)).to(beFalsy());
  92. });
  93. qck_it(@"should invoke -setNilValueForKey: without a nilValue", ^{
  94. RACSubject *subject = [RACSubject subject];
  95. setupBlock(testObject, @keypath(testObject.integerValue), nil, subject);
  96. [subject sendNext:@1];
  97. expect(@(testObject.integerValue)).to(equal(@1));
  98. testObject.catchSetNilValueForKey = YES;
  99. __block BOOL setNilValueForKeyInvoked = NO;
  100. [[testObject rac_signalForSelector:@selector(setNilValueForKey:)] subscribeNext:^(NSString *key) {
  101. setNilValueForKeyInvoked = YES;
  102. }];
  103. [subject sendNext:nil];
  104. expect(@(testObject.integerValue)).to(equal(@1));
  105. expect(@(setNilValueForKeyInvoked)).to(beTruthy());
  106. });
  107. });
  108. }
  109. QuickConfigurationEnd