Adds reactive extensions for UISearchController and tests to cover them

This commit is contained in:
sergdort 2016-03-22 16:50:07 +02:00
parent 20113e40b0
commit 2f16a4faa7
5 changed files with 280 additions and 2 deletions

View File

@ -24,6 +24,9 @@
842A5A2C1C357F92003568D5 /* NSTextStorage+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842A5A281C357F7D003568D5 /* NSTextStorage+Rx.swift */; };
842A5A2D1C357F93003568D5 /* NSTextStorage+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842A5A281C357F7D003568D5 /* NSTextStorage+Rx.swift */; };
842A5A2E1C357F94003568D5 /* NSTextStorage+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842A5A281C357F7D003568D5 /* NSTextStorage+Rx.swift */; };
846436E31C9AF65B0035B40D /* RxSearchControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 846436E11C9AF64C0035B40D /* RxSearchControllerDelegateProxy.swift */; };
846436E51C9AF65E0035B40D /* RxSearchControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 846436E11C9AF64C0035B40D /* RxSearchControllerDelegateProxy.swift */; };
846436E61C9AF6670035B40D /* RxSearchControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 846436E11C9AF64C0035B40D /* RxSearchControllerDelegateProxy.swift */; };
8476A0211C3D5DC60040BA22 /* UIImagePickerController+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8476A01F1C3D5D580040BA22 /* UIImagePickerController+RxTests.swift */; };
8476A0221C3D5DC60040BA22 /* UIImagePickerController+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8476A01F1C3D5D580040BA22 /* UIImagePickerController+RxTests.swift */; };
8476A0231C3D5DC80040BA22 /* UIImagePickerController+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8476A01F1C3D5D580040BA22 /* UIImagePickerController+RxTests.swift */; };
@ -36,6 +39,10 @@
84C225A31C33F00B008724EC /* RxTextStorageDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C225A21C33F00B008724EC /* RxTextStorageDelegateProxy.swift */; };
84C225A41C33F00B008724EC /* RxTextStorageDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C225A21C33F00B008724EC /* RxTextStorageDelegateProxy.swift */; };
84C225A51C33F00B008724EC /* RxTextStorageDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C225A21C33F00B008724EC /* RxTextStorageDelegateProxy.swift */; };
84E4D3921C9AFD3400ADFDC9 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */; };
84E4D3931C9AFD3500ADFDC9 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */; };
84E4D3941C9AFD3600ADFDC9 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */; };
84E4D3961C9B011000ADFDC9 /* UISearchController+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3951C9B011000ADFDC9 /* UISearchController+RxTests.swift */; };
9BA1CBD31C0F7D550044B50A /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */; };
9BA1CBFD1C0F84A10044B50A /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */; };
9BA1CBFE1C0F84C40044B50A /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */; };
@ -1332,10 +1339,13 @@
7F600F3D1C5D0C0100535B1D /* UIRefreshControl+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIRefreshControl+Rx.swift"; sourceTree = "<group>"; };
7F600F421C5D0D2D00535B1D /* UIRefreshControl+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIRefreshControl+RxTests.swift"; sourceTree = "<group>"; };
842A5A281C357F7D003568D5 /* NSTextStorage+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSTextStorage+Rx.swift"; sourceTree = "<group>"; };
846436E11C9AF64C0035B40D /* RxSearchControllerDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxSearchControllerDelegateProxy.swift; sourceTree = "<group>"; };
8476A01F1C3D5D580040BA22 /* UIImagePickerController+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImagePickerController+RxTests.swift"; sourceTree = "<group>"; };
8479BC441C3ACDA400FB8B54 /* RxImagePickerDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxImagePickerDelegateProxy.swift; sourceTree = "<group>"; };
8479BC4A1C3ACED100FB8B54 /* UIImagePickerController+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImagePickerController+Rx.swift"; sourceTree = "<group>"; };
84C225A21C33F00B008724EC /* RxTextStorageDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextStorageDelegateProxy.swift; sourceTree = "<group>"; };
84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchController+Rx.swift"; sourceTree = "<group>"; };
84E4D3951C9B011000ADFDC9 /* UISearchController+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchController+RxTests.swift"; sourceTree = "<group>"; };
9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIActivityIndicatorView+Rx.swift"; sourceTree = "<group>"; };
A111CE961B91C97C00D0DCEE /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
AAE623751C82475700FC7801 /* UIProgressView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIProgressView+Rx.swift"; sourceTree = "<group>"; };
@ -2219,6 +2229,7 @@
7F600F421C5D0D2D00535B1D /* UIRefreshControl+RxTests.swift */,
7EDBAEAB1C89B1A5006CBE67 /* UITabBarItem+RxTests.swift */,
C8B2908C1C94D6C500E923D0 /* UISearchBar+RxTests.swift */,
84E4D3951C9B011000ADFDC9 /* UISearchController+RxTests.swift */,
);
path = RxCocoaTests;
sourceTree = "<group>";
@ -2357,6 +2368,7 @@
8479BC4A1C3ACED100FB8B54 /* UIImagePickerController+Rx.swift */,
C8BCD3EC1C14B5FB005F1280 /* UIView+Rx.swift */,
7EDBAEB71C89B9B7006CBE67 /* UITabBarItem+Rx.swift */,
84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */,
);
path = iOS;
sourceTree = "<group>";
@ -2399,6 +2411,7 @@
C88254021B8A752B00B02D69 /* RxTextViewDelegateProxy.swift */,
84C225A21C33F00B008724EC /* RxTextStorageDelegateProxy.swift */,
8479BC441C3ACDA400FB8B54 /* RxImagePickerDelegateProxy.swift */,
846436E11C9AF64C0035B40D /* RxSearchControllerDelegateProxy.swift */,
);
path = Proxies;
sourceTree = "<group>";
@ -3256,8 +3269,10 @@
C8DB967E1BF7496C0084BD53 /* KVORepresentable.swift in Sources */,
C8D132441C42D15E00B59FFF /* SectionedViewDataSourceType.swift in Sources */,
C849EF8B1C3195950048AC4A /* Variable+Driver.swift in Sources */,
84E4D3921C9AFD3400ADFDC9 /* UISearchController+Rx.swift in Sources */,
C88254341B8A752B00B02D69 /* UITableView+Rx.swift in Sources */,
C88254161B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */,
846436E31C9AF65B0035B40D /* RxSearchControllerDelegateProxy.swift in Sources */,
C8C4B4A91C17722400828BD5 /* _RXObjCRuntime.m in Sources */,
C8093EEF1B8A732E0088E94D /* KVOObserver.swift in Sources */,
C882541F1B8A752B00B02D69 /* RxCollectionViewDelegateProxy.swift in Sources */,
@ -3435,6 +3450,7 @@
C835093F1C38706E0027C24C /* ElementIndexPair.swift in Sources */,
C83509381C38706E0027C24C /* NSObject+RxTests.swift in Sources */,
C83509631C38706E0027C24C /* SubjectConcurrencyTest.swift in Sources */,
84E4D3961C9B011000ADFDC9 /* UISearchController+RxTests.swift in Sources */,
C83509511C38706E0027C24C /* HistoricalSchedulerTest.swift in Sources */,
C835096B1C38706E0027C24C /* XCTest+AllTests.swift in Sources */,
C83509541C38706E0027C24C /* Observable+BindingTest.swift in Sources */,
@ -4157,6 +4173,7 @@
C8D132471C42D15E00B59FFF /* SectionedViewDataSourceType.swift in Sources */,
C849EF8E1C3195950048AC4A /* Variable+Driver.swift in Sources */,
C8F0C0161BBBFBB9001B112F /* UITableView+Rx.swift in Sources */,
84E4D3941C9AFD3600ADFDC9 /* UISearchController+Rx.swift in Sources */,
C8F0C0171BBBFBB9001B112F /* RxCollectionViewReactiveArrayDataSource.swift in Sources */,
C8C4B4AC1C17722400828BD5 /* _RXObjCRuntime.m in Sources */,
C8F0C0181BBBFBB9001B112F /* KVOObserver.swift in Sources */,
@ -4196,6 +4213,7 @@
C8F0C0341BBBFBB9001B112F /* Logging.swift in Sources */,
C8F0C0351BBBFBB9001B112F /* UICollectionView+Rx.swift in Sources */,
C8F0C0361BBBFBB9001B112F /* RxCollectionViewDataSourceType.swift in Sources */,
846436E61C9AF6670035B40D /* RxSearchControllerDelegateProxy.swift in Sources */,
C8F0C0371BBBFBB9001B112F /* NSNotificationCenter+Rx.swift in Sources */,
C8F0C0381BBBFBB9001B112F /* UITextField+Rx.swift in Sources */,
C8F0C0391BBBFBB9001B112F /* NSURLSession+Rx.swift in Sources */,
@ -4252,6 +4270,7 @@
D203C50B1BB9C53E00D02D00 /* UIScrollView+Rx.swift in Sources */,
C8C4B4AB1C17722400828BD5 /* _RXObjCRuntime.m in Sources */,
D203C50C1BB9C53E00D02D00 /* UISearchBar+Rx.swift in Sources */,
846436E51C9AF65E0035B40D /* RxSearchControllerDelegateProxy.swift in Sources */,
D2138C971BB9BEE700339B5C /* RxCLLocationManagerDelegateProxy.swift in Sources */,
D203C4FB1BB9C53700D02D00 /* RxCollectionViewDelegateProxy.swift in Sources */,
D203C5031BB9C53E00D02D00 /* UIBarButtonItem+Rx.swift in Sources */,
@ -4298,6 +4317,7 @@
D2138C8A1BB9BEBE00339B5C /* Logging.swift in Sources */,
7EDBAEBE1C89B9B7006CBE67 /* UITabBarItem+Rx.swift in Sources */,
C8DB968A1BF756F40084BD53 /* KVORepresentable+CoreGraphics.swift in Sources */,
84E4D3931C9AFD3500ADFDC9 /* UISearchController+Rx.swift in Sources */,
C8FD21B01C67E14C00863EC3 /* UIBindingObserver.swift in Sources */,
D203C50F1BB9C53E00D02D00 /* UIStepper+Rx.swift in Sources */,
);

