diff options
author | Minh Nguyễn <mxn@1ec5.org> | 2016-04-24 23:38:49 -0700 |
---|---|---|
committer | Minh Nguyễn <mxn@1ec5.org> | 2016-04-24 23:38:49 -0700 |
commit | bf313b0c5fb17569ba69be63bfc8af41fd5cffa6 (patch) | |
tree | 7dbc3229018c01bb036fce0ec8fc75301abb45b0 | |
parent | 57f0a211251a9378fa004ee22b2c6f4d21e2bd59 (diff) | |
download | qtlocation-mapboxgl-bf313b0c5fb17569ba69be63bfc8af41fd5cffa6.tar.gz |
[ios, osx] Fixed direction formatter edge cases
Fixed an issue causing angles that are multiples of 360°, such as 720°, to be described as 0 o’clock. Fixed a crash when a compass direction is close enough to 360° to round up to 360°.
4 files changed, 35 insertions, 2 deletions
diff --git a/platform/darwin/src/MGLClockDirectionFormatter.m b/platform/darwin/src/MGLClockDirectionFormatter.m index c8c07487ba..fd67968e65 100644 --- a/platform/darwin/src/MGLClockDirectionFormatter.m +++ b/platform/darwin/src/MGLClockDirectionFormatter.m @@ -19,7 +19,10 @@ } - (NSString *)stringFromDirection:(CLLocationDirection)direction { - NSInteger hour = round(-wrap(-direction, -360, 0) / 360 * 12); + NSInteger hour = round(wrap(direction, 0, 360) / 360 * 12); + if (hour == 0) { + hour = 12; + } NSString *format; switch (self.unitStyle) { case NSFormattingUnitStyleShort: diff --git a/platform/darwin/src/MGLCompassDirectionFormatter.m b/platform/darwin/src/MGLCompassDirectionFormatter.m index 8a4118ba55..c46fe9e4d5 100644 --- a/platform/darwin/src/MGLCompassDirectionFormatter.m +++ b/platform/darwin/src/MGLCompassDirectionFormatter.m @@ -98,7 +98,7 @@ NSAssert(shortStrings.count == longStrings.count, @"Long and short compass direction string arrays must have the same size."); }); - NSInteger cardinalPoint = round(wrap(direction, 0, 360) / 360 * shortStrings.count); + NSInteger cardinalPoint = wrap(round(wrap(direction, 0, 360) / 360 * shortStrings.count), 0, shortStrings.count); switch (self.unitStyle) { case NSFormattingUnitStyleShort: return shortStrings[cardinalPoint]; diff --git a/platform/darwin/test/MGLClockDirectionFormatterTests.m b/platform/darwin/test/MGLClockDirectionFormatterTests.m index 2b98de0861..a020ed88b2 100644 --- a/platform/darwin/test/MGLClockDirectionFormatterTests.m +++ b/platform/darwin/test/MGLClockDirectionFormatterTests.m @@ -49,6 +49,26 @@ static NSString * const MGLTestLocaleIdentifier = @"en-US"; XCTAssertEqualObjects(@"9:00", [shortFormatter stringFromDirection:direction]); XCTAssertEqualObjects(@"9 o’clock", [mediumFormatter stringFromDirection:direction]); XCTAssertEqualObjects(@"9 o’clock", [longFormatter stringFromDirection:direction]); + + direction = 359.34951805867024; + XCTAssertEqualObjects(@"12:00", [shortFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"12 o’clock", [mediumFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"12 o’clock", [longFormatter stringFromDirection:direction]); + + direction = 360; + XCTAssertEqualObjects(@"12:00", [shortFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"12 o’clock", [mediumFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"12 o’clock", [longFormatter stringFromDirection:direction]); + + direction = 360.1; + XCTAssertEqualObjects(@"12:00", [shortFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"12 o’clock", [mediumFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"12 o’clock", [longFormatter stringFromDirection:direction]); + + direction = 720; + XCTAssertEqualObjects(@"12:00", [shortFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"12 o’clock", [mediumFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"12 o’clock", [longFormatter stringFromDirection:direction]); } @end diff --git a/platform/darwin/test/MGLCompassDirectionFormatterTests.m b/platform/darwin/test/MGLCompassDirectionFormatterTests.m index 08b0b92f0b..bba0317ebf 100644 --- a/platform/darwin/test/MGLCompassDirectionFormatterTests.m +++ b/platform/darwin/test/MGLCompassDirectionFormatterTests.m @@ -64,11 +64,21 @@ XCTAssertEqualObjects(@"west", [mediumFormatter stringFromDirection:direction]); XCTAssertEqualObjects(@"west", [longFormatter stringFromDirection:direction]); + direction = 359.34951805867024; + XCTAssertEqualObjects(@"N", [shortFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"north", [mediumFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"north", [longFormatter stringFromDirection:direction]); + direction = 360; XCTAssertEqualObjects(@"N", [shortFormatter stringFromDirection:direction]); XCTAssertEqualObjects(@"north", [mediumFormatter stringFromDirection:direction]); XCTAssertEqualObjects(@"north", [longFormatter stringFromDirection:direction]); + direction = 360.1; + XCTAssertEqualObjects(@"N", [shortFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"north", [mediumFormatter stringFromDirection:direction]); + XCTAssertEqualObjects(@"north", [longFormatter stringFromDirection:direction]); + direction = 720; XCTAssertEqualObjects(@"N", [shortFormatter stringFromDirection:direction]); XCTAssertEqualObjects(@"north", [mediumFormatter stringFromDirection:direction]); |