aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMNSObject+KeyValueObservingTest.m
diff options
context:
space:
mode:
authorGravatar thomasvl@gmail.com <thomasvl@gmail.com@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2009-02-03 17:09:43 +0000
committerGravatar thomasvl@gmail.com <thomasvl@gmail.com@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2009-02-03 17:09:43 +0000
commit74ad2857a75567b273951be9cbe998133fbca26a (patch)
tree9aedbec980fc19be9f3eecf7acd0dfaa9f7c8067 /Foundation/GTMNSObject+KeyValueObservingTest.m
parent2ae297214778005d95354f207753180edca51ec4 (diff)
- Added GTMNSObject+KeyValueObserving to make it easier on folks to do KVO
"correctly". Based on some excellent code by Michael Ash. http://www.mikeash.com/?page=pyblog/key-value-observing-done-right.html This has been added for iPhone and OS X. - Fixed up GTMSenTestCase on iPhone so that it has a description that matches that of OCUnit.
Diffstat (limited to 'Foundation/GTMNSObject+KeyValueObservingTest.m')
-rw-r--r--Foundation/GTMNSObject+KeyValueObservingTest.m106
1 files changed, 106 insertions, 0 deletions
diff --git a/Foundation/GTMNSObject+KeyValueObservingTest.m b/Foundation/GTMNSObject+KeyValueObservingTest.m
new file mode 100644
index 0000000..b97f7ff
--- /dev/null
+++ b/Foundation/GTMNSObject+KeyValueObservingTest.m
@@ -0,0 +1,106 @@
+//
+// GTMNSObject+KeyValueObservingTest.m
+//
+// Copyright 2009 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+//
+// Tester.m
+// MAKVONotificationCenter
+//
+// Created by Michael Ash on 10/15/08.
+//
+
+// This code is based on code by Michael Ash.
+// See comment in header.
+
+#import "GTMSenTestCase.h"
+#import "GTMNSObject+KeyValueObserving.h"
+#import "GTMDefines.h"
+#import "GTMUnitTestDevLog.h"
+
+@interface GTMNSObject_KeyValueObservingTest : GTMTestCase {
+ int32_t count_;
+ NSMutableDictionary *dict_;
+ __weak NSString *expectedValue_;
+}
+@end
+
+@implementation GTMNSObject_KeyValueObservingTest
+- (void)setUp {
+ dict_ = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
+ @"foo", @"key",
+ nil];
+}
+
+- (void)tearDown {
+ [dict_ release];
+}
+
+- (void)testSingleChange {
+ [dict_ gtm_addObserver:self
+ forKeyPath:@"key"
+ selector:@selector(observeValueChange:)
+ userInfo:@"userInfo"
+ options:NSKeyValueObservingOptionNew];
+ expectedValue_ = @"bar";
+ [dict_ setObject:expectedValue_ forKey:@"key"];
+ STAssertEquals(count_, (int32_t)1, nil);
+ [dict_ gtm_removeObserver:self
+ forKeyPath:@"key"
+ selector:@selector(observeValueChange:)];
+ [dict_ setObject:@"foo" forKey:@"key"];
+ STAssertEquals(count_, (int32_t)1, nil);
+}
+
+- (void)testRemoving {
+ [GTMUnitTestDevLogDebug expectPattern:@"-\\[GTMNSObject_KeyValueObservingTest"
+ @" testRemoving\\] was not observing.*"];
+
+ [dict_ gtm_removeObserver:self
+ forKeyPath:@"key"
+ selector:@selector(observeValueChange:)];
+}
+
+- (void)testAdding {
+ [dict_ gtm_addObserver:self
+ forKeyPath:@"key"
+ selector:@selector(observeValueChange:)
+ userInfo:@"userInfo"
+ options:NSKeyValueObservingOptionNew];
+ [GTMUnitTestDevLogDebug expectPattern:@"-\\[GTMNSObject_KeyValueObservingTest"
+ @" testAdding\\] already observing.*"];
+ [dict_ gtm_addObserver:self
+ forKeyPath:@"key"
+ selector:@selector(observeValueChange:)
+ userInfo:@"userInfo"
+ options:NSKeyValueObservingOptionNew];
+}
+
+- (void)observeValueChange:(GTMKeyValueChangeNotification *)notification {
+ STAssertEqualObjects([notification userInfo], @"userInfo", nil);
+ STAssertEqualObjects([notification keyPath], @"key", nil);
+ STAssertEqualObjects([notification object], dict_, nil);
+ NSDictionary *change = [notification change];
+ NSString *value = [change objectForKey:NSKeyValueChangeNewKey];
+ STAssertEqualObjects(value, expectedValue_, nil);
+ ++count_;
+
+ GTMKeyValueChangeNotification *copy = [[notification copy] autorelease];
+ STAssertEqualObjects(notification, copy, nil);
+ STAssertEquals([notification hash], [copy hash], nil);
+}
+
+@end