View File

@ -0,0 +1,40 @@
//
// RxSearchControllerDelegateProxy.swift
// Rx
//
// Created by Segii Shulga on 3/17/16.
// Copyright © 2016 Krunoslav Zaher. All rights reserved.
//
#if os(iOS)
import Foundation
#if !RX_NO_MODULE
import RxSwift
#endif
import UIKit
public class RxSearchControllerDelegateProxy
: DelegateProxy
, DelegateProxyType
, UISearchControllerDelegate {
/**
For more information take a look at `DelegateProxyType`.
*/
public class func setCurrentDelegate(delegate: AnyObject?, toObject object: AnyObject) {
let searchController: UISearchController = castOrFatalError(object)
searchController.delegate = castOptionalOrFatalError(delegate)
}
/**
For more information take a look at `DelegateProxyType`.
*/
public class func currentDelegateFor(object: AnyObject) -> AnyObject? {
let searchController: UISearchController = castOrFatalError(object)
return searchController.delegate
}
}
#endif

View File

@ -0,0 +1,70 @@
//
// UISearchController+Rx.swift
// Rx
//
// Created by Segii Shulga on 3/17/16.
// Copyright © 2016 Krunoslav Zaher. All rights reserved.
//
import Foundation
#if os(iOS)
import Foundation
#if !RX_NO_MODULE
import RxSwift
#endif
import UIKit
extension UISearchController {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return proxyForObject(RxSearchControllerDelegateProxy.self, self)
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didDismiss: Observable<Void> {
return rx_delegate
.observe("didDismissSearchController:")
.map {_ in}
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didPresent: Observable<Void> {
return rx_delegate
.observe("didPresentSearchController:")
.map {_ in}
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_present: Observable<Void> {
return rx_delegate
.observe("presentSearchController:")
.map {_ in}
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_willDismiss: Observable<Void> {
return rx_delegate
.observe("willDismissSearchController:")
.map {_ in}
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_willPresent: Observable<Void> {
return rx_delegate
.observe("willPresentSearchController:")
.map {_ in}
}
}
#endif

View File

@ -49,7 +49,10 @@ import XCTest
, TestDelegateProtocol {
optional func testEventHappened(value: Int)
}
#if os(iOS)
extension RxSearchControllerDelegateProxy: TestDelegateProtocol {
}
#endif
// MARK: Tests
@ -96,6 +99,14 @@ extension DelegateProxyTest {
}
}
// MARK UISearchController
#if os(iOS)
extension DelegateProxyTest {
func test_UISearchController() {
performDelegateTest(UISearchControllerSubclass())
}
}
#endif
// MARK: Mocks
class ExtendTableViewDelegateProxy
@ -270,4 +281,20 @@ class UITextViewSubclass
.observe("testEventHappened:")
.map { a in (a[0] as! NSNumber).integerValue }
}
}
}
#if os(iOS)
class UISearchControllerSubclass
: UISearchController
, TestDelegateControl {
func doThatTest(value: Int) {
(delegate as! TestDelegateProtocol).testEventHappened?(value)
}
var test: Observable<Int> {
return rx_delegate
.observe("testEventHappened:")
.map { a in (a[0] as! NSNumber).integerValue }
}
}
#endif

