diff options
-rw-r--r-- | platform/ios/ios.xcodeproj/project.pbxproj | 8 | ||||
-rw-r--r-- | platform/ios/test/MGLMapViewCompassViewTests.mm (renamed from platform/ios/test/MGLCompassButtonTests.m) | 26 | ||||
-rw-r--r-- | platform/ios/test/MGLMapViewDirectionTests.mm | 77 |
3 files changed, 56 insertions, 55 deletions
diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj index 98a651f13f..dfcce25513 100644 --- a/platform/ios/ios.xcodeproj/project.pbxproj +++ b/platform/ios/ios.xcodeproj/project.pbxproj @@ -426,7 +426,7 @@ 96E516FB20005A4000A02306 /* MGLUserLocationHeadingBeamLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 966FCF4A1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.h */; }; 96E516FC20005A4400A02306 /* MGLUserLocationHeadingIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 96F3F73B1F5711F1003E2D2C /* MGLUserLocationHeadingIndicator.h */; }; 96E5170420005A6B00A02306 /* SMCalloutView.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8848891CBB037E00AB86E3 /* SMCalloutView.h */; }; - 96E6145622CC135200109F14 /* MGLCompassButtonTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E6145522CC135200109F14 /* MGLCompassButtonTests.m */; }; + 96E6145622CC135200109F14 /* MGLMapViewCompassViewTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 96E6145522CC135200109F14 /* MGLMapViewCompassViewTests.mm */; }; 96E6145922CC169000109F14 /* MGLCompassButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 96E6145722CC169000109F14 /* MGLCompassButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96E6145A22CC169000109F14 /* MGLCompassButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 96E6145722CC169000109F14 /* MGLCompassButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96E6145B22CC169000109F14 /* MGLCompassButton.mm in Sources */ = {isa = PBXBuildFile; fileRef = 96E6145822CC169000109F14 /* MGLCompassButton.mm */; }; @@ -1141,7 +1141,7 @@ 96E0272C1E57C7E5004B8E66 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; }; 96E0272D1E57C7E6004B8E66 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = "<group>"; }; 96E0272E1E57C7E7004B8E66 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; }; - 96E6145522CC135200109F14 /* MGLCompassButtonTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLCompassButtonTests.m; sourceTree = "<group>"; }; + 96E6145522CC135200109F14 /* MGLMapViewCompassViewTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLMapViewCompassViewTests.mm; sourceTree = "<group>"; }; 96E6145722CC169000109F14 /* MGLCompassButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLCompassButton.h; sourceTree = "<group>"; }; 96E6145822CC169000109F14 /* MGLCompassButton.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLCompassButton.mm; sourceTree = "<group>"; }; 96ED34DD22374C0900E9FCA9 /* MGLMapViewDirectionTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLMapViewDirectionTests.mm; sourceTree = "<group>"; }; @@ -2042,7 +2042,6 @@ DA35A2C31CCA9F8300E826B2 /* MGLClockDirectionFormatterTests.m */, 35D9DDE11DA25EEC00DAAD69 /* MGLCodingTests.mm */, DA35A2C41CCA9F8300E826B2 /* MGLCompassDirectionFormatterTests.m */, - 96E6145522CC135200109F14 /* MGLCompassButtonTests.m */, DA35A2A91CCA058D00E826B2 /* MGLCoordinateFormatterTests.m */, 3598544C1E1D38AA00B29F84 /* MGLDistanceFormatterTests.m */, 6407D66F1E0085FD00F6A9C3 /* MGLDocumentationExampleTests.swift */, @@ -2052,6 +2051,7 @@ DA2E885C1CC0382C00F24E7B /* MGLGeometryTests.mm */, DA5DB1291FABF1EE001C2326 /* MGLMapAccessibilityElementTests.m */, DA695425215B1E75002041A4 /* MGLMapCameraTests.m */, + 96E6145522CC135200109F14 /* MGLMapViewCompassViewTests.mm */, 96ED34DD22374C0900E9FCA9 /* MGLMapViewDirectionTests.mm */, 16376B481FFEED010000563E /* MGLMapViewLayoutTests.m */, 96381C0122C6F3950053497D /* MGLMapViewPitchTests.m */, @@ -3263,7 +3263,7 @@ 40CFA6511D7875BB008103BD /* MGLShapeSourceTests.mm in Sources */, DA35A2C51CCA9F8300E826B2 /* MGLClockDirectionFormatterTests.m in Sources */, 35B8E08C1D6C8B5100E768D2 /* MGLPredicateTests.mm in Sources */, - 96E6145622CC135200109F14 /* MGLCompassButtonTests.m in Sources */, + 96E6145622CC135200109F14 /* MGLMapViewCompassViewTests.mm in Sources */, 96036A0620059BBA00510F3D /* MGLNSOrthographyAdditionsTests.m in Sources */, 1F95931D1E6DE2E900D5B294 /* MGLNSDateAdditionsTests.mm in Sources */, DA695426215B1E76002041A4 /* MGLMapCameraTests.m in Sources */, diff --git a/platform/ios/test/MGLCompassButtonTests.m b/platform/ios/test/MGLMapViewCompassViewTests.mm index f41de0a2e2..aaec4b0bf7 100644 --- a/platform/ios/test/MGLCompassButtonTests.m +++ b/platform/ios/test/MGLMapViewCompassViewTests.mm @@ -1,18 +1,14 @@ #import <Mapbox/Mapbox.h> #import <XCTest/XCTest.h> -#import "../../ios/src/MGLCompassButton_Private.h" +#import <mbgl/math/wrap.hpp> @interface MGLMapView (MGLCompassButtonTests) - - (void)resetNorthAnimated:(BOOL)animated; - @end @interface MGLCompassButtonTests : XCTestCase - @property (nonatomic) MGLMapView *mapView; - @end @implementation MGLCompassButtonTests @@ -34,8 +30,9 @@ - (void)testCompassButton { XCTAssertNotNil(self.mapView.compassView); + XCTAssertTrue([self.mapView.compassView isKindOfClass:[MGLCompassButton class]]); XCTAssertTrue(self.mapView.compassView.userInteractionEnabled); - XCTAssertEqual(self.mapView.compassView.gestureRecognizers.count, 1); + XCTAssertEqual(self.mapView.compassView.gestureRecognizers.count, (unsigned long)1); XCTAssertEqual(self.mapView.compassView.accessibilityTraits, UIAccessibilityTraitButton); XCTAssertNotNil(self.mapView.compassView.accessibilityLabel); XCTAssertNotNil(self.mapView.compassView.accessibilityHint); @@ -81,4 +78,21 @@ XCTAssertEqual(self.mapView.compassView.alpha, 1, @"Compass should continue to be visible when direction is north."); } +- (void)testCompassRotation { + self.mapView.zoomLevel = 15; + + for (NSNumber *degrees in @[@-999, @-359, @-240, @-180, @-90, @-45, @0, @45, @90, @180, @240, @360, @999]) { + self.mapView.direction = [degrees doubleValue]; + CGFloat wrappedDirection = mbgl::util::wrap(-self.mapView.direction, 0., 360.); + CGAffineTransform rotation = CGAffineTransformMakeRotation(MGLRadiansFromDegrees(wrappedDirection)); + XCTAssertTrue(CGAffineTransformEqualToTransform(self.mapView.compassView.transform, rotation), + @"Compass transform direction %f° should equal wrapped transform direction %f° (~%.f°).", [self degreesFromAffineTransform:self.mapView.compassView.transform], [self degreesFromAffineTransform:rotation], wrappedDirection); + } +} + +- (CGFloat)degreesFromAffineTransform:(CGAffineTransform)transform { + CGFloat angle = atan2f(transform.b, transform.a); + return MGLDegreesFromRadians(angle); +} + @end diff --git a/platform/ios/test/MGLMapViewDirectionTests.mm b/platform/ios/test/MGLMapViewDirectionTests.mm index d3990b581b..ef29b4227e 100644 --- a/platform/ios/test/MGLMapViewDirectionTests.mm +++ b/platform/ios/test/MGLMapViewDirectionTests.mm @@ -3,8 +3,6 @@ #import <mbgl/math/wrap.hpp> -static MGLMapView *mapView; - @interface MGLMapView (MGLMapViewDirectionTests) - (void)handleRotateGesture:(UIRotationGestureRecognizer *)rotate; - (void)resetNorthAnimated:(BOOL)animated; @@ -15,6 +13,7 @@ static MGLMapView *mapView; @end @interface MGLMapViewDirectionTests : XCTestCase +@property (nonatomic) MGLMapView *mapView; @end @implementation MGLMapViewDirectionTests @@ -24,35 +23,35 @@ static MGLMapView *mapView; [MGLAccountManager setAccessToken:@"pk.feedcafedeadbeefbadebede"]; NSURL *styleURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"one-liner" withExtension:@"json"]; - mapView = [[MGLMapView alloc] initWithFrame:CGRectMake(0, 0, 64, 64) styleURL:styleURL]; + self.mapView = [[MGLMapView alloc] initWithFrame:CGRectMake(0, 0, 64, 64) styleURL:styleURL]; } - (void)tearDown { - mapView = nil; + self.mapView = nil; [MGLAccountManager setAccessToken:nil]; [super tearDown]; } - (void)testDirection { - mapView.zoomLevel = 0; - mapView.direction = 30; - XCTAssertEqual(mapView.direction, 0, @"Rotation is not allowed at world-scale zoom levels."); + self.mapView.zoomLevel = 0; + self.mapView.direction = 30; + XCTAssertEqual(self.mapView.direction, 0, @"Rotation is not allowed at world-scale zoom levels."); - mapView.zoomLevel = 15; + self.mapView.zoomLevel = 15; for (NSNumber *degrees in @[@-999, @-359, @-240, @-180, @-90, @-45, @0, @45, @90, @180, @240, @360, @999]) { double inputDegrees = [degrees doubleValue]; double wrappedDegrees = mbgl::util::wrap(inputDegrees, 0., 360.); - mapView.direction = inputDegrees; - XCTAssertEqualWithAccuracy(mapView.direction, wrappedDegrees, 0.001); + self.mapView.direction = inputDegrees; + XCTAssertEqualWithAccuracy(self.mapView.direction, wrappedDegrees, 0.001); } - [mapView resetNorthAnimated:NO]; - XCTAssertEqual(mapView.direction, 0, @"Reset-to-north should set direction to 0°."); + [self.mapView resetNorthAnimated:NO]; + XCTAssertEqual(self.mapView.direction, 0, @"Reset-to-north should set direction to 0°."); } - (void)testRotateEnabled { - mapView.zoomLevel = 10; + self.mapView.zoomLevel = 10; UIRotationGestureRecognizer *gesture = [[UIRotationGestureRecognizer alloc] initWithTarget:nil action:nil]; gesture.state = UIGestureRecognizerStateBegan; @@ -61,63 +60,51 @@ static MGLMapView *mapView; // Disabled { - mapView.rotateEnabled = NO; - XCTAssertEqual(mapView.allowsRotating, NO); + self.mapView.rotateEnabled = NO; + XCTAssertEqual(self.mapView.allowsRotating, NO); - [mapView handleRotateGesture:gesture]; - XCTAssertNotEqual(mapView.direction, wrappedRotation, @"Gestural rotation should not work when rotation is disabled."); + [self.mapView handleRotateGesture:gesture]; + XCTAssertNotEqual(self.mapView.direction, wrappedRotation, @"Gestural rotation should not work when rotation is disabled."); - mapView.direction = 45.f; - XCTAssertEqualWithAccuracy(mapView.direction, 45, 0.001, @"Programmatic rotation is allowed when rotateEnabled = NO."); + self.mapView.direction = 45.f; + XCTAssertEqualWithAccuracy(self.mapView.direction, 45, 0.001, @"Programmatic rotation is allowed when rotateEnabled = NO."); } // Enabled { - [mapView resetNorthAnimated:NO]; - mapView.rotateEnabled = YES; - XCTAssertEqual(mapView.allowsRotating, YES); + [self.mapView resetNorthAnimated:NO]; + self.mapView.rotateEnabled = YES; + XCTAssertEqual(self.mapView.allowsRotating, YES); gesture.state = UIGestureRecognizerStateChanged; gesture.rotation = MGLRadiansFromDegrees(30); - [mapView handleRotateGesture:gesture]; - XCTAssertEqualWithAccuracy(mapView.direction, wrappedRotation, 0.001, @"Gestural rotation should work when rotation is enabled."); + [self.mapView handleRotateGesture:gesture]; + XCTAssertEqualWithAccuracy(self.mapView.direction, wrappedRotation, 0.001, @"Gestural rotation should work when rotation is enabled."); } } -- (void)testRotateGesture { - mapView.zoomLevel = 15; +- (void)testRotationGesture { + self.mapView.zoomLevel = 15; UIRotationGestureRecognizer *gesture = [[UIRotationGestureRecognizer alloc] initWithTarget:nil action:nil]; gesture.state = UIGestureRecognizerStateBegan; gesture.rotation = 0; - [mapView handleRotateGesture:gesture]; - XCTAssertEqual(mapView.direction, gesture.rotation); + [self.mapView handleRotateGesture:gesture]; + XCTAssertEqual(self.mapView.direction, gesture.rotation); for (NSNumber *degrees in @[@-999, @-360, @-240, @-180, @-90, @-45, @0, @45, @90, @180, @240, @359, @999]) { gesture.state = UIGestureRecognizerStateChanged; gesture.rotation = MGLRadiansFromDegrees([degrees doubleValue]); - [mapView handleRotateGesture:gesture]; + [self.mapView handleRotateGesture:gesture]; CGFloat wrappedRotation = mbgl::util::wrap(-MGLDegreesFromRadians(gesture.rotation), 0., 360.); - XCTAssertEqualWithAccuracy(mapView.direction, wrappedRotation, 0.001, @"Map direction should match gesture rotation for input of %@°.", degrees); - } -} - -- (void)testCompassRotation { - mapView.zoomLevel = 15; - - for (NSNumber *degrees in @[@-999, @-359, @-240, @-180, @-90, @-45, @0, @45, @90, @180, @240, @360, @999]) { - mapView.direction = [degrees doubleValue]; - CGFloat wrappedDirection = mbgl::util::wrap(-mapView.direction, 0., 360.); - CGAffineTransform rotation = CGAffineTransformMakeRotation(MGLRadiansFromDegrees(wrappedDirection)); - XCTAssertTrue(CGAffineTransformEqualToTransform(mapView.compassView.transform, rotation), - @"Compass transform direction %f° should equal wrapped transform direction %f° (~%.f°).", [self degreesFromAffineTransform:mapView.compassView.transform], [self degreesFromAffineTransform:rotation], wrappedDirection); + XCTAssertEqualWithAccuracy(self.mapView.direction, wrappedRotation, 0.001, @"Map direction should match gesture rotation for input of %@°.", degrees); } } - (void)testResetPosition { - [mapView resetPosition]; - MGLMapCamera *defaultCamera = [MGLMapCamera cameraLookingAtCenterCoordinate:CLLocationCoordinate2DMake(0, 0) altitude:mapView.camera.altitude pitch:0 heading:0]; - XCTAssertTrue([mapView.camera isEqualToMapCamera:defaultCamera], @"Map camera %@ should be equal to default camera %@.", mapView.camera, defaultCamera); + [self.mapView resetPosition]; + MGLMapCamera *defaultCamera = [MGLMapCamera cameraLookingAtCenterCoordinate:CLLocationCoordinate2DMake(0, 0) altitude:self.mapView.camera.altitude pitch:0 heading:0]; + XCTAssertTrue([self.mapView.camera isEqualToMapCamera:defaultCamera], @"Map camera %@ should be equal to default camera %@.", self.mapView.camera, defaultCamera); } - (CGFloat)degreesFromAffineTransform:(CGAffineTransform)transform { |