summaryrefslogtreecommitdiff
path: root/platform/ios/Integration UI Tests/MGLMapRegionChangeEventsTests.m
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios/Integration UI Tests/MGLMapRegionChangeEventsTests.m')
-rw-r--r--platform/ios/Integration UI Tests/MGLMapRegionChangeEventsTests.m122
1 files changed, 122 insertions, 0 deletions
diff --git a/platform/ios/Integration UI Tests/MGLMapRegionChangeEventsTests.m b/platform/ios/Integration UI Tests/MGLMapRegionChangeEventsTests.m
new file mode 100644
index 0000000000..12dfd0ea14
--- /dev/null
+++ b/platform/ios/Integration UI Tests/MGLMapRegionChangeEventsTests.m
@@ -0,0 +1,122 @@
+#import <XCTest/XCTest.h>
+
+#import "MGLTestingSupport.h"
+
+@interface MGLMapRegionChangeEventsTests : XCTestCase
+
+@property (nonatomic) XCUIApplication *app;
+
+@end
+
+@implementation MGLMapRegionChangeEventsTests
+
+- (void)setUp {
+ [super setUp];
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ self.continueAfterFailure = NO;
+ // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
+ self.app = [[XCUIApplication alloc] init];
+ self.app.launchArguments = [self.app.launchArguments arrayByAddingObject:@"useFastAnimations"];
+ [self.app launch];
+}
+
+- (void)tearDown {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ [super tearDown];
+}
+
+- (void)testMapViewRegionChangeEvents {
+
+ __block XCUIElement *mapViewElement;
+ __block NSMutableArray *regionEvents = [NSMutableArray array];
+
+ [XCTContext runActivityNamed:@"Wait for initial render" block:^(id<XCTActivity> _Nonnull activity) {
+ XCUIElementQuery *allQuery = [self.app descendantsMatchingType:XCUIElementTypeAny];
+ mapViewElement = [allQuery elementMatchingType:XCUIElementTypeAny identifier:MGLTestingSupportMapViewID];
+ XCTDarwinNotificationExpectation *expectation = [[XCTDarwinNotificationExpectation alloc] initWithNotificationName:MGLTestingSupportNotificationMapViewRendered];
+ [self waitForExpectations:@[expectation] timeout:15.0];
+ }];
+
+ [XCTContext runActivityNamed:@"Perform guestures" block:^(id<XCTActivity> _Nonnull activity) {
+ XCTDarwinNotificationExpectation *willChangeExpectation = [[XCTDarwinNotificationExpectation alloc] initWithNotificationName:MGLTestingSupportNotificationMapViewRegionWillChange];
+ willChangeExpectation.handler = ^BOOL{
+ // Expect the RegionWillChange event occoured 2 times
+ [regionEvents addObject:MGLTestingSupportNotificationMapViewRegionWillChange];
+ NSArray *events = [regionEvents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF = %@",
+ MGLTestingSupportNotificationMapViewRegionWillChange]];
+ return events.count == 2;
+ };
+
+ XCTDarwinNotificationExpectation *isChangingExpectation = [[XCTDarwinNotificationExpectation alloc] initWithNotificationName:MGLTestingSupportNotificationMapViewRegionIsChanging];
+ isChangingExpectation.handler = ^BOOL{
+ [regionEvents addObject:MGLTestingSupportNotificationMapViewRegionIsChanging];
+ NSArray *events = [regionEvents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF = %@",
+ MGLTestingSupportNotificationMapViewRegionIsChanging]];
+ // Expect the RegionIsChanging event occoured > 2 times
+ return events.count >= 2;
+ };
+
+ XCTDarwinNotificationExpectation *didChangeExpectation = [[XCTDarwinNotificationExpectation alloc] initWithNotificationName:MGLTestingSupportNotificationMapViewRegionDidChanged];
+ didChangeExpectation.handler = ^BOOL{
+ [regionEvents addObject:MGLTestingSupportNotificationMapViewRegionDidChanged];
+ NSArray *events = [regionEvents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF = %@",
+ MGLTestingSupportNotificationMapViewRegionDidChanged]];
+ // Expect the RegionDidChanged event occoured 2 times
+ return events.count == 2;
+ };
+
+ [mapViewElement swipeUp];
+ // TODO: Seems the swipe down guesture performed after previous guesture finished,
+ // Tried to find a method which could interrupt previous guesture and start an new guesture
+ [mapViewElement swipeDown];
+ [self waitForExpectations:@[willChangeExpectation,
+ isChangingExpectation,
+ didChangeExpectation]
+ timeout:10];
+ }];
+
+ /*
+ Verify the events occured as the following order.
+
+ -mapView:regionWillChangeAnimated:
+ -mapViewIsChangingAnimated: many times
+ -mapView:regionDidChangeAnimated:
+ -mapView:regionWillChangeAnimated:
+ -mapViewIsChangingAnimated: many times
+ -mapView:regionDidChangeAnimated:
+ */
+
+ NSIndexSet *willChangePoints = [regionEvents indexesOfObjectsPassingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+ return [obj isEqualToString:MGLTestingSupportNotificationMapViewRegionWillChange];
+ }];
+
+ NSIndexSet *didChangedPoints = [regionEvents indexesOfObjectsPassingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+ return [obj isEqualToString:MGLTestingSupportNotificationMapViewRegionDidChanged];
+ }];
+
+ [XCTContext runActivityNamed:@"Verify events triggered by swipe up" block:^(id<XCTActivity> _Nonnull activity) {
+ [self verifyOrderWithEvents:[regionEvents subarrayWithRange:NSMakeRange(willChangePoints.firstIndex,
+ didChangedPoints.firstIndex - willChangePoints.firstIndex + 1)]];
+ }];
+
+ [XCTContext runActivityNamed:@"Verify events triggered by swipe down" block:^(id<XCTActivity> _Nonnull activity) {
+ [self verifyOrderWithEvents:[regionEvents subarrayWithRange:NSMakeRange(willChangePoints.lastIndex,
+ didChangedPoints.lastIndex - willChangePoints.lastIndex + 1)]];
+ }];
+}
+
+- (void)verifyOrderWithEvents:(NSArray *)events {
+ // All the evets's count should >= 3
+ XCTAssertGreaterThanOrEqual(events.count, 3);
+ // The RegionWillChange event should occoured at first
+ XCTAssertEqual(events.firstObject, MGLTestingSupportNotificationMapViewRegionWillChange);
+ // All the RegionIsChanging event occoured in the process
+ for (NSInteger i = 1; i < events.count - 2; i ++) {
+ XCTAssertEqual(events[i], MGLTestingSupportNotificationMapViewRegionIsChanging);
+ }
+ // The RegionDidChanged event should occoured at end
+ XCTAssertEqual(events.lastObject, MGLTestingSupportNotificationMapViewRegionDidChanged);
+}
+
+@end