View File

@ -0,0 +1,121 @@
//
// UISearchController+RxTests.swift
// Rx
//
// Created by Segii Shulga on 3/17/16.
// Copyright © 2016 Krunoslav Zaher. All rights reserved.
//
#if os(iOS)
import Foundation
import RxSwift
import RxCocoa
import XCTest
import UIKit
class UISearchController_RxTests: RxTest {
func testDidDismissSearchController() {
var completed = false
var didDismissed = false
autoreleasepool {
let searchController = UISearchController()
_ = searchController.rx_didDismiss
.subscribe(onNext: {
didDismissed = true
}, onCompleted: {
completed = true
})
searchController.delegate!.didDismissSearchController!(searchController)
}
XCTAssertTrue(completed)
XCTAssertTrue(didDismissed)
}
func testDidPresentSearchController() {
var completed = false
var didPresent = false
autoreleasepool {
let searchController = UISearchController()
_ = searchController.rx_didPresent
.subscribe(onNext: {
didPresent = true
}, onCompleted: {
completed = true
})
searchController.delegate!.didPresentSearchController!(searchController)
}
XCTAssertTrue(completed)
XCTAssertTrue(didPresent)
}
func testPresentSearchController() {
var completed = false
var presented = false
autoreleasepool {
let searchController = UISearchController()
_ = searchController.rx_present
.subscribe(onNext: {
presented = true
}, onCompleted: {
completed = true
})
searchController.delegate!.presentSearchController!(searchController)
}
XCTAssertTrue(completed)
XCTAssertTrue(presented)
}
func testWillDismissSearchController() {
var completed = false
var willDismiss = false
autoreleasepool {
let searchController = UISearchController()
_ = searchController.rx_willDismiss
.subscribe(onNext: {
willDismiss = true
}, onCompleted: {
completed = true
})
searchController.delegate!.willDismissSearchController!(searchController)
}
XCTAssertTrue(completed)
XCTAssertTrue(willDismiss)
}
func testWillPresentSearchController() {
var completed = false
var willPresent = false
autoreleasepool {
let searchController = UISearchController()
_ = searchController.rx_willPresent
.subscribe(onNext: {
willPresent = true
}, onCompleted: {
completed = true
})
searchController.delegate!.willPresentSearchController!(searchController)
}
XCTAssertTrue(completed)
XCTAssertTrue(willPresent)
}
}
#endif