From bf313b0c5fb17569ba69be63bfc8af41fd5cffa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sun, 24 Apr 2016 23:38:49 -0700 Subject: [PATCH] [ios, osx] Fixed direction formatter edge cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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°. --- .../darwin/src/MGLClockDirectionFormatter.m | 5 ++++- .../darwin/src/MGLCompassDirectionFormatter.m | 2 +- .../test/MGLClockDirectionFormatterTests.m | 20 +++++++++++++++++++ .../test/MGLCompassDirectionFormatterTests.m | 10 ++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/platform/darwin/src/MGLClockDirectionFormatter.m b/platform/darwin/src/MGLClockDirectionFormatter.m index c8c07487b..fd67968e6 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 8a4118ba5..c46fe9e4d 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 2b98de086..a020ed88b 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 08b0b92f0..bba0317eb 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]);