/Tests/NSObjectBlockObservationTest.m

http://github.com/zwaldowski/BlocksKit · Objective C · 141 lines · 108 code · 29 blank · 4 comment · 1 complexity · 090dfc99b09df09adca835ea06f6981e MD5 · raw file

  1. //
  2. // NSObjectBlockObservationTest.m
  3. // BlocksKit Unit Tests
  4. //
  5. #import "NSObjectBlockObservationTest.h"
  6. @interface SubjectKVCAndKVO : NSObject
  7. @property (nonatomic, getter=isKvc) BOOL kvc; //scalar
  8. @property (nonatomic, retain) NSNumber *number; //scalar
  9. @property (nonatomic, retain) NSObjectBlockObservationTest *test; //to-one
  10. @property (nonatomic, retain) NSMutableArray *names; //ordered to-many
  11. @property (nonatomic, retain) NSMutableSet *members; //unordered to-many
  12. - (void)insertObject:(NSString *)name inNamesAtIndex:(NSUInteger)index;
  13. - (void)removeObjectFromNamesAtIndex:(NSUInteger)index;
  14. - (void)addMembersObject:(NSString *)member;
  15. - (void)removeMembersObject:(NSString *)member;
  16. @end
  17. @implementation SubjectKVCAndKVO
  18. @synthesize kvc=_kvc, test=_test, number=_number, names=_names, members=_members;
  19. - (id)initSubjectWithTest:(NSObjectBlockObservationTest *)test {
  20. if ( (self = [super init]) ) {
  21. self.kvc = YES;
  22. self.test = test;
  23. self.number = [NSNumber numberWithInteger:0];
  24. self.names = [NSMutableArray arrayWithObjects:@"one",@"two",nil];
  25. self.members = [NSMutableSet setWithObjects:@"foo",@"bar",nil];
  26. }
  27. return self;
  28. }
  29. - (void)dealloc {
  30. [_number release];
  31. [_test release];
  32. [_names release];
  33. [_members release];
  34. [super dealloc];
  35. }
  36. - (void)insertObject:(NSString *)name inNamesAtIndex:(NSUInteger)index {
  37. [_names insertObject:name atIndex:index];
  38. }
  39. - (void)removeObjectFromNamesAtIndex:(NSUInteger)index {
  40. [_names removeObjectAtIndex:index];
  41. }
  42. - (void)addMembersObject:(NSString *)member {
  43. [_members addObject:member];
  44. }
  45. - (void)removeMembersObject:(NSString *)member {
  46. [_members removeObject:member];
  47. }
  48. @end
  49. @implementation NSObjectBlockObservationTest {
  50. SubjectKVCAndKVO *_subject;
  51. NSInteger _total;
  52. }
  53. - (void)setUpClass {
  54. _subject = [[SubjectKVCAndKVO alloc] initSubjectWithTest:self];
  55. }
  56. - (void)tearDownClass {
  57. [_subject release];
  58. }
  59. - (void)setUp {
  60. _total = 0;
  61. }
  62. - (void)action {
  63. _total += 1;
  64. }
  65. - (void)testBoolKeyValueObservation {
  66. BKObservationBlock observeBlock = ^(id obj, NSDictionary *change) {
  67. [(NSObjectBlockObservationTest *)obj action];
  68. };
  69. NSString *token = [self addObserverForKeyPath:@"subject.kvc" task:observeBlock];
  70. [self setValue:[NSNumber numberWithBool:NO] forKeyPath:@"subject.kvc"];
  71. GHAssertFalse(_subject.kvc,@"kvc is NO");
  72. GHAssertEquals(_total,1,@"total is %d",_total);
  73. [self removeObserverForKeyPath:@"subject.kvc" identifier:token];
  74. }
  75. - (void)testNSNumberKeyValueObservation {
  76. BKObservationBlock observeBlock = ^(id obj, NSDictionary *change) {
  77. [(NSObjectBlockObservationTest *)obj action];
  78. };
  79. NSString *token = [self addObserverForKeyPath:@"subject.number" task:observeBlock];
  80. NSNumber *number = [NSNumber numberWithInteger:1];
  81. [self setValue:number forKeyPath:@"subject.number"];
  82. GHAssertEquals(_subject.number,number,@"number is %@",_subject.number);
  83. GHAssertEquals(_total,1,@"total is %d",_total);
  84. [self removeObserverForKeyPath:@"subject.number" identifier:token];
  85. }
  86. - (void)testNSArrayKeyValueObservation {
  87. BKObservationBlock observeBlock = ^(id obj, NSDictionary *change) {
  88. [(NSObjectBlockObservationTest *)obj action];
  89. };
  90. NSString *token = [self addObserverForKeyPath:@"subject.names" task:observeBlock];
  91. NSMutableArray *names = [self mutableArrayValueForKeyPath:@"subject.names"];
  92. [names replaceObjectAtIndex:0 withObject:@"1"];
  93. [names replaceObjectAtIndex:1 withObject:@"2"];
  94. NSArray *target = [NSArray arrayWithObjects:@"1",@"2",nil];
  95. GHAssertEqualObjects(_subject.names,target,@"names are %@",_subject.names);
  96. GHAssertEquals(_total,2,@"total is %d",_total);
  97. [self removeObserverForKeyPath:@"subject.names" identifier:token];
  98. }
  99. - (void)testNSSetKeyValueObservation {
  100. BKObservationBlock observeBlock = ^(id obj, NSDictionary *change) {
  101. [(NSObjectBlockObservationTest *)obj action];
  102. };
  103. NSString *token = [self addObserverForKeyPath:@"subject.members" task:observeBlock];
  104. NSMutableSet *members = [self mutableSetValueForKeyPath:@"subject.members"];
  105. [members removeObject:@"bar"];
  106. [members addObject:@"one"];
  107. NSSet *target = [NSSet setWithObjects:@"foo",@"one",nil];
  108. GHAssertEqualObjects(_subject.members,target,@"members are %@",_subject.members);
  109. GHAssertEquals(_total,2,@"total is %d",_total);
  110. [self removeObserverForKeyPath:@"subject.members" identifier:token];
  111. }
  112. @end