From 96aef6e47a5f8e49cddab84d0e0efb2d1f9142d8 Mon Sep 17 00:00:00 2001 From: mrahmiao Date: Fri, 1 Jan 2016 17:30:34 +0800 Subject: [PATCH 1/4] Adds `rx_state` to `NSButton`. --- RxCocoa/OSX/NSButton+Rx.swift | 11 +++++++++++ Tests/RxCocoaTests/Control+RxTests+Cocoa.swift | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/RxCocoa/OSX/NSButton+Rx.swift b/RxCocoa/OSX/NSButton+Rx.swift index 460baef2..0c6e5f6c 100644 --- a/RxCocoa/OSX/NSButton+Rx.swift +++ b/RxCocoa/OSX/NSButton+Rx.swift @@ -20,4 +20,15 @@ extension NSButton { public var rx_tap: ControlEvent { return rx_controlEvent } + + /** + Reactive wrapper for `state` property`. + */ + public var rx_state: ControlProperty { + return rx_value(getter: { [weak self] in + return self?.state ?? 0 + }, setter: { [weak self] state in + self?.state = state + }) + } } \ No newline at end of file diff --git a/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift b/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift index a81fd3d3..90555276 100644 --- a/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift +++ b/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift @@ -41,4 +41,9 @@ extension ControlTests { let createView: () -> NSButton = { NSButton(frame: CGRectMake(0, 0, 1, 1)) } ensureEventDeallocated(createView) { (view: NSButton) in view.rx_tap } } + + func testButton_StateCompletesOnDealloc() { + let createView: () -> NSButton = { NSButton(frame: CGRectMake(0, 0, 1, 1)) } + ensureEventDeallocated(createView) { (view: NSButton) in view.rx_state } + } } \ No newline at end of file From 2ea5b73bd092a94447ec5e16251438c3e7df6903 Mon Sep 17 00:00:00 2001 From: mrahmiao Date: Fri, 1 Jan 2016 17:51:02 +0800 Subject: [PATCH 2/4] Adds `rx_enabled` to `NSControl`. --- RxCocoa/OSX/NSControl+Rx.swift | 20 +++++++++++++- Tests/RxCocoaTests/NSControl+RxTests.swift | 32 ++++++++++++++++++++++ Tests/Tests.xcodeproj/project.pbxproj | 4 +++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 Tests/RxCocoaTests/NSControl+RxTests.swift diff --git a/RxCocoa/OSX/NSControl+Rx.swift b/RxCocoa/OSX/NSControl+Rx.swift index 9aabdae2..d728e847 100644 --- a/RxCocoa/OSX/NSControl+Rx.swift +++ b/RxCocoa/OSX/NSControl+Rx.swift @@ -93,5 +93,23 @@ extension NSControl { } }) } - + + /** + Bindable sink for `enabled` property. + */ + public var rx_enabled: AnyObserver { + return AnyObserver { [weak self] event in + MainScheduler.ensureExecutingOnScheduler() + + switch event { + case .Next(let value): + self?.enabled = value + case .Error(let error): + bindingErrorToInterface(error) + break + case .Completed: + break + } + } + } } \ No newline at end of file diff --git a/Tests/RxCocoaTests/NSControl+RxTests.swift b/Tests/RxCocoaTests/NSControl+RxTests.swift new file mode 100644 index 00000000..2c91749a --- /dev/null +++ b/Tests/RxCocoaTests/NSControl+RxTests.swift @@ -0,0 +1,32 @@ +// +// NSControl+RxTests.swift +// Tests +// +// Created by mrahmiao on 1/1/16. +// +// + +import Foundation +import RxSwift +import RxCocoa +import Cocoa +import XCTest + +class NSControlTests : RxTest { +} + +extension NSControlTests { + func testEnabled_False() { + let subject = NSButton(frame: CGRectMake(0, 0, 1, 1)) + just(false).subscribe(subject.rx_enabled).dispose() + + XCTAssertTrue(subject.enabled == false) + } + + func testEnabled_True() { + let subject = NSButton(frame: CGRectMake(0, 0, 1, 1)) + just(true).subscribe(subject.rx_enabled).dispose() + + XCTAssertFalse(subject.enabled == true) + } +} \ No newline at end of file diff --git a/Tests/Tests.xcodeproj/project.pbxproj b/Tests/Tests.xcodeproj/project.pbxproj index 23e4bdb3..bdac51a9 100644 --- a/Tests/Tests.xcodeproj/project.pbxproj +++ b/Tests/Tests.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 4F0B0B231C36810E00BD0534 /* NSControl+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F0B0B221C36810E00BD0534 /* NSControl+RxTests.swift */; }; 5E5D10BB1B48355200432B25 /* Control+RxTests+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E5D10BA1B48355200432B25 /* Control+RxTests+UIKit.swift */; }; C69B65001BA88FAC00A7FA73 /* ObserverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69B64FF1BA88FAC00A7FA73 /* ObserverTests.swift */; }; C69B65011BA8957C00A7FA73 /* ObserverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69B64FF1BA88FAC00A7FA73 /* ObserverTests.swift */; }; @@ -212,6 +213,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 4F0B0B221C36810E00BD0534 /* NSControl+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSControl+RxTests.swift"; sourceTree = ""; }; 5E5D10BA1B48355200432B25 /* Control+RxTests+UIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "Control+RxTests+UIKit.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; C69B64FF1BA88FAC00A7FA73 /* ObserverTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObserverTests.swift; sourceTree = ""; }; C801EB591B97951100C4D8C4 /* Observable+CreationTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "Observable+CreationTest.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; @@ -417,6 +419,7 @@ C8BCD3F81C14B901005F1280 /* UIView+RxTests.swift */, C8BCD3FD1C14BCAD005F1280 /* NSLayoutConstraint+RxTests.swift */, C8CF47651C1DA04700C3FA6E /* CLLocationManager+RxTests.swift */, + 4F0B0B221C36810E00BD0534 /* NSControl+RxTests.swift */, ); path = RxCocoaTests; sourceTree = SOURCE_ROOT; @@ -765,6 +768,7 @@ C8BCD3FC1C14B914005F1280 /* NSView+RxTests.swift in Sources */, C897EC3C1B10E000009C2CB0 /* BehaviorSubjectTest.swift in Sources */, C88BB8A51B07E64B0064D411 /* QueueTests.swift in Sources */, + 4F0B0B231C36810E00BD0534 /* NSControl+RxTests.swift in Sources */, C8E3812C1B2083C2008CDC33 /* PrimitiveMockObserver.swift in Sources */, C88BB8A61B07E64B0064D411 /* Observable+SingleTest.swift in Sources */, C897EC4B1B1123DA009C2CB0 /* Observable+MultipleTest+Zip.swift in Sources */, From 035b40d9a39240ad0dccee9cae8f5adfc1ad18a8 Mon Sep 17 00:00:00 2001 From: mrahmiao Date: Fri, 1 Jan 2016 21:13:48 +0800 Subject: [PATCH 3/4] Unifies the header of NSControl+RxTests.swift Signed-off-by: mrahmiao --- Tests/RxCocoaTests/NSControl+RxTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/RxCocoaTests/NSControl+RxTests.swift b/Tests/RxCocoaTests/NSControl+RxTests.swift index 2c91749a..99cead07 100644 --- a/Tests/RxCocoaTests/NSControl+RxTests.swift +++ b/Tests/RxCocoaTests/NSControl+RxTests.swift @@ -3,7 +3,7 @@ // Tests // // Created by mrahmiao on 1/1/16. -// +// Copyright © 2015 Krunoslav Zaher. All rights reserved. // import Foundation From c7a641fe212ae8d9694e31eaeefe982f5fc8f5f1 Mon Sep 17 00:00:00 2001 From: mrahmiao Date: Fri, 1 Jan 2016 22:28:42 +0800 Subject: [PATCH 4/4] Fixes test failures of `rx_state` of `NSButton` and `rx_enabled` of `NSControl`. Signed-off-by: mrahmiao --- Tests/RxCocoaTests/Control+RxTests+Cocoa.swift | 4 ++-- Tests/RxCocoaTests/NSControl+RxTests.swift | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift b/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift index 90555276..72e7815c 100644 --- a/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift +++ b/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift @@ -43,7 +43,7 @@ extension ControlTests { } func testButton_StateCompletesOnDealloc() { - let createView: () -> NSButton = { NSButton(frame: CGRectMake(0, 0, 1, 1)) } - ensureEventDeallocated(createView) { (view: NSButton) in view.rx_state } + let createView: () -> NSButton = { NSButton(frame: CGRectMake(0, 0, 1, 1)) } + ensurePropertyDeallocated(createView, 0) { (view: NSButton) in view.rx_state } } } \ No newline at end of file diff --git a/Tests/RxCocoaTests/NSControl+RxTests.swift b/Tests/RxCocoaTests/NSControl+RxTests.swift index 99cead07..d2ace6e6 100644 --- a/Tests/RxCocoaTests/NSControl+RxTests.swift +++ b/Tests/RxCocoaTests/NSControl+RxTests.swift @@ -18,15 +18,15 @@ class NSControlTests : RxTest { extension NSControlTests { func testEnabled_False() { let subject = NSButton(frame: CGRectMake(0, 0, 1, 1)) - just(false).subscribe(subject.rx_enabled).dispose() + Observable.just(false).subscribe(subject.rx_enabled).dispose() XCTAssertTrue(subject.enabled == false) } func testEnabled_True() { let subject = NSButton(frame: CGRectMake(0, 0, 1, 1)) - just(true).subscribe(subject.rx_enabled).dispose() + Observable.just(true).subscribe(subject.rx_enabled).dispose() - XCTAssertFalse(subject.enabled == true) + XCTAssertTrue(subject.enabled == true) } } \ No newline at end of file