Files
jayanezj 3f351296b8 feat: add native local location capture (#4)
Add explicit permission handling, independent continuous and single capture,
location status and deterministic CI coverage.

Final decisions and validation:
https://github.com/jayanezj/traccar-client-macos/issues/4#issuecomment-6399189792
2026-10-25 15:58:05 +01:00

48 lines
2.2 KiB
Swift

import CoreLocation
import Foundation
import Testing
struct LocationFixTests {
@Test func preservesOriginalFieldsAndOmitsInvalidOptionalValues() throws {
let timestamp = Date(timeIntervalSince1970: 1_500_000_000)
let location = CLLocation(
coordinate: CLLocationCoordinate2D(latitude: 1, longitude: 2), altitude: 42,
horizontalAccuracy: 8_000, verticalAccuracy: -1, course: -1, speed: -1, timestamp: timestamp
)
let fix = try #require(LocationFix(location))
#expect(fix.timestamp == timestamp && fix.horizontalAccuracy == 8_000)
#expect(fix.latitude == 1 && fix.longitude == 2)
#expect(fix.altitude == nil && fix.speed == nil && fix.course == nil)
}
@Test func preservesValidOptionalFields() throws {
let location = CLLocation(
coordinate: CLLocationCoordinate2D(latitude: 1, longitude: 2), altitude: 42,
horizontalAccuracy: 100, verticalAccuracy: 5, course: 90, speed: 0,
timestamp: Date(timeIntervalSince1970: 1_700_000_000)
)
let fix = try #require(LocationFix(location))
#expect(fix.altitude == 42 && fix.speed == 0 && fix.course == 90)
}
@Test func invalidCoordinatesOrInvalidFixAccuracyAreNotLocations() {
let timestamp = Date(timeIntervalSince1970: 1_700_000_000)
for (latitude, accuracy) in [(91.0, 100.0), (1, -1), (1, Double.nan)] {
let location = CLLocation(
coordinate: CLLocationCoordinate2D(latitude: latitude, longitude: 2), altitude: 0,
horizontalAccuracy: accuracy, verticalAccuracy: -1, timestamp: timestamp
)
#expect(LocationFix(location) == nil)
}
}
@MainActor @Test func nativeAccuracyMappingAndAuthorizationUseMacAPIs() {
#expect(CoreLocationProvider.desiredAccuracy(.medium) == kCLLocationAccuracyHundredMeters)
#expect(CoreLocationProvider.desiredAccuracy(.low) == kCLLocationAccuracyKilometer)
#expect(CoreLocationProvider.desiredAccuracy(.high) == kCLLocationAccuracyBest)
#expect(LocationPermission(.authorizedAlways) == .authorized)
#expect(LocationPermission(.denied) == .denied)
#expect(LocationPermission(.restricted) == .restricted)
}
}