summaryrefslogtreecommitdiff
path: root/test/ios/MapViewTests.m
diff options
context:
space:
mode:
Diffstat (limited to 'test/ios/MapViewTests.m')
-rw-r--r--test/ios/MapViewTests.m353
1 files changed, 353 insertions, 0 deletions
diff --git a/test/ios/MapViewTests.m b/test/ios/MapViewTests.m
new file mode 100644
index 0000000000..adf3aeba06
--- /dev/null
+++ b/test/ios/MapViewTests.m
@@ -0,0 +1,353 @@
+#import "MapViewTests.h"
+#import <KIF/KIFTestStepValidation.h>
+#import "KIFTestActor+MapboxGL.h"
+#import "MGLMapView.h"
+
+@interface MapViewTests () <MGLMapViewDelegate>
+
+@end
+
+@implementation MapViewTests
+
+- (void)beforeEach {
+ [system simulateDeviceRotationToOrientation:UIDeviceOrientationPortrait];
+ tester.mapView.viewControllerForLayoutGuides = tester.viewController;
+ tester.mapView.centerCoordinate = CLLocationCoordinate2DMake(38.913175, -77.032458);
+ tester.mapView.zoomLevel = 14;
+ tester.mapView.direction = 0;
+ tester.mapView.zoomEnabled = YES;
+ tester.mapView.scrollEnabled = YES;
+ tester.mapView.rotateEnabled = YES;
+ tester.viewController.navigationController.navigationBarHidden = YES;
+ tester.viewController.navigationController.toolbarHidden = YES;
+ tester.mapView.delegate = self;
+}
+
+- (void)testDirectionSet {
+ tester.mapView.direction = 270;
+ __KIFAssertEqual(tester.mapView.direction,
+ 270,
+ @"setting direction should take effect");
+
+ [tester waitForTimeInterval:1];
+
+ __KIFAssertEqual(tester.compass.alpha,
+ 1,
+ @"compass should be visible when map is rotated");
+ __KIFAssertEqualObjects([NSValue valueWithCGAffineTransform:tester.compass.transform],
+ [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI * 1.5)],
+ @"compass rotation should indicate map rotation");
+}
+
+- (void)testCompassTap {
+ tester.mapView.direction = 180;
+ __KIFAssertEqual(tester.mapView.direction,
+ 180,
+ @"setting direction should take effect");
+
+ [tester waitForTimeInterval:1];
+
+ [tester.compass tap];
+
+ [tester waitForTimeInterval:1];
+
+ __KIFAssertEqual(tester.mapView.direction,
+ 0,
+ @"tapping compass should reset map direction");
+ __KIFAssertEqual(tester.compass.alpha,
+ 0,
+ @"compass should not be visible when map is unrotated");
+ __KIFAssertEqualObjects([NSValue valueWithCGAffineTransform:tester.compass.transform],
+ [NSValue valueWithCGAffineTransform:CGAffineTransformIdentity],
+ @"compass rotation should indicate map rotation");
+}
+
+- (void)testDirectionReset {
+ tester.mapView.direction = 100;
+ __KIFAssertEqual(tester.mapView.direction,
+ 100,
+ @"setting direction should take effect");
+
+ [tester.mapView resetNorth];
+
+ [tester waitForTimeInterval:1];
+
+ __KIFAssertEqual(tester.mapView.direction,
+ 0,
+ @"resetting north should reset map direction");
+ __KIFAssertEqual(tester.compass.alpha,
+ 0,
+ @"compass should not be visible when map is unrotated");
+ __KIFAssertEqualObjects([NSValue valueWithCGAffineTransform:tester.compass.transform],
+ [NSValue valueWithCGAffineTransform:CGAffineTransformIdentity],
+ @"compass rotation should indicate map rotation");
+}
+
+- (void)testZoom {
+ double zoom = tester.mapView.zoomLevel;
+
+ [tester.mapView zoomAtPoint:CGPointMake(tester.mapView.bounds.size.width / 2,
+ tester.mapView.bounds.size.height / 2)
+ distance:50
+ steps:10];
+
+ XCTAssertTrue(tester.mapView.zoomLevel > zoom,
+ @"zoom gesture should increase zoom level");
+
+ zoom = tester.mapView.zoomLevel;
+ [tester.mapView pinchAtPoint:CGPointMake(tester.mapView.bounds.size.width / 2,
+ tester.mapView.bounds.size.height / 2)
+ distance:50
+ steps:10];
+
+ XCTAssertTrue(tester.mapView.zoomLevel < zoom,
+ @"pinch gesture should decrease zoom level");
+}
+
+- (void)testZoomDisabled {
+ tester.mapView.zoomEnabled = NO;
+ double zoom = tester.mapView.zoomLevel;
+
+ [tester.mapView zoomAtPoint:CGPointMake(tester.mapView.bounds.size.width / 2,
+ tester.mapView.bounds.size.height / 2)
+ distance:50
+ steps:10];
+
+ __KIFAssertEqual(tester.mapView.zoomLevel,
+ zoom,
+ @"disabling zoom gesture should disallow zooming");
+
+ [tester.mapView pinchAtPoint:CGPointMake(tester.mapView.bounds.size.width / 2,
+ tester.mapView.bounds.size.height / 2)
+ distance:50
+ steps:10];
+
+ __KIFAssertEqual(tester.mapView.zoomLevel,
+ zoom,
+ @"disabling zoom gesture should disallow pinching");
+}
+
+- (void)testPan {
+ CLLocationCoordinate2D centerCoordinate = tester.mapView.centerCoordinate;
+
+ [tester.mapView dragFromPoint:CGPointMake(10, 10) toPoint:CGPointMake(300, 300) steps:10];
+
+ XCTAssertTrue(tester.mapView.centerCoordinate.latitude > centerCoordinate.latitude,
+ @"panning map down should increase center latitude");
+ XCTAssertTrue(tester.mapView.centerCoordinate.longitude < centerCoordinate.longitude,
+ @"panning map right should decrease center longitude");
+}
+
+- (void)testPanDisabled {
+ tester.mapView.scrollEnabled = NO;
+ CLLocationCoordinate2D centerCoordinate = tester.mapView.centerCoordinate;
+
+ [tester.mapView dragFromPoint:CGPointMake(10, 10) toPoint:CGPointMake(300, 300) steps:10];
+
+ __KIFAssertEqual(centerCoordinate.latitude,
+ tester.mapView.centerCoordinate.latitude,
+ @"disabling pan gesture should disallow vertical panning");
+ __KIFAssertEqual(centerCoordinate.longitude,
+ tester.mapView.centerCoordinate.longitude,
+ @"disabling pan gesture should disallow horizontal panning");
+}
+
+- (void)testCenterSet {
+ CLLocationCoordinate2D newCenterCoordinate = CLLocationCoordinate2DMake(45.23237263, -122.23287129);
+ XCTAssertNotEqual(tester.mapView.centerCoordinate.latitude,
+ newCenterCoordinate.latitude,
+ @"initial setup should have differing center latitude");
+ XCTAssertNotEqual(tester.mapView.centerCoordinate.longitude,
+ newCenterCoordinate.longitude,
+ @"initial setup should have differing center longitude");
+
+ [tester.mapView setCenterCoordinate:newCenterCoordinate];
+
+ XCTAssertTrue(tester.mapView.centerCoordinate.latitude == newCenterCoordinate.latitude,
+ @"setting center should change latitude");
+ XCTAssertTrue(tester.mapView.centerCoordinate.longitude == newCenterCoordinate.longitude,
+ @"setting center should change longitude");
+}
+
+- (void)testZoomSet {
+ double newZoom = 11.65;
+ XCTAssertNotEqual(tester.mapView.zoomLevel,
+ newZoom,
+ @"initial setup should have differing zoom");
+
+ tester.mapView.zoomLevel = newZoom;
+
+ __KIFAssertEqual(tester.mapView.zoomLevel,
+ newZoom,
+ @"setting zoom should take effect");
+}
+
+- (void)testTopLayoutGuide {
+ CGRect statusBarFrame, navigationBarFrame, compassFrame;
+ UINavigationBar *navigationBar = tester.viewController.navigationController.navigationBar;
+
+ compassFrame = [tester.compass.superview convertRect:tester.compass.frame toView:nil];
+ statusBarFrame = [tester.window convertRect:[[UIApplication sharedApplication] statusBarFrame] toView:nil];
+ XCTAssertFalse(CGRectIntersectsRect(compassFrame, statusBarFrame),
+ @"compass should not be under status bar");
+
+ tester.viewController.navigationController.navigationBarHidden = NO;
+ compassFrame = [tester.compass.superview convertRect:tester.compass.frame toView:nil];
+ navigationBarFrame = [tester.window convertRect:navigationBar.frame toView:nil];
+ XCTAssertFalse(CGRectIntersectsRect(compassFrame, navigationBarFrame),
+ @"compass should not be under navigation bar");
+
+ [system simulateDeviceRotationToOrientation:UIDeviceOrientationLandscapeLeft];
+
+ compassFrame = [tester.compass.superview convertRect:tester.compass.frame toView:nil];
+ navigationBarFrame = [tester.window convertRect:navigationBar.frame toView:nil];
+ XCTAssertFalse(CGRectIntersectsRect(compassFrame, navigationBarFrame),
+ @"rotated device should not have compass under navigation bar");
+
+ tester.viewController.navigationController.navigationBarHidden = YES;
+ compassFrame = [tester.compass.superview convertRect:tester.compass.frame toView:nil];
+ statusBarFrame = [tester.window convertRect:[[UIApplication sharedApplication] statusBarFrame] toView:nil];
+ XCTAssertFalse(CGRectIntersectsRect(compassFrame, statusBarFrame),
+ @"rotated device should not have compass under status bar");
+}
+
+- (void)testBottomLayoutGuide {
+ CGRect logoBugFrame, toolbarFrame, attributionButtonFrame;
+ UIView *logoBug = (UIView *)[tester waitForViewWithAccessibilityLabel:@"Mapbox logo"];
+ UIToolbar *toolbar = tester.viewController.navigationController.toolbar;
+ UIView *attributionButton = (UIView *)[tester waitForViewWithAccessibilityLabel:@"Attribution info"];
+
+ tester.viewController.navigationController.toolbarHidden = NO;
+
+ logoBugFrame = [logoBug.superview convertRect:logoBug.frame toView:nil];
+ toolbarFrame = [tester.window convertRect:toolbar.frame toView:nil];
+ XCTAssertFalse(CGRectIntersectsRect(logoBugFrame, toolbarFrame),
+ @"logo bug should not be under toolbar");
+
+ attributionButtonFrame = [attributionButton.superview convertRect:attributionButton.frame toView:nil];
+ XCTAssertFalse(CGRectIntersectsRect(attributionButtonFrame, toolbarFrame),
+ @"attribution button should not be under toolbar");
+
+ [system simulateDeviceRotationToOrientation:UIDeviceOrientationLandscapeRight];
+
+ logoBugFrame = [logoBug.superview convertRect:logoBug.frame toView:nil];
+ toolbarFrame = [tester.window convertRect:toolbar.frame toView:nil];
+ XCTAssertFalse(CGRectIntersectsRect(logoBugFrame, toolbarFrame),
+ @"rotated device should not have logo buy under toolbar");
+
+ attributionButtonFrame = [attributionButton.superview convertRect:attributionButton.frame toView:nil];
+ XCTAssertFalse(CGRectIntersectsRect(attributionButtonFrame, toolbarFrame),
+ @"rotated device should not have attribution button under toolbar");
+}
+
+- (void)testDelegateRegionWillChange {
+ __block NSUInteger unanimatedCount = 0;
+ __block NSUInteger animatedCount = 0;
+ [[NSNotificationCenter defaultCenter] addObserverForName:@"regionWillChangeAnimated"
+ object:tester.mapView
+ queue:[NSOperationQueue mainQueue]
+ usingBlock:^(NSNotification *note) {
+ if ([note.userInfo[@"animated"] boolValue]) {
+ animatedCount++;
+ } else {
+ unanimatedCount++;
+ }
+ }];
+
+ NSNotification *notification = [system waitForNotificationName:@"regionWillChangeAnimated"
+ object:tester.mapView
+ whileExecutingBlock:^{
+ tester.mapView.centerCoordinate = CLLocationCoordinate2DMake(0, 0);
+ }];
+ [tester waitForTimeInterval:1];
+ XCTAssertNotNil(notification,
+ @"regionWillChange delegate should produce a notification");
+ __KIFAssertEqual([notification.userInfo[@"animated"] boolValue],
+ NO,
+ @"regionWillChange delegate should not indicate animated change");
+ __KIFAssertEqual(unanimatedCount,
+ 1,
+ @"regionWillChange delegate should indicate one unanimated change");
+
+ notification = [system waitForNotificationName:@"regionWillChangeAnimated"
+ object:tester.mapView
+ whileExecutingBlock:^{
+ [tester.mapView setCenterCoordinate:CLLocationCoordinate2DMake(45, 100) animated:YES];
+ }];
+ [tester waitForTimeInterval:1];
+ XCTAssertNotNil(notification,
+ @"regionWillChange delegate should produce a notification");
+ __KIFAssertEqual([notification.userInfo[@"animated"] boolValue],
+ YES,
+ @"regionWillChange delegate should indicate an animated change");
+ __KIFAssertEqual(animatedCount,
+ 1,
+ @"regionWillChange delegate should indicate one animated change");
+
+ [[NSNotificationCenter defaultCenter] removeObserver:self
+ name:@"regionWillChangeAnimated"
+ object:tester.mapView];
+}
+
+- (void)mapView:(MGLMapView *)mapView regionWillChangeAnimated:(BOOL)animated {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"regionWillChangeAnimated"
+ object:mapView
+ userInfo:@{ @"animated" : @(animated) }];
+}
+
+- (void)testDelegateRegionDidChange {
+ __block NSUInteger unanimatedCount = 0;
+ __block NSUInteger animatedCount = 0;
+ [[NSNotificationCenter defaultCenter] addObserverForName:@"regionDidChangeAnimated"
+ object:tester.mapView
+ queue:[NSOperationQueue mainQueue]
+ usingBlock:^(NSNotification *note) {
+ if ([note.userInfo[@"animated"] boolValue]) {
+ animatedCount++;
+ } else {
+ unanimatedCount++;
+ }
+ }];
+
+ NSNotification *notification = [system waitForNotificationName:@"regionDidChangeAnimated"
+ object:tester.mapView
+ whileExecutingBlock:^{
+ tester.mapView.centerCoordinate = CLLocationCoordinate2DMake(0, 0);
+ }];
+ [tester waitForTimeInterval:1];
+ XCTAssertNotNil(notification,
+ @"regionDidChange delegate should produce a notification");
+ __KIFAssertEqual([notification.userInfo[@"animated"] boolValue],
+ NO,
+ @"regionDidChange delegate should not indicate animated change");
+ __KIFAssertEqual(unanimatedCount,
+ 1,
+ @"regionDidChange delegate should indicate one unanimated change");
+
+ notification = [system waitForNotificationName:@"regionDidChangeAnimated"
+ object:tester.mapView
+ whileExecutingBlock:^{
+ [tester.mapView setCenterCoordinate:CLLocationCoordinate2DMake(45, 100) animated:YES];
+ }];
+ [tester waitForTimeInterval:1];
+ XCTAssertNotNil(notification,
+ @"regionDidChange delegate should produce a notification");
+ __KIFAssertEqual([notification.userInfo[@"animated"] boolValue],
+ YES,
+ @"regionDidChange delegate should indicate animated change");
+ __KIFAssertEqual(animatedCount,
+ 1,
+ @"regionDidChange delegate should indicate one animated change");
+
+ [[NSNotificationCenter defaultCenter] removeObserver:self
+ name:@"regionDidChangeAnimated"
+ object:tester.mapView];
+}
+
+- (void)mapView:(MGLMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"regionDidChangeAnimated"
+ object:mapView
+ userInfo:@{ @"animated" : @(animated) }];
+}
+
+@end