Skip to content

Commit

Permalink
Draw a special sign in case of infinite speed limit (#4584)
Browse files Browse the repository at this point in the history
* Draw a special sign in case of infinite speed limit

* Update changelog

* Add snapshot tests for SpeedLimitView

* Remove legacy screenshots

* Remove legacy screenshot tests
  • Loading branch information
azarovalex authored Jan 24, 2024
1 parent 2e9fea9 commit 61b4bba
Show file tree
Hide file tree
Showing 139 changed files with 108 additions and 5 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,16 @@
### Routing

* `NavigationRouteOptions` and `NavigationMatchOptions` no longer include `.numericCongestionLevel` attribute by default for profiles other than `.automobileAvoidingTraffic`. ([#4564](https://github.com/mapbox/mapbox-navigation-ios/pull/4564))
* Fixed an issue where the `.speedLimitKey` key in the `.passiveLocationManagerDidUpdate` notification contained `0` on roads with no speed limit. The value is now correctly set to `Double.infinity`. ([#4584](https://github.com/mapbox/mapbox-navigation-ios/pull/4584))

### Map

* Fixed a possible crash that could happen when displaying the route with the same source, midpoint, and destination. ([#4576](https://github.com/mapbox/mapbox-navigation-ios/pull/4576))

### User interface

* `SpeedLimitView` now shows a special "Limits no longer apply" sign on roads where speed limit is known to not exist. ([#4584](https://github.com/mapbox/mapbox-navigation-ios/pull/4584))

### Other changes

* Added PrivacyInfo.xcprivacy support. ([#4573](https://github.com/mapbox/mapbox-navigation-ios/pull/4573))
Expand Down
5 changes: 2 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,9 @@ The .strings files should still be in the original English – that’s expecte
## Adding tests

### Supported devices:
- iPhone 11 Pro Max, iOS 13.7
- iPhone 13 Pro Max, iOS 15.2
- iPhone 13 Pro Max, iOS 15.4
- iPhone 13 Pro Max, iOS 15.5
- iPhone 14 Pro Max, iOS 16.1
- iPhone 15 Pro Max, iOS 17.2

### Adding a unit test suite

Expand Down
5 changes: 4 additions & 1 deletion Sources/MapboxCoreNavigation/PassiveLocationManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,10 @@ open class PassiveLocationManager: NSObject {
break
}

if let speed = status.speedLimit.speed?.doubleValue {
if var speed = status.speedLimit.speed?.doubleValue {
// speedLimit == 0 represents that there is no speed limit, meaning that the limit is known to be infinite.
// Not to be confused with speedLimit == nil in case we don't know the limit.
if speed == 0 { speed = .infinity }
switch status.speedLimit.localeUnit {
case .milesPerHour:
speedLimit = Measurement(value: speed, unit: .milesPerHour)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "infinite-speed-limit.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
7 changes: 6 additions & 1 deletion Sources/MapboxNavigation/SpeedLimitView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,12 @@ public class SpeedLimitView: UIView {
let legend = NSLocalizedString("SPEED_LIMIT_LEGEND", bundle: .mapboxNavigation, value: "Max", comment: "Label above the speed limit in an MUTCD-style speed limit sign. Keep as short as possible.").uppercased()
SpeedLimitStyleKit.drawMUTCD(frame: bounds, resizing: .aspectFit, signBackColor: signBackColor, strokeColor: textColor, limit: formattedSpeedLimit, legend: legend)
case .viennaConvention:
SpeedLimitStyleKit.drawVienna(frame: bounds, resizing: .aspectFit, signBackColor: signBackColor, strokeColor: textColor, regulatoryColor: regulatoryBorderColor, limit: formattedSpeedLimit)
if let speedLimit, speedLimit.value.isInfinite {
let image = UIImage(named: "infinite-speed-limit", in: .mapboxNavigation, compatibleWith: nil)
image?.draw(in: bounds)
} else {
SpeedLimitStyleKit.drawVienna(frame: bounds, resizing: .aspectFit, signBackColor: signBackColor, strokeColor: textColor, regulatoryColor: regulatoryBorderColor, limit: formattedSpeedLimit)
}
}
}

Expand Down
79 changes: 79 additions & 0 deletions Tests/MapboxNavigationTests/SpeedLimitViewSnapshotTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import XCTest
import SnapshotTesting
import MapboxDirections
import CoreLocation
import TestHelper
@testable import MapboxNavigation
@testable import MapboxCoreNavigation

class SpeedLimitViewSnapshotTests: TestCase {
var speedLimitView: SpeedLimitView!

override func setUp() {
super.setUp()
speedLimitView = .init(frame: CGRect(origin: .zero, size: CGSize(width: 50, height: 50)))
speedLimitView.backgroundColor = .white
isRecording = false

let window = UIWindow(frame: speedLimitView.bounds)
window.addSubview(speedLimitView)
DayStyle().apply()
}

override func tearDown() {
speedLimitView = nil
}

func testMUTCD() {
speedLimitView.signStandard = .mutcd
speedLimitView.speedLimit = .init(value: 20, unit: .milesPerHour)
assertImageSnapshot(matching: speedLimitView.layer, as: .image(precision: 0.95))
}

func testMUTCD_blueText() {
speedLimitView.signStandard = .mutcd
speedLimitView.textColor = .blue
speedLimitView.speedLimit = .init(value: 120, unit: .milesPerHour)
assertImageSnapshot(matching: speedLimitView.layer, as: .image(precision: 0.95))
}

func testVienna() {
speedLimitView.signStandard = .viennaConvention
speedLimitView.speedLimit = .init(value: 120, unit: .kilometersPerHour)
assertImageSnapshot(matching: speedLimitView.layer, as: .image(precision: 0.95))
}

func testVienna_blueBorder() {
UIView.setAnimationsEnabled(false) // disabling blink-in animation
speedLimitView.signStandard = .viennaConvention
speedLimitView.regulatoryBorderColor = .blue
speedLimitView.speedLimit = .init(value: 20, unit: .kilometersPerHour)
assertImageSnapshot(matching: speedLimitView.layer, as: .image(precision: 0.95))
}

func testUnknownViennaSpeedLimit() {
speedLimitView.signStandard = .viennaConvention
speedLimitView.speedLimit = nil
speedLimitView.shouldShowUnknownSpeedLimit = true
assertImageSnapshot(matching: speedLimitView.layer, as: .image(precision: 0.95))
}

func testUnknownMUTCDSpeedLimit() {
speedLimitView.signStandard = .mutcd
speedLimitView.speedLimit = nil
speedLimitView.shouldShowUnknownSpeedLimit = true
assertImageSnapshot(matching: speedLimitView.layer, as: .image(precision: 0.95))
}

func testInfiniteVennaSpeedLimit() {
speedLimitView.signStandard = .viennaConvention
speedLimitView.speedLimit = .init(value: .infinity, unit: .kilometersPerHour)
assertImageSnapshot(matching: speedLimitView.layer, as: .image(precision: 0.95))
}

func testInfiniteMUTCDSpeedLimit() {
speedLimitView.signStandard = .mutcd
speedLimitView.speedLimit = .init(value: .infinity, unit: .kilometersPerHour)
assertImageSnapshot(matching: speedLimitView.layer, as: .image(precision: 0.95))
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.

0 comments on commit 61b4bba

Please sign in to comment.