summaryrefslogtreecommitdiff
path: root/platform/ios/test/MGLMapViewCompassViewTests.mm
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios/test/MGLMapViewCompassViewTests.mm')
-rw-r--r--platform/ios/test/MGLMapViewCompassViewTests.mm98
1 files changed, 98 insertions, 0 deletions
diff --git a/platform/ios/test/MGLMapViewCompassViewTests.mm b/platform/ios/test/MGLMapViewCompassViewTests.mm
new file mode 100644
index 0000000000..aaec4b0bf7
--- /dev/null
+++ b/platform/ios/test/MGLMapViewCompassViewTests.mm
@@ -0,0 +1,98 @@
+#import <Mapbox/Mapbox.h>
+#import <XCTest/XCTest.h>
+
+#import <mbgl/math/wrap.hpp>
+
+@interface MGLMapView (MGLCompassButtonTests)
+- (void)resetNorthAnimated:(BOOL)animated;
+@end
+
+@interface MGLCompassButtonTests : XCTestCase
+@property (nonatomic) MGLMapView *mapView;
+@end
+
+@implementation MGLCompassButtonTests
+
+- (void)setUp {
+ [super setUp];
+
+ [MGLAccountManager setAccessToken:@"pk.feedcafedeadbeefbadebede"];
+ NSURL *styleURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"one-liner" withExtension:@"json"];
+ self.mapView = [[MGLMapView alloc] initWithFrame:UIScreen.mainScreen.bounds styleURL:styleURL];
+}
+
+- (void)tearDown {
+ self.mapView = nil;
+ [MGLAccountManager setAccessToken:nil];
+
+ [super tearDown];
+}
+
+- (void)testCompassButton {
+ XCTAssertNotNil(self.mapView.compassView);
+ XCTAssertTrue([self.mapView.compassView isKindOfClass:[MGLCompassButton class]]);
+ XCTAssertTrue(self.mapView.compassView.userInteractionEnabled);
+ 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);
+}
+
+- (void)testVisibilityAdaptive {
+ XCTAssertEqual(self.mapView.compassView.compassVisibility, MGLOrnamentVisibilityAdaptive, @"Adaptive should be the default visibility setting.");
+ XCTAssertEqual(self.mapView.compassView.alpha, 0, @"Compass should not initially be visible.");
+
+ self.mapView.zoomLevel = 15.f;
+ [self.mapView setDirection:45.f animated:false];
+ XCTAssertEqualWithAccuracy(self.mapView.direction, 45, 0.001);
+ XCTAssertEqual(self.mapView.compassView.alpha, 1, @"Compass should become visible when direction changes.");
+
+ [self.mapView resetNorthAnimated:NO];
+ XCTAssertEqual(self.mapView.direction, 0);
+ XCTAssertEqual(self.mapView.compassView.alpha, 0, @"Compass should hide itself when direction is north.");
+}
+
+- (void)testVisibilityHidden {
+ self.mapView.compassView.compassVisibility = MGLOrnamentVisibilityHidden;
+ XCTAssertEqual(self.mapView.compassView.compassVisibility, MGLOrnamentVisibilityHidden);
+ XCTAssertEqual(self.mapView.compassView.alpha, 0, @"Compass should not initially be visible.");
+
+ self.mapView.zoomLevel = 15.f;
+ [self.mapView setDirection:45.f animated:false];
+ XCTAssertEqualWithAccuracy(self.mapView.direction, 45, 0.001);
+ XCTAssertEqual(self.mapView.compassView.alpha, 0, @"Compass should stay hidden when direction changes.");
+}
+
+- (void)testVisibilityVisible {
+ self.mapView.compassView.compassVisibility = MGLOrnamentVisibilityVisible;
+ XCTAssertEqual(self.mapView.compassView.compassVisibility, MGLOrnamentVisibilityVisible);
+ XCTAssertEqual(self.mapView.compassView.alpha, 1, @"Compass should initially be visible.");
+
+ self.mapView.zoomLevel = 15.f;
+ [self.mapView setDirection:45.f animated:false];
+ XCTAssertEqualWithAccuracy(self.mapView.direction, 45, 0.001);
+ XCTAssertEqual(self.mapView.compassView.alpha, 1, @"Compass should continue to be visible when direction changes.");
+
+ [self.mapView resetNorthAnimated:NO];
+ XCTAssertEqual(self.mapView.direction, 0);
+ 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