Skip to content

Commit

Permalink
Merge pull request #1 from billypchan/main
Browse files Browse the repository at this point in the history
return speedAccuracy, do not return negative speed
  • Loading branch information
ezefranca authored Oct 31, 2023
2 parents 739d055 + 0b2e2dc commit d4797b1
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 14 deletions.
12 changes: 7 additions & 5 deletions Sources/SpeedManagerModule/SpeedManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public class SpeedManager : NSObject, ObservableObject, SpeedManagerTrigger {

@Published public var authorizationStatus: SpeedManagerAuthorizationStatus = .notDetermined
@Published public var speed: Double = 0

@Published public var speedAccuracy: Double = 0

private var isRequestingLocation = false

public init(_ speedUnit: SpeedManagerUnit,
Expand Down Expand Up @@ -69,7 +70,7 @@ extension SpeedManager: CLLocationManagerDelegate {
case .authorizedWhenInUse,
.authorizedAlways:
authorizationStatus = .authorized
locationManager.requestLocation()
locationManager.requestLocation()
break

case .notDetermined:
Expand All @@ -87,10 +88,11 @@ extension SpeedManager: CLLocationManagerDelegate {
public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

let currentSpeed = locations.last?.speed ?? 0
let calculatedSpeed = currentSpeed * self.speedUnit.rawValue
self.speed = abs(calculatedSpeed)
self.delegate?.speedManager(self, didUpdateSpeed: calculatedSpeed)
speed = currentSpeed >= 0 ? currentSpeed * speedUnit.rawValue : .nan
speedAccuracy = locations.last?.speedAccuracy ?? .nan

self.delegate?.speedManager(self, didUpdateSpeed: speed, speedAccuracy: speedAccuracy)

self.locationManager.requestLocation()
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/SpeedManagerModule/SpeedManagerDelegate.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation

public protocol SpeedManagerDelegate {
func speedManager(_ manager: SpeedManager, didUpdateSpeed speed: Double)
func speedManager(_ manager: SpeedManager, didUpdateSpeed speed: Double, speedAccuracy: Double)
func speedManager(_ manager: SpeedManager, didFailWithError error: Error)
}
35 changes: 27 additions & 8 deletions Tests/SpeedManagerModuleTests/SpeedManagerModuleTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,43 @@ import XCTest
@testable import SpeedManagerModule

final class SpeedManagerModuleTests: XCTestCase {

var manager: SpeedManager?

func test_speed() throws {
let mockDelegate = SpeedManagerDelegateMock(testCase: self)
manager = SpeedManager(.kilometersPerHour, trigger: self)
manager?.delegate = mockDelegate

mockDelegate.expectSpeed()
manager?.startUpdatingSpeed()

waitForExpectations(timeout: 1)

let result = try XCTUnwrap(mockDelegate.speed)
XCTAssertEqual(result, 12.2)
}

func test_speedAccuracy() throws {
let mockDelegate = SpeedManagerDelegateMock(testCase: self)
manager = SpeedManager(.kilometersPerHour, trigger: self)
manager?.delegate = mockDelegate

mockDelegate.expectSpeed()
manager?.startUpdatingSpeed()

waitForExpectations(timeout: 1)

XCTAssertEqual(mockDelegate.speedAccuracy, 1)
}
}

extension SpeedManagerModuleTests: SpeedManagerTrigger {
func startMonitoringSpeed() {
guard let manager = manager else { return }
self.manager?.delegate?.speedManager(manager,
didUpdateSpeed: 12.2)
didUpdateSpeed: 12.2,
speedAccuracy: 1)
}

func startUpdatingSpeed() {
Expand All @@ -35,16 +49,21 @@ extension SpeedManagerModuleTests: SpeedManagerTrigger {
class SpeedManagerDelegateMock: SpeedManagerDelegate {

var speed: Double?
var speedAccuracy: Double?

private var expectation: XCTestExpectation?
private let testCase: XCTestCase

var didUpdateSpeed: Bool = false
var didFailWithError: Bool = false

func speedManager(_ manager: SpeedManagerModule.SpeedManager, didUpdateSpeed speed: Double) {
func speedManager(_ manager: SpeedManagerModule.SpeedManager, didUpdateSpeed speed: Double, speedAccuracy: Double) {
didUpdateSpeed = true

if expectation != nil { self.speed = speed }
if expectation != nil {
self.speed = speed
self.speedAccuracy = speedAccuracy
}
expectation?.fulfill()
expectation = nil
}
Expand Down

0 comments on commit d4797b1

Please sign in to comment.