diff --git a/FuelBoard/ContentView.swift b/FuelBoard/ContentView.swift index 82875a9..eed0426 100644 --- a/FuelBoard/ContentView.swift +++ b/FuelBoard/ContentView.swift @@ -1844,11 +1844,11 @@ struct StationRow: View { let distance = FuelStore.stationDistanceDisplay( station: station, userLat: location.lat, userLng: location.lng ) - Text(distance.label(unit: distanceUnit)) + Text(distance.labelWithReturn(unit: distanceUnit)) .font(.caption2) .foregroundStyle(.secondary) .monospacedDigit() - .accessibilityLabel(distance.spokenLabel(unit: distanceUnit)) + .accessibilityLabel(distance.spokenLabelWithReturn(unit: distanceUnit)) } } .frame(maxWidth: .infinity, alignment: .leading) diff --git a/FuelBoard/StationDetailView.swift b/FuelBoard/StationDetailView.swift index 55b0fd6..1e597a4 100644 --- a/FuelBoard/StationDetailView.swift +++ b/FuelBoard/StationDetailView.swift @@ -64,7 +64,7 @@ struct StationDetailView: View { let distance = FuelStore.stationDistanceDisplay( station: station, userLat: location.lat, userLng: location.lng ) - LabeledContent("Distance", value: distance.label(unit: distanceUnit)) + LabeledContent("Distance", value: distance.labelWithReturn(unit: distanceUnit)) .monospacedDigit() } ForEach(StationNotice.notices(for: station)) { notice in diff --git a/FuelBoardTests/Tests/FuelBoardSharedTests/FuelBoardTests.swift b/FuelBoardTests/Tests/FuelBoardSharedTests/FuelBoardTests.swift index 8242ef2..0353bbf 100644 --- a/FuelBoardTests/Tests/FuelBoardSharedTests/FuelBoardTests.swift +++ b/FuelBoardTests/Tests/FuelBoardSharedTests/FuelBoardTests.swift @@ -783,15 +783,22 @@ final class RoadDistanceCacheTests: XCTestCase { XCTAssertFalse(confirmed.isApproximate, "a cached road distance is not an approximation") XCTAssertEqual(confirmed.km, 3.2, accuracy: 0.0001) XCTAssertEqual(confirmed.label(unit: .miles), "2.0 mi") + XCTAssertEqual(confirmed.labelWithReturn(unit: .miles), "2.0 mi (4.0 mi return)") + XCTAssertEqual(confirmed.labelWithReturn(unit: .kilometers), "3.2 km (6.4 km return)") XCTAssertEqual(confirmed.spokenLabel(unit: .miles), "2.0 miles") + XCTAssertEqual(confirmed.spokenLabelWithReturn(unit: .miles), "2.0 miles, 4.0 miles return") let approximate = FuelStore.stationDistanceDisplay(station: unrouted, userLat: 51.6, userLng: -0.1) XCTAssertTrue(approximate.isApproximate, "the straight-line fallback must be identified as one") XCTAssertEqual(approximate.km, unrouted.distanceKM(to: 51.6, lng2: -0.1), accuracy: 0.0001) XCTAssertEqual(approximate.label(unit: .miles), "Approx. " + DistanceUnit.miles.format(approximate.km)) + XCTAssertEqual(approximate.labelWithReturn(unit: .miles), + "Approx. \(DistanceUnit.miles.format(approximate.km)) (\(DistanceUnit.miles.format(approximate.km * 2)) return)") XCTAssertEqual(approximate.spokenLabel(unit: .kilometers), "Approximately " + DistanceUnit.kilometers.spoken(approximate.km)) + XCTAssertEqual(approximate.spokenLabelWithReturn(unit: .kilometers), + "Approximately \(DistanceUnit.kilometers.spoken(approximate.km)), \(DistanceUnit.kilometers.spoken(approximate.km * 2)) return") } /// The marker tracks the cache on its own: same station, bare figure once its diff --git a/Shared/FuelStore.swift b/Shared/FuelStore.swift index 09600dc..854f0aa 100644 --- a/Shared/FuelStore.swift +++ b/Shared/FuelStore.swift @@ -1722,11 +1722,23 @@ struct StationDistanceDisplay: Equatable { return isApproximate ? "Approx. \(text)" : text } + /// Row/sheet label that keeps the one-way station distance primary, then + /// adds the out-and-back distance in brackets. This matches Best Value's + /// "extra return travel" basis without changing the actual distance model. + func labelWithReturn(unit: DistanceUnit) -> String { + "\(label(unit: unit)) (\(unit.format(km * 2)) return)" + } + /// VoiceOver form of `label(unit:)`. func spokenLabel(unit: DistanceUnit) -> String { let text = unit.spoken(km) return isApproximate ? "Approximately \(text)" : text } + + /// VoiceOver form of `labelWithReturn(unit:)`. + func spokenLabelWithReturn(unit: DistanceUnit) -> String { + "\(spokenLabel(unit: unit)), \(unit.spoken(km * 2)) return" + } } /// Cached Apple-Maps road distances for nearby stations (see