1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#import <Mapbox/Mapbox.h>
#import <XCTest/XCTest.h>
#import <mbgl/math/wrap.hpp>
@interface MGLMapView (MGLCompassButtonTests)
- (void)resetNorthAnimated:(BOOL)animated;
@end
@interface MGLCompassButtonTests : XCTestCase
@property (nonatomic) MGLMapView *mapView;
@end
@implementation MGLCompassButtonTests
- (void)setUp {
[super setUp];
[MGLAccountManager setAccessToken:@"pk.feedcafedeadbeefbadebede"];
NSURL *styleURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"one-liner" withExtension:@"json"];
self.mapView = [[MGLMapView alloc] initWithFrame:UIScreen.mainScreen.bounds styleURL:styleURL];
}
- (void)tearDown {
self.mapView = nil;
[MGLAccountManager setAccessToken:nil];
[super tearDown];
}
- (void)testCompassButton {
XCTAssertNotNil(self.mapView.compassView);
XCTAssertTrue([self.mapView.compassView isKindOfClass:[MGLCompassButton class]]);
XCTAssertTrue(self.mapView.compassView.userInteractionEnabled);
XCTAssertEqual(self.mapView.compassView.gestureRecognizers.count, (unsigned long)1);
XCTAssertEqual(self.mapView.compassView.accessibilityTraits, UIAccessibilityTraitButton);
XCTAssertNotNil(self.mapView.compassView.accessibilityLabel);
XCTAssertNotNil(self.mapView.compassView.accessibilityHint);
}
- (void)testVisibilityAdaptive {
XCTAssertEqual(self.mapView.compassView.compassVisibility, MGLOrnamentVisibilityAdaptive, @"Adaptive should be the default visibility setting.");
XCTAssertEqual(self.mapView.compassView.alpha, 0, @"Compass should not initially be visible.");
self.mapView.zoomLevel = 15.f;
[self.mapView setDirection:45.f animated:false];
XCTAssertEqualWithAccuracy(self.mapView.direction, 45, 0.001);
XCTAssertEqual(self.mapView.compassView.alpha, 1, @"Compass should become visible when direction changes.");
[self.mapView resetNorthAnimated:NO];
XCTAssertEqual(self.mapView.direction, 0);
XCTAssertEqual(self.mapView.compassView.alpha, 0, @"Compass should hide itself when direction is north.");
}
- (void)testVisibilityHidden {
self.mapView.compassView.compassVisibility = MGLOrnamentVisibilityHidden;
XCTAssertEqual(self.mapView.compassView.compassVisibility, MGLOrnamentVisibilityHidden);
XCTAssertEqual(self.mapView.compassView.alpha, 0, @"Compass should not initially be visible.");
self.mapView.zoomLevel = 15.f;
[self.mapView setDirection:45.f animated:false];
XCTAssertEqualWithAccuracy(self.mapView.direction, 45, 0.001);
XCTAssertEqual(self.mapView.compassView.alpha, 0, @"Compass should stay hidden when direction changes.");
}
- (void)testVisibilityVisible {
self.mapView.compassView.compassVisibility = MGLOrnamentVisibilityVisible;
XCTAssertEqual(self.mapView.compassView.compassVisibility, MGLOrnamentVisibilityVisible);
XCTAssertEqual(self.mapView.compassView.alpha, 1, @"Compass should initially be visible.");
self.mapView.zoomLevel = 15.f;
[self.mapView setDirection:45.f animated:false];
XCTAssertEqualWithAccuracy(self.mapView.direction, 45, 0.001);
XCTAssertEqual(self.mapView.compassView.alpha, 1, @"Compass should continue to be visible when direction changes.");
[self.mapView resetNorthAnimated:NO];
XCTAssertEqual(self.mapView.direction, 0);
XCTAssertEqual(self.mapView.compassView.alpha, 1, @"Compass should continue to be visible when direction is north.");
}
- (void)testCompassRotation {
self.mapView.zoomLevel = 15;
for (NSNumber *degrees in @[@-999, @-359, @-240, @-180, @-90, @-45, @0, @45, @90, @180, @240, @360, @999]) {
self.mapView.direction = [degrees doubleValue];
CGFloat wrappedDirection = mbgl::util::wrap(-self.mapView.direction, 0., 360.);
CGAffineTransform rotation = CGAffineTransformMakeRotation(MGLRadiansFromDegrees(wrappedDirection));
XCTAssertTrue(CGAffineTransformEqualToTransform(self.mapView.compassView.transform, rotation),
@"Compass transform direction %f° should equal wrapped transform direction %f° (~%.f°).", [self degreesFromAffineTransform:self.mapView.compassView.transform], [self degreesFromAffineTransform:rotation], wrappedDirection);
}
}
- (CGFloat)degreesFromAffineTransform:(CGAffineTransform)transform {
CGFloat angle = atan2f(transform.b, transform.a);
return MGLDegreesFromRadians(angle);
}
@end
|