#import #import static NSString * const MGLTestAnnotationReuseIdentifer = @"MGLTestAnnotationReuseIdentifer"; @interface MGLCustomAnnotationView : MGLAnnotationView @end @implementation MGLCustomAnnotationView - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier { return [super initWithReuseIdentifier:@"reuse-id"]; } @end @interface MGLAnnotationView (Test) @property (nonatomic) MGLMapView *mapView; @property (nonatomic, readwrite) MGLAnnotationViewDragState dragState; - (void)setDragState:(MGLAnnotationViewDragState)dragState; @end @interface MGLMapView (Test) @property (nonatomic) UIView *calloutViewForSelectedAnnotation; @end @interface MGLTestAnnotation : NSObject @property (nonatomic, assign) CLLocationCoordinate2D coordinate; @end @implementation MGLTestAnnotation @end @interface MGLTestCalloutView: UIView @property (nonatomic) BOOL didCallDismissCalloutAnimated; @property (nonatomic, strong) id representedObject; @property (nonatomic, strong) UIView *leftAccessoryView; @property (nonatomic, strong) UIView *rightAccessoryView; @property (nonatomic, weak) id delegate; @end @implementation MGLTestCalloutView - (void)dismissCalloutAnimated:(BOOL)animated { _didCallDismissCalloutAnimated = YES; } - (void)presentCalloutFromRect:(CGRect)rect inView:(UIView *)view constrainedToView:(UIView *)constrainedView animated:(BOOL)animated { } @end @interface MGLAnnotationViewTests : XCTestCase @property (nonatomic) XCTestExpectation *expectation; @property (nonatomic) MGLMapView *mapView; @property (nonatomic, weak) MGLAnnotationView *annotationView; @end @implementation MGLAnnotationViewTests - (void)setUp { [super setUp]; _mapView = [[MGLMapView alloc] initWithFrame:CGRectMake(0, 0, 64, 64)]; _mapView.delegate = self; } - (void)testAnnotationView { _expectation = [self expectationWithDescription:@"annotation property"]; MGLTestAnnotation *annotation = [[MGLTestAnnotation alloc] init]; [_mapView addAnnotation:annotation]; [self waitForExpectationsWithTimeout:1 handler:nil]; XCTAssert(_mapView.annotations.count == 1, @"number of annotations should be 1"); XCTAssertNotNil(_annotationView.annotation, @"annotation property should not be nil"); XCTAssertNotNil(_annotationView.mapView, @"mapView property should not be nil"); MGLTestCalloutView *testCalloutView = [[MGLTestCalloutView alloc] init]; _mapView.calloutViewForSelectedAnnotation = testCalloutView; _annotationView.dragState = MGLAnnotationViewDragStateStarting; XCTAssertTrue(testCalloutView.didCallDismissCalloutAnimated, @"callout view was not dismissed"); [_mapView removeAnnotation:_annotationView.annotation]; XCTAssert(_mapView.annotations.count == 0, @"number of annotations should be 0"); XCTAssertNil(_annotationView.annotation, @"annotation property should be nil"); } - (void)testCustomAnnotationView { MGLCustomAnnotationView *customAnnotationView = [[MGLCustomAnnotationView alloc] initWithReuseIdentifier:@"reuse-id"]; XCTAssertNotNil(customAnnotationView); } - (MGLAnnotationView *)mapView:(MGLMapView *)mapView viewForAnnotation:(id)annotation { MGLAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:MGLTestAnnotationReuseIdentifer]; if (!annotationView) { annotationView = [[MGLAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:MGLTestAnnotationReuseIdentifer]; } _annotationView = annotationView; return annotationView; } - (void)mapView:(MGLMapView *)mapView didAddAnnotationViews:(NSArray *)annotationViews { [_expectation fulfill]; } @end