Polish for `CLLocationManager` interface and adds unit tests.
This commit is contained in:
parent
38ba177e8f
commit
c337e642dc
|
|
@ -28,32 +28,36 @@ extension CLLocationManager {
|
|||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didUpdateLocations: Observable<[CLLocation]!> {
|
||||
public var rx_didUpdateLocations: Observable<[CLLocation]> {
|
||||
return rx_delegate.observe("locationManager:didUpdateLocations:")
|
||||
.map { a in
|
||||
return a[1] as? [CLLocation]
|
||||
return try castOrThrow([CLLocation].self, a[1])
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didFailWithError: Observable<NSError!> {
|
||||
public var rx_didFailWithError: Observable<NSError> {
|
||||
return rx_delegate.observe("locationManager:didFailWithError:")
|
||||
.map { a in
|
||||
return a[1] as? NSError
|
||||
return try castOrThrow(NSError.self, a[1])
|
||||
}
|
||||
}
|
||||
|
||||
#if os(iOS) || os(watchOS) || os(OSX)
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didFinishDeferredUpdatesWithError: Observable<NSError!> {
|
||||
public var rx_didFinishDeferredUpdatesWithError: Observable<NSError> {
|
||||
return rx_delegate.observe("locationManager:didFinishDeferredUpdatesWithError:")
|
||||
.map { a in
|
||||
return a[1] as? NSError
|
||||
return try castOrThrow(NSError.self, a[1])
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if os(iOS)
|
||||
|
||||
// MARK: Pausing Location Updates
|
||||
|
||||
|
|
@ -82,92 +86,102 @@ extension CLLocationManager {
|
|||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
#if os(iOS) || os(OSX)
|
||||
public var rx_didUpdateHeading: Observable<CLHeading!> {
|
||||
public var rx_didUpdateHeading: Observable<CLHeading> {
|
||||
return rx_delegate.observe("locationManager:didUpdateHeading:")
|
||||
.map { a in
|
||||
return a[1] as? CLHeading
|
||||
return try castOrThrow(CLHeading.self, a[1])
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// MARK: Responding to Region Events
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didEnterRegion: Observable<CLRegion!> {
|
||||
public var rx_didEnterRegion: Observable<CLRegion> {
|
||||
return rx_delegate.observe("locationManager:didEnterRegion:")
|
||||
.map { a in
|
||||
return a[1] as? CLRegion
|
||||
return try castOrThrow(CLRegion.self, a[1])
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didExitRegion: Observable<CLRegion!> {
|
||||
public var rx_didExitRegion: Observable<CLRegion> {
|
||||
return rx_delegate.observe("locationManager:didExitRegion:")
|
||||
.map { a in
|
||||
return a[1] as? CLRegion
|
||||
return try castOrThrow(CLRegion.self, a[1])
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
#if os(iOS) || os(OSX)
|
||||
@available(OSX 10.10, *)
|
||||
public var rx_didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion!)> {
|
||||
return rx_delegate.observe("locationManager:didDetermineState:forRegion:")
|
||||
.map { a in
|
||||
let stateNumber = a[1] as! NSNumber
|
||||
return (state: CLRegionState(rawValue: stateNumber.integerValue) ?? CLRegionState.Unknown, region: a[2] as? CLRegion)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if os(iOS) || os(OSX)
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_monitoringDidFailForRegionWithError: Observable<(region: CLRegion!, error: NSError!)> {
|
||||
return rx_delegate.observe("locationManager:monitoringDidFailForRegion:withError:")
|
||||
@available(OSX 10.10, *)
|
||||
public var rx_didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {
|
||||
return rx_delegate.observe("locationManager:didDetermineState:forRegion:")
|
||||
.map { a in
|
||||
return (region: a[1] as? CLRegion, error: a[2] as? NSError)
|
||||
let stateNumber = try castOrThrow(NSNumber.self, a[1])
|
||||
let state = CLRegionState(rawValue: stateNumber.integerValue) ?? CLRegionState.Unknown
|
||||
let region = try castOrThrow(CLRegion.self, a[2])
|
||||
return (state: state, region: region)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didStartMonitoringForRegion: Observable<CLRegion!> {
|
||||
return rx_delegate.observe("locationManager:didStartMonitoringForRegion:")
|
||||
public var rx_monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {
|
||||
return rx_delegate.observe("locationManager:monitoringDidFailForRegion:withError:")
|
||||
.map { a in
|
||||
return a[1] as? CLRegion
|
||||
let region = try castOptionalOrThrow(CLRegion.self, a[1])
|
||||
let error = try castOrThrow(NSError.self, a[2])
|
||||
return (region: region, error: error)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didStartMonitoringForRegion: Observable<CLRegion> {
|
||||
return rx_delegate.observe("locationManager:didStartMonitoringForRegion:")
|
||||
.map { a in
|
||||
return try castOrThrow(CLRegion.self, a[1])
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if os(iOS)
|
||||
|
||||
// MARK: Responding to Ranging Events
|
||||
|
||||
#if os(iOS)
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon]!, region: CLBeaconRegion!)> {
|
||||
public var rx_didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {
|
||||
return rx_delegate.observe("locationManager:didRangeBeacons:inRegion:")
|
||||
.map { a in
|
||||
return (beacons: a[1] as? [CLBeacon], region: a[2] as? CLBeaconRegion)
|
||||
let beacons = try castOrThrow([CLBeacon].self, a[1])
|
||||
let region = try castOrThrow(CLBeaconRegion.self, a[2])
|
||||
return (beacons: beacons, region: region)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion!, error: NSError!)> {
|
||||
public var rx_rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {
|
||||
return rx_delegate.observe("locationManager:rangingBeaconsDidFailForRegion:withError:")
|
||||
.map { a in
|
||||
return (region: a[1] as? CLBeaconRegion, error: a[2] as? NSError)
|
||||
let region = try castOrThrow(CLBeaconRegion.self, a[1])
|
||||
let error = try castOrThrow(NSError.self, a[2])
|
||||
return (region: region, error: error)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -177,25 +191,25 @@ extension CLLocationManager {
|
|||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
@available(iOS 8.0, *)
|
||||
public var rx_didVisit: Observable<CLVisit!> {
|
||||
public var rx_didVisit: Observable<CLVisit> {
|
||||
return rx_delegate.observe("locationManager:didVisit:")
|
||||
.map { a in
|
||||
return a[1] as? CLVisit
|
||||
return try castOrThrow(CLVisit.self, a[1])
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// MARK: Responding to Authorization Changes
|
||||
|
||||
/**
|
||||
Reactive wrapper for `delegate` message.
|
||||
*/
|
||||
public var rx_didChangeAuthorizationStatus: Observable<CLAuthorizationStatus?> {
|
||||
public var rx_didChangeAuthorizationStatus: Observable<CLAuthorizationStatus> {
|
||||
return rx_delegate.observe("locationManager:didChangeAuthorizationStatus:")
|
||||
.map { a in
|
||||
let number = a[1] as! NSNumber
|
||||
return CLAuthorizationStatus(rawValue: Int32(number.integerValue))
|
||||
let number = try castOrThrow(NSNumber.self, a[1])
|
||||
return CLAuthorizationStatus(rawValue: Int32(number.integerValue)) ?? .NotDetermined
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,10 @@ public enum RxCocoaError
|
|||
Invalid object on key path.
|
||||
*/
|
||||
case InvalidObjectOnKeyPath(object: AnyObject, sourceObject: AnyObject, propertyName: String)
|
||||
/**
|
||||
Casting error.
|
||||
*/
|
||||
case CastingError(object: AnyObject, targetType: Any.Type)
|
||||
}
|
||||
|
||||
public extension RxCocoaError {
|
||||
|
|
@ -58,6 +62,8 @@ public extension RxCocoaError {
|
|||
return "Object `\(object)` dosn't have a property named `\(propertyName)`"
|
||||
case let .InvalidObjectOnKeyPath(object, sourceObject, propertyName):
|
||||
return "Unobservable object `\(object)` was observed as `\(propertyName)` of `\(sourceObject)`"
|
||||
case .CastingError(let object, let targetType):
|
||||
return "Error casting `\(object)` to `\(targetType)`"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -80,11 +86,11 @@ func bindingErrorToVariable(error: ErrorType) {
|
|||
#endif
|
||||
}
|
||||
|
||||
@noreturn func rxAbstractMethodWithMessage<T>(message: String) -> T {
|
||||
@noreturn func rxAbstractMethodWithMessage(message: String) {
|
||||
rxFatalError(message)
|
||||
}
|
||||
|
||||
@noreturn func rxAbstractMethod<T>() -> T {
|
||||
@noreturn func rxAbstractMethod() {
|
||||
rxFatalError("Abstract method")
|
||||
}
|
||||
|
||||
|
|
@ -97,6 +103,26 @@ func castOptionalOrFatalError<T>(value: AnyObject?) -> T? {
|
|||
return v
|
||||
}
|
||||
|
||||
func castOrThrow<T>(resultType: T.Type, _ object: AnyObject) throws -> T {
|
||||
guard let returnValue = object as? T else {
|
||||
throw RxCocoaError.CastingError(object: object, targetType: resultType)
|
||||
}
|
||||
|
||||
return returnValue
|
||||
}
|
||||
|
||||
func castOptionalOrThrow<T>(resultType: T.Type, _ object: AnyObject) throws -> T? {
|
||||
if NSNull().isEqual(object) {
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let returnValue = object as? T else {
|
||||
throw RxCocoaError.CastingError(object: object, targetType: resultType)
|
||||
}
|
||||
|
||||
return returnValue
|
||||
}
|
||||
|
||||
func castOrFatalError<T>(value: AnyObject!, message: String) -> T {
|
||||
let maybeResult: T? = value as? T
|
||||
guard let result = maybeResult else {
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ class _RxCollectionViewReactiveArrayDataSource: NSObject, UICollectionViewDataSo
|
|||
}
|
||||
|
||||
func _collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
|
||||
return rxAbstractMethod()
|
||||
rxAbstractMethod()
|
||||
}
|
||||
|
||||
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ class _RxTableViewReactiveArrayDataSource: NSObject, UITableViewDataSource {
|
|||
}
|
||||
|
||||
func _tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
|
||||
return rxAbstractMethod()
|
||||
rxAbstractMethod()
|
||||
}
|
||||
|
||||
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
|
||||
|
|
|
|||
|
|
@ -20,12 +20,12 @@ class CollectionViewDataSourceNotSet
|
|||
: NSObject
|
||||
, UICollectionViewDataSource {
|
||||
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||||
return rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
}
|
||||
|
||||
// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:
|
||||
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
|
||||
return rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,15 +20,15 @@ class TableViewDataSourceNotSet
|
|||
: NSObject
|
||||
, UITableViewDataSource {
|
||||
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
|
||||
return rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
}
|
||||
|
||||
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
return rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
}
|
||||
|
||||
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
|
||||
return rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
rxAbstractMethodWithMessage(dataSourceNotSet)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -105,6 +105,11 @@
|
|||
"filename" : "Icon-76@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "83.5x83.5",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "24x24",
|
||||
"idiom" : "watch",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,403 @@
|
|||
//
|
||||
// CLLocationManager+RxTests.swift
|
||||
// RxTests
|
||||
//
|
||||
// Created by Krunoslav Zaher on 12/13/15.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import RxSwift
|
||||
import RxCocoa
|
||||
import XCTest
|
||||
import CoreLocation
|
||||
|
||||
class CLLocationManagerTests : RxTest {
|
||||
|
||||
}
|
||||
|
||||
// delegate methods
|
||||
|
||||
extension CLLocationManagerTests {
|
||||
func testDidUpdateLocations() {
|
||||
var completed = false
|
||||
var location: CLLocation?
|
||||
|
||||
let targetLocation = CLLocation(latitude: 90, longitude: 180)
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didUpdateLocations.subscribe(onNext: { l in
|
||||
location = l[0]
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didUpdateLocations: [targetLocation])
|
||||
}
|
||||
|
||||
XCTAssertEqual(location?.coordinate.latitude, targetLocation.coordinate.latitude)
|
||||
XCTAssertEqual(location?.coordinate.longitude, targetLocation.coordinate.longitude)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testDidFailWithError() {
|
||||
var completed = false
|
||||
var error: NSError?
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didFailWithError.subscribe(onNext: { e in
|
||||
error = e
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didFailWithError: testError)
|
||||
}
|
||||
|
||||
XCTAssertEqual(error, testError)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
#if os(iOS) || os(OSX)
|
||||
|
||||
func testDidFinishDeferredUpdatesWithError() {
|
||||
var completed = false
|
||||
var error: NSError?
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
|
||||
error = e
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didFinishDeferredUpdatesWithError: testError)
|
||||
}
|
||||
|
||||
XCTAssertEqual(error, testError)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if os(iOS)
|
||||
|
||||
func testDidPauseLocationUpdates() {
|
||||
var completed = false
|
||||
var updates: ()?
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didPauseLocationUpdates.subscribe(onNext: { u in
|
||||
updates = u
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManagerDidPauseLocationUpdates!(manager)
|
||||
}
|
||||
|
||||
XCTAssertTrue(updates != nil)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testDidResumeLocationUpdates() {
|
||||
var completed = false
|
||||
var updates: ()?
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didResumeLocationUpdates.subscribe(onNext: { _ in
|
||||
updates = ()
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManagerDidResumeLocationUpdates!(manager)
|
||||
}
|
||||
|
||||
XCTAssertTrue(updates != nil)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testDidUpdateHeading() {
|
||||
var completed = false
|
||||
var heading: CLHeading?
|
||||
|
||||
let targetHeading = CLHeading()
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didUpdateHeading.subscribe(onNext: { n in
|
||||
heading = n
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didUpdateHeading: targetHeading)
|
||||
}
|
||||
|
||||
XCTAssertEqual(heading, targetHeading)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testDidEnterRegion() {
|
||||
var completed = false
|
||||
var value: CLRegion?
|
||||
|
||||
let targetValue = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 90, longitude: 180), radius: 10, identifier: "unit tests in cloud")
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didEnterRegion.subscribe(onNext: { n in
|
||||
value = n
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didEnterRegion: targetValue)
|
||||
}
|
||||
|
||||
XCTAssertEqual(value, targetValue)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testDidExitRegion() {
|
||||
var completed = false
|
||||
var value: CLRegion?
|
||||
|
||||
let targetValue = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 90, longitude: 180), radius: 10, identifier: "unit tests in cloud")
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didExitRegion.subscribe(onNext: { n in
|
||||
value = n
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didExitRegion: targetValue)
|
||||
}
|
||||
|
||||
XCTAssertEqual(value, targetValue)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if os(iOS) || os(OSX)
|
||||
|
||||
func testDidDetermineStateForRegion() {
|
||||
var completed = false
|
||||
var value: (CLRegionState, CLRegion)?
|
||||
|
||||
let targetValue = (CLRegionState.Inside, CLCircularRegion(center: CLLocationCoordinate2D(latitude: 90, longitude: 180), radius: 10, identifier: "unit tests in cloud"))
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didDetermineStateForRegion.subscribe(onNext: { n in
|
||||
value = (n.state, n.region)
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didDetermineState: targetValue.0, forRegion: targetValue.1)
|
||||
}
|
||||
|
||||
XCTAssertEqual(value?.0, targetValue.0)
|
||||
XCTAssertEqual(value?.1, targetValue.1)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testMonitorOfKnownRegionDidFailWithError() {
|
||||
var completed = false
|
||||
var region: CLRegion?
|
||||
var error: NSError?
|
||||
|
||||
let targetRegion = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 90, longitude: 180), radius: 10, identifier: "unit tests in cloud")
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_monitoringDidFailForRegionWithError.subscribe(onNext: { l in
|
||||
region = l.region
|
||||
error = l.error
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, monitoringDidFailForRegion: targetRegion, withError: testError)
|
||||
}
|
||||
|
||||
XCTAssertEqual(targetRegion, region)
|
||||
XCTAssertEqual(error, testError)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testMonitorOfUnknownRegionDidFailWithError() {
|
||||
var completed = false
|
||||
var region: CLRegion?
|
||||
var error: NSError?
|
||||
|
||||
let targetRegion: CLRegion? = nil
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_monitoringDidFailForRegionWithError.subscribe(onNext: { l in
|
||||
region = l.region
|
||||
error = l.error
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, monitoringDidFailForRegion: targetRegion, withError: testError)
|
||||
}
|
||||
|
||||
XCTAssertEqual(targetRegion, region)
|
||||
XCTAssertEqual(error, testError)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testStartMonitoringForRegion() {
|
||||
var completed = false
|
||||
var value: CLRegion?
|
||||
|
||||
let targetValue = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 90, longitude: 180), radius: 10, identifier: "unit tests in cloud")
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didStartMonitoringForRegion.subscribe(onNext: { n in
|
||||
value = n
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didStartMonitoringForRegion: targetValue)
|
||||
}
|
||||
|
||||
XCTAssertEqual(value, targetValue)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if os(iOS)
|
||||
func testDidRangeBeaconsInRegion() {
|
||||
var completed = false
|
||||
var value: ([CLBeacon], CLBeaconRegion)?
|
||||
|
||||
let targetValue = (
|
||||
[CLBeacon()],
|
||||
CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "68753A44-4D6F-1226-9C60-0050E4C00067")!, identifier: "1231231")
|
||||
)
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didRangeBeaconsInRegion.subscribe(onNext: { n in
|
||||
value = n
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didRangeBeacons: targetValue.0, inRegion: targetValue.1)
|
||||
}
|
||||
|
||||
XCTAssertEqual(value!.0, targetValue.0)
|
||||
XCTAssertEqual(value!.1, targetValue.1)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testRangingBeaconsDidFailForRegionWithError() {
|
||||
var completed = false
|
||||
var value: (CLBeaconRegion, NSError)?
|
||||
|
||||
let targetValue = (
|
||||
CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "68753A44-4D6F-1226-9C60-0050E4C00067")!, identifier: "1231231"),
|
||||
testError
|
||||
)
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_rangingBeaconsDidFailForRegionWithError.subscribe(onNext: { n in
|
||||
value = n
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, rangingBeaconsDidFailForRegion: targetValue.0, withError: targetValue.1)
|
||||
}
|
||||
|
||||
XCTAssertEqual(value!.0, targetValue.0)
|
||||
XCTAssertEqual(value!.1, targetValue.1)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
|
||||
func testDidVisit() {
|
||||
var completed = false
|
||||
var value: CLVisit?
|
||||
|
||||
let targetValue = (
|
||||
CLVisit()
|
||||
)
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didVisit.subscribe(onNext: { n in
|
||||
value = n
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didVisit: targetValue)
|
||||
}
|
||||
|
||||
XCTAssertEqual(value, targetValue)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
#endif
|
||||
|
||||
func testDidChangeAuthorizationStatus() {
|
||||
var completed = false
|
||||
var authorizationStatus: CLAuthorizationStatus?
|
||||
|
||||
#if os(tvOS)
|
||||
let targetAuthorizationStatus = CLAuthorizationStatus.AuthorizedAlways
|
||||
#elseif os(iOS)
|
||||
let targetAuthorizationStatus = CLAuthorizationStatus.AuthorizedAlways
|
||||
#else
|
||||
let targetAuthorizationStatus = CLAuthorizationStatus.Authorized
|
||||
#endif
|
||||
|
||||
autoreleasepool {
|
||||
let manager = CLLocationManager()
|
||||
|
||||
_ = manager.rx_didChangeAuthorizationStatus.subscribe(onNext: { status in
|
||||
authorizationStatus = status
|
||||
}, onCompleted: {
|
||||
completed = true
|
||||
})
|
||||
|
||||
manager.delegate!.locationManager!(manager, didChangeAuthorizationStatus:targetAuthorizationStatus)
|
||||
}
|
||||
|
||||
XCTAssertEqual(authorizationStatus, targetAuthorizationStatus)
|
||||
XCTAssertTrue(completed)
|
||||
}
|
||||
}
|
||||
|
|
@ -124,6 +124,9 @@
|
|||
C8BCD4001C14BCAD005F1280 /* NSLayoutConstraint+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8BCD3FD1C14BCAD005F1280 /* NSLayoutConstraint+RxTests.swift */; };
|
||||
C8CDD7D41B52BEC40043F0C5 /* Observable+BlockingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8CDD7D31B52BEC40043F0C5 /* Observable+BlockingTest.swift */; };
|
||||
C8CDD7D51B52BEC40043F0C5 /* Observable+BlockingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8CDD7D31B52BEC40043F0C5 /* Observable+BlockingTest.swift */; };
|
||||
C8CF47661C1DA04700C3FA6E /* CLLocationManager+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8CF47651C1DA04700C3FA6E /* CLLocationManager+RxTests.swift */; };
|
||||
C8CF47671C1DA04700C3FA6E /* CLLocationManager+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8CF47651C1DA04700C3FA6E /* CLLocationManager+RxTests.swift */; };
|
||||
C8CF47681C1DA04700C3FA6E /* CLLocationManager+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8CF47651C1DA04700C3FA6E /* CLLocationManager+RxTests.swift */; };
|
||||
C8E381231B2063CC008CDC33 /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E381221B2063CC008CDC33 /* Observable+Extensions.swift */; };
|
||||
C8E381281B207D03008CDC33 /* PrimitiveHotObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E381271B207D03008CDC33 /* PrimitiveHotObservable.swift */; };
|
||||
C8E381291B207D03008CDC33 /* PrimitiveHotObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E381271B207D03008CDC33 /* PrimitiveHotObservable.swift */; };
|
||||
|
|
@ -258,6 +261,7 @@
|
|||
C8BCD3FB1C14B914005F1280 /* NSView+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSView+RxTests.swift"; sourceTree = "<group>"; };
|
||||
C8BCD3FD1C14BCAD005F1280 /* NSLayoutConstraint+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraint+RxTests.swift"; sourceTree = "<group>"; };
|
||||
C8CDD7D31B52BEC40043F0C5 /* Observable+BlockingTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "Observable+BlockingTest.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
|
||||
C8CF47651C1DA04700C3FA6E /* CLLocationManager+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CLLocationManager+RxTests.swift"; sourceTree = "<group>"; };
|
||||
C8E381221B2063CC008CDC33 /* Observable+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+Extensions.swift"; sourceTree = "<group>"; };
|
||||
C8E381271B207D03008CDC33 /* PrimitiveHotObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrimitiveHotObservable.swift; sourceTree = "<group>"; };
|
||||
C8E3812A1B2083C2008CDC33 /* PrimitiveMockObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrimitiveMockObserver.swift; sourceTree = "<group>"; };
|
||||
|
|
@ -375,6 +379,7 @@
|
|||
C8BCD3F81C14B901005F1280 /* UIView+RxTests.swift */,
|
||||
C8BCD3FB1C14B914005F1280 /* NSView+RxTests.swift */,
|
||||
C8BCD3FD1C14BCAD005F1280 /* NSLayoutConstraint+RxTests.swift */,
|
||||
C8CF47651C1DA04700C3FA6E /* CLLocationManager+RxTests.swift */,
|
||||
);
|
||||
path = RxCocoaTests;
|
||||
sourceTree = SOURCE_ROOT;
|
||||
|
|
@ -634,6 +639,7 @@
|
|||
C811085B1AF50E2A001C13E4 /* Subscription.swift in Sources */,
|
||||
C80DDEDC1BCE9A03006A1832 /* Driver+Test.swift in Sources */,
|
||||
C81108531AF50E2A001C13E4 /* MySubject.swift in Sources */,
|
||||
C8CF47661C1DA04700C3FA6E /* CLLocationManager+RxTests.swift in Sources */,
|
||||
C81108611AF50E2A001C13E4 /* Observable+BindingTest.swift in Sources */,
|
||||
C69B65001BA88FAC00A7FA73 /* ObserverTests.swift in Sources */,
|
||||
C85F4E431B7F70EA00A866C7 /* CompositeObserverTest.swift in Sources */,
|
||||
|
|
@ -707,6 +713,7 @@
|
|||
C88BB89A1B07E64B0064D411 /* NSNotificationCenterTests.swift in Sources */,
|
||||
C88BB89B1B07E64B0064D411 /* Observable+MultipleTest+CombineLatest.swift in Sources */,
|
||||
C8941BDA1BD4F58C00A0E874 /* BackgroundThreadPrimitiveHotObservable.swift in Sources */,
|
||||
C8CF47671C1DA04700C3FA6E /* CLLocationManager+RxTests.swift in Sources */,
|
||||
C88BB89C1B07E64B0064D411 /* ConcurrencyTest.swift in Sources */,
|
||||
C88BB89D1B07E64B0064D411 /* TestObserver.swift in Sources */,
|
||||
C87EC3001C131A940060B19B /* DelegateProxyTest+Cocoa.swift in Sources */,
|
||||
|
|
@ -771,6 +778,7 @@
|
|||
C80DDEDE1BCE9A03006A1832 /* Driver+Test.swift in Sources */,
|
||||
D2EBEB641BB9B7EF003A27DC /* AssumptionsTest.swift in Sources */,
|
||||
D2EBEB6A1BB9B7EF003A27DC /* DisposableTest.swift in Sources */,
|
||||
C8CF47681C1DA04700C3FA6E /* CLLocationManager+RxTests.swift in Sources */,
|
||||
D2EBEB791BB9B7FD003A27DC /* RxTest.swift in Sources */,
|
||||
D2EBEB6E1BB9B7EF003A27DC /* Observable+ConcurrencyTest.swift in Sources */,
|
||||
D2EBEB541BB9B7CC003A27DC /* HotObservable.swift in Sources */,
|
||||
|
|
|
|||
|
|
@ -5,6 +5,22 @@
|
|||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "NO"
|
||||
buildForArchiving = "NO"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "D2EBEB481BB9B7AE003A27DC"
|
||||
BuildableName = "RxTests.xctest"
|
||||
BlueprintName = "RxTests-tvOS"
|
||||
ReferencedContainer = "container:RxTests.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
|
|
@ -36,6 +52,15 @@
|
|||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "D2EBEB481BB9B7AE003A27DC"
|
||||
BuildableName = "RxTests.xctest"
|
||||
BlueprintName = "RxTests-tvOS"
|
||||
ReferencedContainer = "container:RxTests.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
|
|
@ -45,6 +70,15 @@
|
|||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "D2EBEB481BB9B7AE003A27DC"
|
||||
BuildableName = "RxTests.xctest"
|
||||
BlueprintName = "RxTests-tvOS"
|
||||
ReferencedContainer = "container:RxTests.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
|
|
|
|||
Loading…
Reference in New Issue