From 483c22abd73c1be6f66280ab187cb5fa7a88681d Mon Sep 17 00:00:00 2001 From: Ryu Tanabe Date: Tue, 23 Aug 2016 09:08:56 +0900 Subject: [PATCH] adds `UISearchBar` extensions --- CHANGELOG.md | 5 ++ RxCocoa/iOS/UISearchBar+Rx.swift | 47 +++++++++++- Tests/RxCocoaTests/UISearchBar+RxTests.swift | 78 +++++++++++++++++++- 3 files changed, 128 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec1c6a44..4ca9e37a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,11 @@ All notable changes to this project will be documented in this file. * Deprecates `BinaryDisposable` in favor of `Disposables.create(_:_:)` * Deprecates `toObservable` in favor of `Observable.from()`. * Replaces old javascript automation tests with Swift UI Tests. +* adds `UISearchBar` extensions: + * `bookmarkButtonClicked` + * `resultsListButtonClicked` + * `textDidBeginEditing` + * `textDidEndEditing` * ... #### Anomalies diff --git a/RxCocoa/iOS/UISearchBar+Rx.swift b/RxCocoa/iOS/UISearchBar+Rx.swift index d74af11e..30e66077 100644 --- a/RxCocoa/iOS/UISearchBar+Rx.swift +++ b/RxCocoa/iOS/UISearchBar+Rx.swift @@ -93,8 +93,30 @@ extension Reactive where Base: UISearchBar { } return ControlEvent(events: source) } + + /** + Reactive wrapper for delegate method `searchBarBookmarkButtonClicked`. + */ + public var bookmarkButtonClicked: ControlEvent { + let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarBookmarkButtonClicked(_:))) + .map { _ in + return () + } + return ControlEvent(events: source) + } + + /** + Reactive wrapper for delegate method `searchBarResultsListButtonClicked`. + */ + public var resultsListButtonClicked: ControlEvent { + let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarResultsListButtonClicked(_:))) + .map { _ in + return () + } + return ControlEvent(events: source) + } #endif - + /** Reactive wrapper for delegate method `searchBarSearchButtonClicked`. */ @@ -105,6 +127,29 @@ extension Reactive where Base: UISearchBar { } return ControlEvent(events: source) } + + /** + Reactive wrapper for delegate method `searchBarTextDidBeginEditing`. + */ + public var textDidBeginEditing: ControlEvent { + let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarTextDidBeginEditing(_:))) + .map { _ in + return () + } + return ControlEvent(events: source) + } + + /** + Reactive wrapper for delegate method `searchBarTextDidEndEditing`. + */ + public var textDidEndEditing: ControlEvent { + let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarTextDidEndEditing(_:))) + .map { _ in + return () + } + return ControlEvent(events: source) + } + } #endif diff --git a/Tests/RxCocoaTests/UISearchBar+RxTests.swift b/Tests/RxCocoaTests/UISearchBar+RxTests.swift index c9549ab8..bc3cb47b 100644 --- a/Tests/RxCocoaTests/UISearchBar+RxTests.swift +++ b/Tests/RxCocoaTests/UISearchBar+RxTests.swift @@ -96,8 +96,47 @@ class UISearchBarTests : RxTest { let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) } ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx.cancelButtonClicked } } + + func testBookmarkButtonClicked() { + let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) + + var tapped = false + + let _ = searchBar.rx.bookmarkButtonClicked.subscribe(onNext: { _ in + tapped = true + }) + + XCTAssertFalse(tapped) + searchBar.delegate!.searchBarBookmarkButtonClicked!(searchBar) + XCTAssertTrue(tapped) + } + + func testBookmarkButtonClicked_DelegateEventCompletesOnDealloc() { + let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) } + ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx.bookmarkButtonClicked } + } + + func testResultsListButtonClicked() { + let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) + + var tapped = false + + let _ = searchBar.rx.resultsListButtonClicked.subscribe(onNext: { _ in + tapped = true + }) + + XCTAssertFalse(tapped) + searchBar.delegate!.searchBarResultsListButtonClicked!(searchBar) + XCTAssertTrue(tapped) + } + + func testResultsListButtonClicked_DelegateEventCompletesOnDealloc() { + let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) } + ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx.resultsListButtonClicked } + } + #endif - + func testSearchButtonClicked() { let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) @@ -116,4 +155,41 @@ class UISearchBarTests : RxTest { let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) } ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx.searchButtonClicked } } + + func testSearchBarTextDidBeginEditing(){ + let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) + + var tapped = false + let _ = searchBar.rx.textDidBeginEditing.subscribe(onNext: { _ in + tapped = true + }) + XCTAssertFalse(tapped) + searchBar.delegate!.searchBarTextDidBeginEditing!(searchBar) + XCTAssertTrue(tapped) + } + + func testSearchBarTextDidBeginEditing_DelegateEventCompletesOnDealloc() { + let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) } + ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx.textDidBeginEditing } + } + + func testSearchBarTextDidEndEditing(){ + let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) + + var tapped = false + let _ = searchBar.rx.textDidEndEditing.subscribe(onNext: { _ in + tapped = true + }) + XCTAssertFalse(tapped) + searchBar.delegate!.searchBarTextDidBeginEditing!(searchBar) + XCTAssertFalse(tapped) + searchBar.delegate!.searchBarTextDidEndEditing!(searchBar) + XCTAssertTrue(tapped) + } + + func testSearchBarTextDidEndEditing_DelegateEventCompletesOnDealloc() { + let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) } + ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx.textDidEndEditing } + } + }