From 121632936b521d2527ebe1e02ee30f93806e9016 Mon Sep 17 00:00:00 2001 From: Greg Bolsinga Date: Tue, 22 Apr 2025 09:57:01 -0700 Subject: [PATCH] Add CustomStringConvertibles - Just take the `CustomStringConvertible` changes from #83 --- Sources/MapLibreSwiftUI/MapView.swift | 11 +++++++++- .../MapLibreSwiftUI/MapViewCoordinator.swift | 21 +++++++++++++++++++ .../Models/MapCamera/MapViewCamera.swift | 6 +++++- .../Models/Gesture/MapGestureTests.swift | 4 ---- .../MapViewCameraTests/testBoundingBox.1.txt | 6 +++--- .../MapViewCameraTests/testCenterCamera.1.txt | 4 ++-- .../testTrackUserLocationWithCourse.1.txt | 6 +++--- .../testTrackUserLocationWithHeading.1.txt | 6 +++--- .../testTrackingUserLocation.1.txt | 6 +++--- 9 files changed, 50 insertions(+), 20 deletions(-) diff --git a/Sources/MapLibreSwiftUI/MapView.swift b/Sources/MapLibreSwiftUI/MapView.swift index 02a8c5f..7fb338b 100644 --- a/Sources/MapLibreSwiftUI/MapView.swift +++ b/Sources/MapLibreSwiftUI/MapView.swift @@ -4,11 +4,20 @@ import MapLibreSwiftDSL import SwiftUI /// Identifies the activity this ``MapView`` is being used for. Useful for debugging purposes. -public enum MapActivity: Int { +public enum MapActivity: Int, CustomStringConvertible { /// Navigation in a standard window. Default. case standard = 0 /// Navigation in a CarPlay template. case carplay = 2025 + + public var description: String { + switch self { + case .standard: + "standard" + case .carplay: + "carplay" + } + } } public struct MapView: UIViewControllerRepresentable { diff --git a/Sources/MapLibreSwiftUI/MapViewCoordinator.swift b/Sources/MapLibreSwiftUI/MapViewCoordinator.swift index f07a779..9240b05 100644 --- a/Sources/MapLibreSwiftUI/MapViewCoordinator.swift +++ b/Sources/MapLibreSwiftUI/MapViewCoordinator.swift @@ -2,6 +2,27 @@ import Foundation import MapLibre import MapLibreSwiftDSL +extension MLNCameraChangeReason: @retroactive CustomStringConvertible { + private static let descriptions: [(Self, String)] = [ + (.programmatic, "programmatic"), + (.resetNorth, "resetNorth"), + (.gesturePan, "gesturePan"), + (.gesturePinch, "gesturePinch"), + (.gestureRotate, "gestureRotate"), + (.gestureZoomIn, "gestureZoomIn"), + (.gestureZoomOut, "gestureZoomOut"), + (.gestureOneFingerZoom, "gestureOneFingerZoom"), + (.gestureTilt, "gestureTilt"), + (.transitionCancelled, "transitionCancelled"), + ] + + public var description: String { + var names = Self.descriptions.filter { contains($0.0) }.map(\.1) + if names.isEmpty { names = ["none"] } + return names.joined(separator: ",") + } +} + public class MapViewCoordinator: NSObject, @preconcurrency MLNMapViewDelegate { // This must be weak, the UIViewRepresentable owns the MLNMapView. diff --git a/Sources/MapLibreSwiftUI/Models/MapCamera/MapViewCamera.swift b/Sources/MapLibreSwiftUI/Models/MapCamera/MapViewCamera.swift index ac0e779..50cee91 100644 --- a/Sources/MapLibreSwiftUI/Models/MapCamera/MapViewCamera.swift +++ b/Sources/MapLibreSwiftUI/Models/MapCamera/MapViewCamera.swift @@ -5,7 +5,7 @@ import MapLibre /// The SwiftUI MapViewCamera. /// /// This manages the camera state within the MapView. -public struct MapViewCamera: Hashable, Equatable, Sendable { +public struct MapViewCamera: Hashable, Equatable, Sendable, CustomStringConvertible { public enum Defaults { public static let coordinate = CLLocationCoordinate2D(latitude: 0, longitude: 0) public static let zoom: Double = 10 @@ -139,4 +139,8 @@ public struct MapViewCamera: Hashable, Equatable, Sendable { MapViewCamera(state: .rect(boundingBox: box, edgePadding: edgePadding), lastReasonForChange: .programmatic) } + + public var description: String { + "State: \(state) last: \((lastReasonForChange != nil) ? "\(lastReasonForChange!)" : "nil")" + } } diff --git a/Tests/MapLibreSwiftUITests/Models/Gesture/MapGestureTests.swift b/Tests/MapLibreSwiftUITests/Models/Gesture/MapGestureTests.swift index 500c312..8b32072 100644 --- a/Tests/MapLibreSwiftUITests/Models/Gesture/MapGestureTests.swift +++ b/Tests/MapLibreSwiftUITests/Models/Gesture/MapGestureTests.swift @@ -5,7 +5,6 @@ final class MapGestureTests: XCTestCase { func testTapGestureDefaults() { let gesture = MapGesture(method: .tap(), onChange: .context { _ in - }) XCTAssertEqual(gesture.method, .tap()) @@ -15,7 +14,6 @@ final class MapGestureTests: XCTestCase { func testTapGesture() { let gesture = MapGesture(method: .tap(numberOfTaps: 3), onChange: .context { _ in - }) XCTAssertEqual(gesture.method, .tap(numberOfTaps: 3)) @@ -25,7 +23,6 @@ final class MapGestureTests: XCTestCase { func testLongPressGestureDefaults() { let gesture = MapGesture(method: .longPress(), onChange: .context { _ in - }) XCTAssertEqual(gesture.method, .longPress()) @@ -35,7 +32,6 @@ final class MapGestureTests: XCTestCase { func testLongPressGesture() { let gesture = MapGesture(method: .longPress(minimumDuration: 3), onChange: .context { _ in - }) XCTAssertEqual(gesture.method, .longPress(minimumDuration: 3)) diff --git a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testBoundingBox.1.txt b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testBoundingBox.1.txt index 092ae5f..0ad2c1d 100644 --- a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testBoundingBox.1.txt +++ b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testBoundingBox.1.txt @@ -1,6 +1,4 @@ -▿ MapViewCamera - ▿ lastReasonForChange: Optional - - some: CameraChangeReason.programmatic +▿ State: CameraState.rect(northeast: CLLocationCoordinate2D(latitude: 24.6993808, longitude: 46.7709285), southwest: CLLocationCoordinate2D(latitude: 24.6056011, longitude: 46.67369842529297), edgePadding: UIEdgeInsets(top: 20.0, left: 20.0, bottom: 20.0, right: 20.0)) last: programmatic ▿ state: CameraState ▿ rect: (2 elements) ▿ boundingBox: MLNCoordinateBounds @@ -15,3 +13,5 @@ - left: 20.0 - right: 20.0 - top: 20.0 + ▿ lastReasonForChange: Optional + - some: CameraChangeReason.programmatic diff --git a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testCenterCamera.1.txt b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testCenterCamera.1.txt index 318c577..4f27b21 100644 --- a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testCenterCamera.1.txt +++ b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testCenterCamera.1.txt @@ -1,5 +1,4 @@ -▿ MapViewCamera - - lastReasonForChange: Optional.none +▿ State: CameraState.centered(onCoordinate: CLLocationCoordinate2D(latitude: 12.3, longitude: 23.4), zoom: 5.0, pitch: 12.0, pitchRange: free, direction: 23.0) last: nil ▿ state: CameraState ▿ centered: (5 elements) ▿ onCoordinate: CLLocationCoordinate2D @@ -9,3 +8,4 @@ - pitch: 12.0 - pitchRange: CameraPitchRange.free - direction: 23.0 + - lastReasonForChange: Optional.none diff --git a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackUserLocationWithCourse.1.txt b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackUserLocationWithCourse.1.txt index f405f82..a04d0dd 100644 --- a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackUserLocationWithCourse.1.txt +++ b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackUserLocationWithCourse.1.txt @@ -1,6 +1,4 @@ -▿ MapViewCamera - ▿ lastReasonForChange: Optional - - some: CameraChangeReason.programmatic +▿ State: CameraState.trackingUserLocationWithCourse(zoom: (18.0, 0.0, MapLibreSwiftUI.CameraPitchRange.freeWithinRange(minimum: 12.0, maximum: 34.0))) last: programmatic ▿ state: CameraState ▿ trackingUserLocationWithCourse: (3 elements) - zoom: 18.0 @@ -9,3 +7,5 @@ ▿ freeWithinRange: (2 elements) - minimum: 12.0 - maximum: 34.0 + ▿ lastReasonForChange: Optional + - some: CameraChangeReason.programmatic diff --git a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackUserLocationWithHeading.1.txt b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackUserLocationWithHeading.1.txt index cb5da4b..2eb212b 100644 --- a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackUserLocationWithHeading.1.txt +++ b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackUserLocationWithHeading.1.txt @@ -1,8 +1,8 @@ -▿ MapViewCamera - ▿ lastReasonForChange: Optional - - some: CameraChangeReason.programmatic +▿ State: CameraState.trackingUserLocationWithHeading(zoom: (10.0, 0.0, MapLibreSwiftUI.CameraPitchRange.free)) last: programmatic ▿ state: CameraState ▿ trackingUserLocationWithHeading: (3 elements) - zoom: 10.0 - pitch: 0.0 - pitchRange: CameraPitchRange.free + ▿ lastReasonForChange: Optional + - some: CameraChangeReason.programmatic diff --git a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackingUserLocation.1.txt b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackingUserLocation.1.txt index 4252dc9..e549cc9 100644 --- a/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackingUserLocation.1.txt +++ b/Tests/MapLibreSwiftUITests/Models/MapCamera/__Snapshots__/MapViewCameraTests/testTrackingUserLocation.1.txt @@ -1,6 +1,4 @@ -▿ MapViewCamera - ▿ lastReasonForChange: Optional - - some: CameraChangeReason.programmatic +▿ State: CameraState.trackingUserLocation(zoom: (10.0, 0.0, MapLibreSwiftUI.CameraPitchRange.freeWithinRange(minimum: 12.0, maximum: 34.0), 0.0)) last: programmatic ▿ state: CameraState ▿ trackingUserLocation: (4 elements) - zoom: 10.0 @@ -10,3 +8,5 @@ - minimum: 12.0 - maximum: 34.0 - direction: 0.0 + ▿ lastReasonForChange: Optional + - some: CameraChangeReason.programmatic