Files
MapLibreParticleLab/platform/ios/test/MGLMapViewGestureRecognizerTests.mm
Fabian Guerra Soto 5c565a5e51 [ios] Fixes an issue that caused the ornaments ignore contentInset property. (#15584)
* [ios] Add mapView content inset tests.

* [ios] Fix an issue that caused the ornaments ignore the contentInsets.

Fixed an issue that caused ornaments ignore the contentInset. Added a new property automaticallyAdjustContentInset that has the same purpose as UIViewController. automaticallyAdjustsScrollViewInsets. This was changed due to the latter being deprecated.

* [ios] Fix automaticallyAdjustsScrollViewInsets legacy behavior.

The property automaticallyAdjustsScrollViewInsets overrode automaticallyAdjustsScrollViewInsets which caused a breaking change. This is fixed to consider the legacy property when calculating the content insets and added tests for both cases.

* [ios] Fix the contentInset value after adding padding to the camera.

Fixed an issue that caused a discrepancy between the contentInset in MGLMapView and the padding in the transformation state.

When padding is passed through methods such as setCamera it’s persisted. This fix resets the contentInsets.

* [ios] Fix pinch test.

* [ios] Update automaticallyAdjustsScrollViewInsets name and documentation.

* [ios] Update changelog.
2019-10-04 17:13:00 -07:00

281 lines
14 KiB
Plaintext

#import <Mapbox/Mapbox.h>
#import <XCTest/XCTest.h>
#import "../../darwin/src/MGLGeometry_Private.h"
#import "MGLMockGestureRecognizers.h"
#include <mbgl/map/map.hpp>
#include <mbgl/map/camera.hpp>
@interface MGLMapView (MGLMapViewGestureRecognizerTests)
- (mbgl::Map &)mbglMap;
- (void)handlePinchGesture:(UIPinchGestureRecognizer *)pinch;
- (void)handleRotateGesture:(UIRotationGestureRecognizer *)rotate;
- (void)handleDoubleTapGesture:(UITapGestureRecognizer *)doubleTap;
- (void)handleTwoFingerTapGesture:(UITapGestureRecognizer *)twoFingerTap;
- (void)handleQuickZoomGesture:(UILongPressGestureRecognizer *)quickZoom;
- (void)handleTwoFingerDragGesture:(UIPanGestureRecognizer *)twoFingerDrag;
@end
@interface MGLMapViewGestureRecognizerTests : XCTestCase <MGLMapViewDelegate>
@property (nonatomic) MGLMapView *mapView;
@property (nonatomic) UIWindow *window;
@property (nonatomic) UIViewController *viewController;
@property (nonatomic) XCTestExpectation *styleLoadingExpectation;
@property (nonatomic) XCTestExpectation *twoFingerExpectation;
@property (nonatomic) XCTestExpectation *quickZoomExpectation;
@property (nonatomic) XCTestExpectation *doubleTapExpectation;
@property (nonatomic) XCTestExpectation *twoFingerDragExpectation;
@property (assign) CGRect screenBounds;
@end
@implementation MGLMapViewGestureRecognizerTests
- (void)setUp {
[super setUp];
[MGLAccountManager setAccessToken:@"pk.feedcafedeadbeefbadebede"];
NSURL *styleURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"one-liner" withExtension:@"json"];
self.screenBounds = UIScreen.mainScreen.bounds;
self.mapView = [[MGLMapView alloc] initWithFrame:self.screenBounds styleURL:styleURL];
self.mapView.zoomLevel = 16;
self.mapView.delegate = self;
self.viewController = [[UIViewController alloc] init];
self.viewController.view = [[UIView alloc] initWithFrame:self.screenBounds];
[self.viewController.view addSubview:self.mapView];
self.window = [[UIWindow alloc] initWithFrame:self.screenBounds];
[self.window addSubview:self.viewController.view];
[self.window makeKeyAndVisible];
if (!self.mapView.style) {
_styleLoadingExpectation = [self expectationWithDescription:@"Map view should finish loading style."];
[self waitForExpectationsWithTimeout:10 handler:nil];
}
}
- (void)mapView:(MGLMapView *)mapView didFinishLoadingStyle:(MGLStyle *)style {
XCTAssertNotNil(mapView.style);
XCTAssertEqual(mapView.style, style);
[_styleLoadingExpectation fulfill];
}
- (void)testHandlePinchGestureContentInset {
UIEdgeInsets contentInset = UIEdgeInsetsZero;
self.mapView.contentInset = contentInset;
mbgl::EdgeInsets padding = MGLEdgeInsetsFromNSEdgeInsets(self.mapView.contentInset);
auto cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"MGLMapView's contentInset property should match camera's padding.");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
[self.mapView setCamera:self.mapView.camera withDuration:0.1 animationTimingFunction:nil edgePadding:contentInset completionHandler:nil];
XCTAssertFalse(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertNotEqual(padding, cameraPadding);
UIPinchGestureRecognizerMock *pinchGesture = [[UIPinchGestureRecognizerMock alloc] initWithTarget:nil action:nil];
pinchGesture.state = UIGestureRecognizerStateBegan;
pinchGesture.scale = 1.0;
[self.mapView handlePinchGesture:pinchGesture];
XCTAssertNotEqual(padding, cameraPadding);
pinchGesture.state = UIGestureRecognizerStateChanged;
[self.mapView handlePinchGesture:pinchGesture];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
pinchGesture.state = UIGestureRecognizerStateEnded;
[self.mapView handlePinchGesture:pinchGesture];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
}
- (void)testHandleRotateGestureContentInset {
UIEdgeInsets contentInset = UIEdgeInsetsZero;
self.mapView.contentInset = contentInset;
mbgl::EdgeInsets padding = MGLEdgeInsetsFromNSEdgeInsets(self.mapView.contentInset);
auto cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"MGLMapView's contentInset property should match camera's padding.");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
[self.mapView setCamera:self.mapView.camera withDuration:0.1 animationTimingFunction:nil edgePadding:contentInset completionHandler:nil];
XCTAssertFalse(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertNotEqual(padding, cameraPadding);
UIRotationGestureRecognizerMock *rotateGesture = [[UIRotationGestureRecognizerMock alloc] initWithTarget:nil action:nil];
rotateGesture.state = UIGestureRecognizerStateBegan;
rotateGesture.rotation = 1;
[self.mapView handleRotateGesture:rotateGesture];
XCTAssertNotEqual(padding, cameraPadding);
rotateGesture.state = UIGestureRecognizerStateChanged;
[self.mapView handleRotateGesture:rotateGesture];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
rotateGesture.state = UIGestureRecognizerStateEnded;
[self.mapView handleRotateGesture:rotateGesture];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
}
- (void)testHandleDoubleTapGestureContentInset {
UIEdgeInsets contentInset = UIEdgeInsetsMake(1, 1, 1, 1);
self.mapView.contentInset = contentInset;
mbgl::EdgeInsets padding = MGLEdgeInsetsFromNSEdgeInsets(self.mapView.contentInset);
auto cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"MGLMapView's contentInset property should match camera's padding.");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
[self.mapView setCamera:self.mapView.camera withDuration:0.1 animationTimingFunction:nil edgePadding:contentInset completionHandler:nil];
XCTAssertFalse(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertNotEqual(padding, cameraPadding);
UITapGestureRecognizerMock *doubleTapGesture = [[UITapGestureRecognizerMock alloc] initWithTarget:nil action:nil];
doubleTapGesture.mockTappedView = self.mapView;
doubleTapGesture.mockTappedPoint = CGPointMake(1.0, 1.0);
[self.mapView handleDoubleTapGesture:doubleTapGesture];
_doubleTapExpectation = [self expectationWithDescription:@"Double tap gesture animation."];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self->_doubleTapExpectation fulfill];
});
[self waitForExpectationsWithTimeout:10 handler:nil];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
}
- (void)testHandleTwoFingerTapGesture {
UIEdgeInsets contentInset = UIEdgeInsetsZero;
self.mapView.contentInset = contentInset;
mbgl::EdgeInsets padding = MGLEdgeInsetsFromNSEdgeInsets(self.mapView.contentInset);
auto cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"MGLMapView's contentInset property should match camera's padding.");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
[self.mapView setCamera:self.mapView.camera withDuration:0.1 animationTimingFunction:nil edgePadding:contentInset completionHandler:nil];
XCTAssertFalse(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertNotEqual(padding, cameraPadding);
UITapGestureRecognizerMock *twoFingerTap = [[UITapGestureRecognizerMock alloc] initWithTarget:nil action:nil];
twoFingerTap.mockTappedView = self.mapView;
twoFingerTap.mockTappedPoint = CGPointMake(1.0, 1.0);
[self.mapView handleTwoFingerTapGesture:twoFingerTap];
_twoFingerExpectation = [self expectationWithDescription:@"Two Finger tap gesture animation."];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self->_twoFingerExpectation fulfill];
});
[self waitForExpectationsWithTimeout:10 handler:nil];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
}
- (void)testHandleQuickZoomGesture {
UIEdgeInsets contentInset = UIEdgeInsetsZero;
self.mapView.contentInset = contentInset;
mbgl::EdgeInsets padding = MGLEdgeInsetsFromNSEdgeInsets(self.mapView.contentInset);
auto cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"MGLMapView's contentInset property should match camera's padding.");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
[self.mapView setCamera:self.mapView.camera withDuration:0.1 animationTimingFunction:nil edgePadding:contentInset completionHandler:nil];
XCTAssertFalse(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertNotEqual(padding, cameraPadding);
UILongPressGestureRecognizerMock *quickZoom = [[UILongPressGestureRecognizerMock alloc] initWithTarget:nil action:nil];
quickZoom.state = UIGestureRecognizerStateBegan;
[self.mapView handleQuickZoomGesture:quickZoom];
XCTAssertNotEqual(padding, cameraPadding);
quickZoom.state = UIGestureRecognizerStateChanged;
quickZoom.mockTappedPoint = CGPointMake(self.mapView.frame.size.width / 2, self.mapView.frame.size.height / 2);
[self.mapView handleQuickZoomGesture:quickZoom];
_quickZoomExpectation = [self expectationWithDescription:@"Quick zoom gesture animation."];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self->_quickZoomExpectation fulfill];
});
[self waitForExpectationsWithTimeout:10 handler:nil];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
quickZoom.state = UIGestureRecognizerStateEnded;
[self.mapView handleQuickZoomGesture:quickZoom];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
}
- (void)testHandleTwoFingerDragGesture {
UIEdgeInsets contentInset = UIEdgeInsetsZero;
self.mapView.contentInset = contentInset;
mbgl::EdgeInsets padding = MGLEdgeInsetsFromNSEdgeInsets(self.mapView.contentInset);
auto cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"MGLMapView's contentInset property should match camera's padding.");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
[self.mapView setCamera:self.mapView.camera withDuration:0.1 animationTimingFunction:nil edgePadding:contentInset completionHandler:nil];
XCTAssertFalse(UIEdgeInsetsEqualToEdgeInsets(self.mapView.contentInset, contentInset));
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertNotEqual(padding, cameraPadding);
UIPanGestureRecognizerMock *twoFingerDrag = [[UIPanGestureRecognizerMock alloc] initWithTarget:nil action:nil];
twoFingerDrag.state = UIGestureRecognizerStateBegan;
twoFingerDrag.firstFingerPoint = CGPointMake(self.mapView.frame.size.width / 3, self.mapView.frame.size.height/2);
twoFingerDrag.secondFingerPoint = CGPointMake((self.mapView.frame.size.width / 2), self.mapView.frame.size.height/2);
twoFingerDrag.numberOfTouches = 2;
[self.mapView handleTwoFingerDragGesture:twoFingerDrag];
XCTAssertNotEqual(padding, cameraPadding);
twoFingerDrag.state = UIGestureRecognizerStateChanged;
twoFingerDrag.firstFingerPoint = CGPointMake(self.mapView.frame.size.width / 3, (self.mapView.frame.size.height/2)-10);
twoFingerDrag.secondFingerPoint = CGPointMake((self.mapView.frame.size.width / 2), (self.mapView.frame.size.height/2)-10);
[self.mapView handleTwoFingerDragGesture:twoFingerDrag];
_twoFingerDragExpectation = [self expectationWithDescription:@"Quick zoom gesture animation."];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self->_twoFingerDragExpectation fulfill];
});
[self waitForExpectationsWithTimeout:10 handler:nil];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
twoFingerDrag.state = UIGestureRecognizerStateEnded;
[self.mapView handleTwoFingerDragGesture:twoFingerDrag];
cameraPadding = self.mapView.mbglMap.getCameraOptions().padding;
XCTAssertEqual(padding, cameraPadding, @"When a gesture recognizer is performed contentInsets and camera padding should match.");
}
@end