[ios, build] Add tests for MGLMapView pitch setting and tilt gesture
This commit is contained in:
@@ -371,6 +371,7 @@
|
||||
9620BB3A1E69FE1700705A1D /* MGLSDKUpdateChecker.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9620BB371E69FE1700705A1D /* MGLSDKUpdateChecker.mm */; };
|
||||
9620BB3B1E69FE1700705A1D /* MGLSDKUpdateChecker.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9620BB371E69FE1700705A1D /* MGLSDKUpdateChecker.mm */; };
|
||||
9621F2502091020E005B3800 /* NSExpression+MGLAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3510FFEE1D6D9D8C00F413B2 /* NSExpression+MGLAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
96381C0222C6F3950053497D /* MGLMapViewPitchTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 96381C0122C6F3950053497D /* MGLMapViewPitchTests.m */; };
|
||||
9654C1261FFC1AB900DB6A19 /* MGLPolyline_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9654C1251FFC1AB900DB6A19 /* MGLPolyline_Private.h */; };
|
||||
9654C1291FFC1CCD00DB6A19 /* MGLPolygon_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9654C1271FFC1CC000DB6A19 /* MGLPolygon_Private.h */; };
|
||||
9658C155204761FC00D8A674 /* MGLMapViewScaleBarTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9658C154204761FC00D8A674 /* MGLMapViewScaleBarTests.m */; };
|
||||
@@ -1102,6 +1103,7 @@
|
||||
960D0C351ECF5AAF008E151F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
|
||||
9620BB361E69FE1700705A1D /* MGLSDKUpdateChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLSDKUpdateChecker.h; sourceTree = "<group>"; };
|
||||
9620BB371E69FE1700705A1D /* MGLSDKUpdateChecker.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = MGLSDKUpdateChecker.mm; sourceTree = "<group>"; };
|
||||
96381C0122C6F3950053497D /* MGLMapViewPitchTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLMapViewPitchTests.m; sourceTree = "<group>"; };
|
||||
9654C1251FFC1AB900DB6A19 /* MGLPolyline_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLPolyline_Private.h; sourceTree = "<group>"; };
|
||||
9654C1271FFC1CC000DB6A19 /* MGLPolygon_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLPolygon_Private.h; sourceTree = "<group>"; };
|
||||
9658C154204761FC00D8A674 /* MGLMapViewScaleBarTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLMapViewScaleBarTests.m; sourceTree = "<group>"; };
|
||||
@@ -2035,6 +2037,7 @@
|
||||
DA695425215B1E75002041A4 /* MGLMapCameraTests.m */,
|
||||
96ED34DD22374C0900E9FCA9 /* MGLMapViewDirectionTests.mm */,
|
||||
16376B481FFEED010000563E /* MGLMapViewLayoutTests.m */,
|
||||
96381C0122C6F3950053497D /* MGLMapViewPitchTests.m */,
|
||||
9658C154204761FC00D8A674 /* MGLMapViewScaleBarTests.m */,
|
||||
076171C22139C70900668A35 /* MGLMapViewTests.m */,
|
||||
1F95931C1E6DE2E900D5B294 /* MGLNSDateAdditionsTests.mm */,
|
||||
@@ -3240,6 +3243,7 @@
|
||||
96036A0620059BBA00510F3D /* MGLNSOrthographyAdditionsTests.m in Sources */,
|
||||
1F95931D1E6DE2E900D5B294 /* MGLNSDateAdditionsTests.mm in Sources */,
|
||||
DA695426215B1E76002041A4 /* MGLMapCameraTests.m in Sources */,
|
||||
96381C0222C6F3950053497D /* MGLMapViewPitchTests.m in Sources */,
|
||||
CA8FBC0921A47BB100D1203C /* MGLRendererConfigurationTests.mm in Sources */,
|
||||
CAD9D0AA22A86D6F001B25EE /* MGLResourceTests.mm in Sources */,
|
||||
DD58A4C61D822BD000E1F038 /* MGLExpressionTests.mm in Sources */,
|
||||
|
||||
155
platform/ios/test/MGLMapViewPitchTests.m
Normal file
155
platform/ios/test/MGLMapViewPitchTests.m
Normal file
@@ -0,0 +1,155 @@
|
||||
#import <Mapbox/Mapbox.h>
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
@interface MockUIPanGestureRecognizer : UIPanGestureRecognizer
|
||||
@property CGFloat mbx_tiltGestureYTranslation;
|
||||
@property NSUInteger mbx_numberOfFingersForGesture;
|
||||
@end
|
||||
|
||||
@implementation MockUIPanGestureRecognizer
|
||||
- (instancetype)initWithTarget:(id)target action:(SEL)action {
|
||||
if (self = [super initWithTarget:target action:action]) {
|
||||
self.mbx_tiltGestureYTranslation = 0;
|
||||
self.mbx_numberOfFingersForGesture = 2;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
- (NSUInteger)numberOfTouches { return self.mbx_numberOfFingersForGesture; }
|
||||
- (CGPoint)translationInView:(UIView *)view { return CGPointMake(0, self.mbx_tiltGestureYTranslation); }
|
||||
- (void)setTiltGestureYTranslationForPitchDegrees:(CGFloat)degrees {
|
||||
// The tilt gesture takes the number of screen points the fingers have moved and then divides them by a "slowdown" factor, which happens to be set to 2.0 in -[MGLMapView handleTwoFingerDragGesture:].
|
||||
self.mbx_tiltGestureYTranslation = -(degrees * 2.0);
|
||||
}
|
||||
@end
|
||||
|
||||
// Forward declare relevant private methods
|
||||
@interface MGLMapView (MGLMapViewPitchTests)
|
||||
- (void)handleTwoFingerDragGesture:(UIPanGestureRecognizer *)rotate;
|
||||
- (MGLMapCamera *)cameraByTiltingToPitch:(CGFloat)pitch;
|
||||
@end
|
||||
|
||||
@interface MGLMapViewPitchTests : XCTestCase
|
||||
@property (nonatomic) MGLMapView *mapView;
|
||||
@end
|
||||
|
||||
@implementation MGLMapViewPitchTests
|
||||
|
||||
- (void)setUp {
|
||||
[super setUp];
|
||||
|
||||
[MGLAccountManager setAccessToken:@"pk.feedcafedeadbeefbadebede"];
|
||||
NSURL *styleURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"one-liner" withExtension:@"json"];
|
||||
self.mapView = [[MGLMapView alloc] initWithFrame:CGRectMake(0, 0, 400, 400) styleURL:styleURL];
|
||||
}
|
||||
|
||||
- (void)tearDown {
|
||||
self.mapView = nil;
|
||||
[MGLAccountManager setAccessToken:nil];
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testPitchEnabled {
|
||||
self.mapView.pitchEnabled = NO;
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:30];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, 30, 0.001, @"Tilt should not be set when pitchEnabled = NO.");
|
||||
|
||||
self.mapView.pitchEnabled = YES;
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:30];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, 30, 0.001, @"Tilt should be set when pitchEnabled = YES.");
|
||||
}
|
||||
|
||||
- (void)testPitchInValidRange {
|
||||
for (NSNumber *degrees in @[@0, @5, @20, @40, @60]) {
|
||||
CGFloat inputDegrees = [degrees floatValue];
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:inputDegrees];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, inputDegrees, 0.001, @"Tilt should be able to be set within range 0-60°.");
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testNegativePitchClamping {
|
||||
for (NSNumber *degrees in @[@CGFLOAT_MIN, @-999, @-60, @-30, @-0]) {
|
||||
CGFloat inputDegrees = [degrees floatValue];
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:inputDegrees];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, 0, 0.001, @"Minimum tilt should be clamped to 0°.");
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testPositivePitchClamping {
|
||||
for (NSNumber *degrees in @[@61, @90, @999, @CGFLOAT_MAX]) {
|
||||
CGFloat inputDegrees = [degrees floatValue];
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:inputDegrees];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, 60, 0.001, @"Maximum tilt should be clamped to 60°.");
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testPitchAtVariousZoomLevels {
|
||||
for (NSNumber *zoomLevel in @[@0, @5, @10, @15, @18, @21, @CGFLOAT_MAX]) {
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:0];
|
||||
self.mapView.zoomLevel = 0;
|
||||
|
||||
CGFloat inputZoomLevel = [zoomLevel floatValue];
|
||||
self.mapView.zoomLevel = inputZoomLevel;
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:30];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, 30, 0.001, @"Tilting should be allowed at z%.f.", inputZoomLevel);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testTiltGesture {
|
||||
MockUIPanGestureRecognizer *gesture = [[MockUIPanGestureRecognizer alloc] initWithTarget:self.mapView action:nil];
|
||||
gesture.state = UIGestureRecognizerStateBegan;
|
||||
[self.mapView handleTwoFingerDragGesture:gesture];
|
||||
XCTAssertEqual(self.mapView.camera.pitch, 0, @"Pitch should initially be set to 0°.");
|
||||
|
||||
// Use a tilt gesture to tilt the map within its acceptable range (0-60°).
|
||||
for (NSNumber *degrees in @[@0, @5, @20, @40, @60]) {
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:0];
|
||||
gesture.state = UIGestureRecognizerStateChanged;
|
||||
|
||||
CGFloat inputDegrees = [degrees floatValue];
|
||||
[gesture setTiltGestureYTranslationForPitchDegrees:inputDegrees];
|
||||
[self.mapView handleTwoFingerDragGesture:gesture];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, inputDegrees, 0.001, @"Pitch should be set to %.f°.", inputDegrees);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testTiltGestureFromInitialTilt {
|
||||
CGFloat initialTilt = 20;
|
||||
CGFloat additionalTilt = 30;
|
||||
|
||||
// Set the map camera to a pitched state, perhaps from a previous gesture or camera movement.
|
||||
self.mapView.camera = [self.mapView cameraByTiltingToPitch:initialTilt];
|
||||
XCTAssertEqual(self.mapView.camera.pitch, initialTilt, @"Tilt should initially be set to %.f°.", initialTilt);
|
||||
|
||||
// Initialize a tilt gesture.
|
||||
MockUIPanGestureRecognizer *gesture = [[MockUIPanGestureRecognizer alloc] initWithTarget:self.mapView action:nil];
|
||||
gesture.state = UIGestureRecognizerStateBegan;
|
||||
[self.mapView handleTwoFingerDragGesture:gesture];
|
||||
|
||||
// Use the gesture to tilt the map even more.
|
||||
gesture.state = UIGestureRecognizerStateChanged;
|
||||
[gesture setTiltGestureYTranslationForPitchDegrees:additionalTilt];
|
||||
[self.mapView handleTwoFingerDragGesture:gesture];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, initialTilt + additionalTilt, 0.001, @"Tilt should be set to %.f°.", initialTilt + additionalTilt);
|
||||
}
|
||||
|
||||
- (void)testTiltGestureNumberOfFingersRequired {
|
||||
// Initialize a tilt gesture with two fingers.
|
||||
MockUIPanGestureRecognizer *gesture = [[MockUIPanGestureRecognizer alloc] initWithTarget:self.mapView action:nil];
|
||||
gesture.state = UIGestureRecognizerStateBegan;
|
||||
gesture.mbx_numberOfFingersForGesture = 2;
|
||||
|
||||
// Use the gesture to tilt to 30°.
|
||||
[gesture setTiltGestureYTranslationForPitchDegrees:30];
|
||||
[self.mapView handleTwoFingerDragGesture:gesture];
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, 30, 0.001, @"Tilt gesture should work with two fingers down.");
|
||||
|
||||
// Change the gesture's number of fingers to one and try to update the pitch.
|
||||
gesture.mbx_numberOfFingersForGesture = 1;
|
||||
gesture.state = UIGestureRecognizerStateChanged;
|
||||
[gesture setTiltGestureYTranslationForPitchDegrees:0];
|
||||
[self.mapView handleTwoFingerDragGesture:gesture];
|
||||
XCTAssertEqual(gesture.state, UIGestureRecognizerStateEnded, @"Gesture should end when the number of fingers is less than two.");
|
||||
XCTAssertEqualWithAccuracy(self.mapView.camera.pitch, 30, 0.001, @"Pitch should remain unchanged if gesture has ended.");
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user