diff options
Diffstat (limited to 'test/ios/MapViewTests.m')
-rw-r--r-- | test/ios/MapViewTests.m | 531 |
1 files changed, 0 insertions, 531 deletions
diff --git a/test/ios/MapViewTests.m b/test/ios/MapViewTests.m deleted file mode 100644 index 40022a1ee5..0000000000 --- a/test/ios/MapViewTests.m +++ /dev/null @@ -1,531 +0,0 @@ -#import <KIF/KIF.h> -#import <KIF/KIFTestStepValidation.h> - -#import "KIFTestActor+MapboxGL.h" - -#import <Mapbox/Mapbox.h> -#import "MGLTViewController.h" - -#import <CoreLocation/CoreLocation.h> -#import <KIF/UIAutomationHelper.h> - -@interface MapViewTests : KIFTestCase <MGLMapViewDelegate> - -@end - -@implementation MapViewTests - -- (NSNotification *)waitForNotificationThatRegionDidChangeAnimatedWhileExecutingBlock:(void (^)())block { - [[NSNotificationCenter defaultCenter] addObserverForName:@"regionDidChangeAnimated" - object:tester.mapView - queue:nil - usingBlock:^(NSNotification * _Nonnull note) {}]; - NSNotification *notification = [system waitForNotificationName:@"regionDidChangeAnimated" - object:tester.mapView whileExecutingBlock:block]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:@"regionDidChangeAnimated" - object:tester.mapView]; - return notification; -} - -- (void)beforeEach { - [system simulateDeviceRotationToOrientation:UIDeviceOrientationPortrait]; - [tester.viewController resetMapView]; - - 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.mapView removeAnnotations:tester.mapView.annotations]; - - tester.viewController.navigationController.navigationBarHidden = YES; - tester.viewController.navigationController.toolbarHidden = YES; - - tester.mapView.delegate = self; -} - -- (void)approveLocationIfNeeded { - if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { - [UIAutomationHelper acknowledgeSystemAlert]; - [tester waitForTimeInterval:1]; - } - XCTAssertTrue([CLLocationManager locationServicesEnabled]); - XCTAssertEqual([CLLocationManager authorizationStatus], kCLAuthorizationStatusAuthorizedAlways); -} - -- (void)testDirectionSet { - [self waitForNotificationThatRegionDidChangeAnimatedWhileExecutingBlock:^{ - [tester.mapView setDirection:270 animated:YES]; - }]; - - XCTAssertEqual(tester.mapView.direction, - 270, - @"setting direction should take effect"); - - [tester waitForAnimationsToFinish]; - XCTAssertEqual(tester.compass.alpha, - 1, - @"compass should be visible when map is rotated"); - - XCTAssertEqualObjects([NSValue valueWithCGAffineTransform:tester.compass.transform], - [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI * 0.5)], - @"compass rotation should indicate map rotation"); -} - -- (void)testDirectionReset { - [self waitForNotificationThatRegionDidChangeAnimatedWhileExecutingBlock:^{ - [tester.mapView setDirection:90 animated:YES]; - }]; - - XCTAssertEqual(tester.mapView.direction, - 90, - @"setting direction should take effect"); - - [self waitForNotificationThatRegionDidChangeAnimatedWhileExecutingBlock:^{ - [tester.mapView resetNorth]; - }]; - - XCTAssertEqual(tester.mapView.direction, - 0, - @"resetting north should reset map direction"); - - [tester waitForAnimationsToFinish]; - XCTAssertEqual(tester.compass.alpha, - 0, - @"compass should not be visible when map is unrotated"); - - XCTAssert(CGAffineTransformEqualToTransform(tester.compass.transform, 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]; - - XCTAssertGreaterThan(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]; - - XCTAssertLessThan(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]; - - XCTAssertEqual(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]; - - XCTAssertEqual(tester.mapView.zoomLevel, - zoom, - @"disabling zoom gesture should disallow pinching"); -} - -- (void)testFitToBounds { - // No-op - MGLCoordinateBounds initialBounds = tester.mapView.visibleCoordinateBounds; - [tester.mapView setVisibleCoordinateBounds:initialBounds animated:NO]; - XCTAssertEqualObjects(MGLStringFromCoordinateBounds(initialBounds), - MGLStringFromCoordinateBounds(tester.mapView.visibleCoordinateBounds), - @"setting visible coordinate bounds to currently visible coordinate bounds should be a no-op"); - - // Roundtrip after zooming - tester.mapView.zoomLevel -= 3; - [tester.mapView setVisibleCoordinateBounds:initialBounds animated:NO]; - XCTAssertEqualObjects(MGLStringFromCoordinateBounds(initialBounds), - MGLStringFromCoordinateBounds(tester.mapView.visibleCoordinateBounds), - @"after zooming out, setting visible coordinate bounds back to %@ should not leave them at %@", - MGLStringFromCoordinateBounds(initialBounds), - MGLStringFromCoordinateBounds(tester.mapView.visibleCoordinateBounds)); - tester.mapView.zoomLevel += 3; - [tester.mapView setVisibleCoordinateBounds:initialBounds animated:NO]; - XCTAssertEqualObjects(MGLStringFromCoordinateBounds(initialBounds), - MGLStringFromCoordinateBounds(tester.mapView.visibleCoordinateBounds), - @"after zooming in, setting visible coordinate bounds back to %@ should not leave them at %@", - MGLStringFromCoordinateBounds(initialBounds), - MGLStringFromCoordinateBounds(tester.mapView.visibleCoordinateBounds)); - - // Roundtrip after panning - MGLCoordinateBounds offsetBounds = MGLCoordinateBoundsOffset(initialBounds, MGLCoordinateSpanMake(0, 30)); - [tester.mapView setVisibleCoordinateBounds:offsetBounds animated:NO]; - [tester.mapView setVisibleCoordinateBounds:initialBounds animated:NO]; - XCTAssertEqualObjects(MGLStringFromCoordinateBounds(initialBounds), - MGLStringFromCoordinateBounds(tester.mapView.visibleCoordinateBounds), - @"after panning 30° to the east, setting visible coordinate bounds back to %@ should not leave them at %@", - MGLStringFromCoordinateBounds(initialBounds), - MGLStringFromCoordinateBounds(tester.mapView.visibleCoordinateBounds)); - - // Inscribed shapes with rotation - tester.mapView.direction = 45; - // https://en.wikipedia.org/wiki/Boundary_Markers_of_the_Original_District_of_Columbia - CLLocationCoordinate2D dcCoordinates[] = { - {38.790339, -77.040583}, - {38.893219, -77.172304}, - {38.995946, -77.040947}, - {38.892829, -76.909229}, - }; - MGLCoordinateBounds dcBounds = {{38.790339, -77.172304}, {38.995946, -76.909229}}; - [tester.mapView setVisibleCoordinateBounds:dcBounds - animated:NO]; - double zoomLevel = tester.mapView.zoomLevel; - [tester.mapView setVisibleCoordinates:dcCoordinates - count:sizeof(dcCoordinates) / sizeof(dcCoordinates[0]) - edgePadding:UIEdgeInsetsZero - animated:NO]; - XCTAssertGreaterThan(tester.mapView.zoomLevel, zoomLevel, - @"when the map is rotated, DC should fit at a zoom level higher than %f, but instead the zoom level is %f", - zoomLevel, tester.mapView.zoomLevel); -} - -- (void)testPan { - CLLocationCoordinate2D centerCoordinate = tester.mapView.centerCoordinate; - - [tester.mapView dragFromPoint:CGPointMake(10, 10) toPoint:CGPointMake(300, 300) steps:10]; - - XCTAssertGreaterThan(tester.mapView.centerCoordinate.latitude, - centerCoordinate.latitude, - @"panning map down should increase center latitude"); - - XCTAssertLessThan(tester.mapView.centerCoordinate.longitude, - centerCoordinate.longitude, - @"panning map right should decrease center longitude"); -} - -- (void)testSetCenterCancelsTransitions { - XCTestExpectation *cameraIsInDCExpectation = [self expectationWithDescription:@"camera reset to DC"]; - - CLLocationCoordinate2D dc = CLLocationCoordinate2DMake(38.894368, -77.036487); - CLLocationCoordinate2D dc_west = CLLocationCoordinate2DMake(38.894368, -77.076487); - [tester.mapView setCenterCoordinate:dc animated:NO]; - [tester.mapView setCenterCoordinate:dc_west animated:YES]; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.15 * NSEC_PER_SEC), - dispatch_get_main_queue(), - ^{ - [tester.mapView setCenterCoordinate:dc animated:NO]; - XCTAssertEqualWithAccuracy(dc.latitude, - tester.mapView.centerCoordinate.latitude, - 0.0005, - @"setting center coordinate should cancel transitions"); - XCTAssertEqualWithAccuracy(dc.longitude, - tester.mapView.centerCoordinate.longitude, - 0.0005, - @"setting center coordinate should cancel transitions"); - [cameraIsInDCExpectation fulfill]; - }); - - [self waitForExpectationsWithTimeout:1.0 handler:nil]; -} - -- (void)testPanDisabled { - tester.mapView.scrollEnabled = NO; - CLLocationCoordinate2D centerCoordinate = tester.mapView.centerCoordinate; - - [tester.mapView dragFromPoint:CGPointMake(10, 10) toPoint:CGPointMake(300, 300) steps:10]; - - XCTAssertEqualWithAccuracy(centerCoordinate.latitude, - tester.mapView.centerCoordinate.latitude, - 0.005, - @"disabling pan gesture should disallow vertical panning"); - - XCTAssertEqualWithAccuracy(centerCoordinate.longitude, - tester.mapView.centerCoordinate.longitude, - 0.005, - @"disabling pan gesture should disallow horizontal panning"); -} - -- (void)testRotate { - CLLocationDirection startAngle = tester.mapView.direction; - - XCTAssertNotEqual(startAngle, - 45, - @"start angle must not be destination angle"); - - [tester.mapView twoFingerRotateAtPoint:tester.mapView.center angle:45]; - - XCTAssertGreaterThanOrEqual(fabs(tester.mapView.direction - startAngle), - 20, - @"rotating map should change angle"); -} - -- (void)testRotateDisabled { - tester.mapView.rotateEnabled = NO; - CLLocationDirection startAngle = tester.mapView.direction; - - XCTAssertNotEqual(startAngle, - 45, - @"start angle must not be destination angle"); - - [tester.mapView twoFingerRotateAtPoint:tester.mapView.center angle:45]; - - XCTAssertEqualWithAccuracy(tester.mapView.direction, - startAngle, - 0.005, - @"disabling rotation show disallow rotation gestures"); -} - -- (void)testZoomSet { - double newZoom = 11.65; - - XCTAssertNotEqual(tester.mapView.zoomLevel, - newZoom, - @"initial setup should have differing zoom"); - - tester.mapView.zoomLevel = newZoom; - - XCTAssertEqualWithAccuracy(tester.mapView.zoomLevel, - newZoom, - 0.01, - @"setting zoom should take effect"); -} - -- (void)testMarkerSelection { - CGPoint point = CGPointMake(100, 100); - MGLPointAnnotation *marker = [MGLPointAnnotation new]; - marker.coordinate = [tester.mapView convertPoint:point toCoordinateFromView:tester.mapView]; - marker.title = @"test"; // title required for callout - [tester.mapView addAnnotation:marker]; - - XCTAssertEqual(tester.mapView.selectedAnnotations.count, 0); - - [tester.mapView selectAnnotation:marker animated:NO]; - XCTAssertEqualObjects(tester.mapView.selectedAnnotations.firstObject, marker); - - [tester.mapView deselectAnnotation:marker animated:NO]; - XCTAssertEqual(tester.mapView.selectedAnnotations.count, 0); -} - -- (void)testMarkerAddWithoutDelegate { - XCTAssertFalse([tester.viewController respondsToSelector:@selector(mapView:imageForAnnotation:)]); - - MGLPointAnnotation *marker = [MGLPointAnnotation new]; - marker.coordinate = tester.mapView.centerCoordinate; - [tester.mapView addAnnotation:marker]; - - [tester.mapView selectAnnotation:marker animated:NO]; - XCTAssertEqualObjects(tester.mapView.selectedAnnotations.firstObject, marker); - XCTAssertEqual([[tester.mapView subviewsWithClassNamePrefix:@"SM"] count], 0); // no callout for no title - - [tester.mapView deselectAnnotation:marker animated:NO]; - marker.title = @"test"; - [tester.mapView selectAnnotation:marker animated:NO]; - XCTAssertEqualObjects(tester.mapView.selectedAnnotations.firstObject, marker); - XCTAssertGreaterThan([[tester.mapView subviewsWithClassNamePrefix:@"SM"] count], 0); -} - -- (BOOL)mapView:(MGLMapView *)mapView annotationCanShowCallout:(id<MGLAnnotation>)annotation { - return YES; -} - -- (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 bug under toolbar"); - - attributionButtonFrame = [attributionButton.superview convertRect:attributionButton.frame toView:nil]; - XCTAssertFalse(CGRectIntersectsRect(attributionButtonFrame, toolbarFrame), - @"rotated device should not have attribution button under toolbar"); -} - -- (void)testInsetMapView { - [tester.viewController insetMapView]; - [tester waitForAnimationsToFinish]; - - UIView *logoBug = (UIView *)[tester waitForViewWithAccessibilityLabel:@"Mapbox logo"]; - UIView *attributionButton = (UIView *)[tester waitForViewWithAccessibilityLabel:@"Attribution info"]; - - CGRect mapViewFrame = [tester.mapView.superview convertRect:tester.mapView.frame toView:nil]; - - CGRect logoBugFrame = [logoBug.superview convertRect:logoBug.frame toView:nil]; - XCTAssertTrue(CGRectIntersectsRect(logoBugFrame, mapViewFrame), - @"logo bug should lie inside shrunken map view"); - - CGRect attributionButtonFrame = [attributionButton.superview convertRect:attributionButton.frame toView:nil]; - XCTAssertTrue(CGRectIntersectsRect(attributionButtonFrame, mapViewFrame), - @"attribution button should lie inside shrunken map view"); - - CGRect compassFrame = [tester.compass.superview convertRect:tester.compass.frame toView:nil]; - XCTAssertTrue(CGRectIntersectsRect(compassFrame, mapViewFrame), - @"compass should lie inside shrunken map view"); -} - -- (void)testDelegateRegionWillChange { - __block NSUInteger unanimatedCount; - __block NSUInteger animatedCount; - [[NSNotificationCenter defaultCenter] addObserverForName:@"regionWillChangeAnimated" - object:tester.mapView - queue:nil - usingBlock:^(NSNotification *note) { - if ([note.userInfo[@"animated"] boolValue]) { - animatedCount++; - } else { - unanimatedCount++; - } - }]; - - [tester waitForTimeInterval:1]; - - unanimatedCount = 0; - animatedCount = 0; - - NSNotification *notification = [system waitForNotificationName:@"regionWillChangeAnimated" - object:tester.mapView - whileExecutingBlock:^{ - tester.mapView.centerCoordinate = CLLocationCoordinate2DMake(0, 0); - }]; - - [tester waitForTimeInterval:1]; - - XCTAssertEqual([notification.userInfo[@"animated"] boolValue], - NO, - @"regionWillChange delegate should not indicate animated change"); - XCTAssertEqual(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]; - - XCTAssertEqual([notification.userInfo[@"animated"] boolValue], - YES, - @"regionWillChange delegate should indicate an animated change"); - XCTAssertEqual(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)mapView:(MGLMapView *)mapView regionDidChangeAnimated:(BOOL)animated { - [[NSNotificationCenter defaultCenter] postNotificationName:@"regionDidChangeAnimated" - object:mapView - userInfo:@{ @"animated" : @(animated) }]; -} - -- (void)testDelegatesStartStopLocatingUser { - NSNotification *notification = [system waitForNotificationName:@"mapViewWillStartLocatingUser" - object:tester.mapView - whileExecutingBlock:^{ - tester.mapView.showsUserLocation = YES; - [self approveLocationIfNeeded]; - }]; - - XCTAssertEqualObjects(notification.name, - @"mapViewWillStartLocatingUser", - @"mapViewWillStartLocatingUser delegate should receive message"); - XCTAssertNotNil([tester.mapView valueForKeyPath:@"locationManager"], - "map view location manager should not be nil"); - - notification = [system waitForNotificationName:@"mapViewDidStopLocatingUser" - object:tester.mapView - whileExecutingBlock:^{ - tester.mapView.showsUserLocation = NO; - }]; - - XCTAssertEqualObjects(notification.name, - @"mapViewDidStopLocatingUser", - @"mapViewDidStopLocatingUser delegate should receive message"); - XCTAssertEqual(tester.mapView.userTrackingMode, - MGLUserTrackingModeNone, - @"user tracking mode should be none"); - XCTAssertNil([tester.mapView valueForKeyPath:@"locationManager"], - "map view location manager should be nil"); -} - -- (void)mapViewWillStartLocatingUser:(MGLMapView *)mapView { - [[NSNotificationCenter defaultCenter] postNotificationName:@"mapViewWillStartLocatingUser" object:mapView]; -} - -- (void)mapViewDidStopLocatingUser:(MGLMapView *)mapView { - [[NSNotificationCenter defaultCenter] postNotificationName:@"mapViewDidStopLocatingUser" object:mapView]; -} - -@end |