429 lines
12 KiB
Swift
429 lines
12 KiB
Swift
//
|
|
// CLLocationManager+RxTests.swift
|
|
// RxTests
|
|
//
|
|
// Created by Krunoslav Zaher on 12/13/15.
|
|
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
|
|
//
|
|
|
|
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)
|
|
}
|
|
|
|
func testDidFinishDeferredUpdatesWithError_noError() {
|
|
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: nil)
|
|
}
|
|
|
|
XCTAssertEqual(error, nil)
|
|
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, for: 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, monitoringDidFailFor: 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, monitoringDidFailFor: 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, didStartMonitoringFor: targetValue)
|
|
}
|
|
|
|
XCTAssertEqual(value, targetValue)
|
|
XCTAssertTrue(completed)
|
|
}
|
|
|
|
#endif
|
|
|
|
#if os(iOS)
|
|
func testDidRangeBeaconsInRegion() {
|
|
|
|
var completed = false
|
|
var value: ([CLBeacon], CLBeaconRegion)?
|
|
|
|
let targetValue = (
|
|
// [CLBeacon()]
|
|
// TODO: This crashes on Xcode 8.0 beta version
|
|
// this is temporary workaround
|
|
[] as [CLBeacon],
|
|
CLBeaconRegion(proximityUUID: UUID(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, in: 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: UUID(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, rangingBeaconsDidFailFor: 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, didChangeAuthorization:targetAuthorizationStatus)
|
|
}
|
|
|
|
XCTAssertEqual(authorizationStatus, targetAuthorizationStatus)
|
|
XCTAssertTrue(completed)
|
|
}
|
|
}
|