-
Notifications
You must be signed in to change notification settings - Fork 9.7k
[google_maps_flutter] Objective-C code clean up #5780
Changes from 3 commits
b376693
fcd3c69
367466b
fb856e6
459555d
f23fcbe
fccc746
da044f1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,291 @@ | ||
| // Copyright 2013 The Flutter Authors. All rights reserved. | ||
| // Use of this source code is governed by a BSD-style license that can be | ||
| // found in the LICENSE file. | ||
|
|
||
| @import google_maps_flutter; | ||
| @import google_maps_flutter.Test; | ||
| @import XCTest; | ||
| @import MapKit; | ||
| @import GoogleMaps; | ||
|
|
||
| #import <OCMock/OCMock.h> | ||
| #import "PartiallyMockedMapView.h" | ||
|
|
||
| @interface FLTGoogleMapJSONConversionsTests : XCTestCase | ||
| @end | ||
|
|
||
| @implementation FLTGoogleMapJSONConversionsTests | ||
|
|
||
| - (void)testLocationFromLatlong { | ||
| NSArray<NSNumber *> *latlong = @[ @(1), @(2) ]; | ||
| CLLocationCoordinate2D location = [FLTGoogleMapJSONConversions locationFromLatlong:latlong]; | ||
| XCTAssertEqual(location.latitude, 1); | ||
| XCTAssertEqual(location.longitude, 2); | ||
| } | ||
|
|
||
| - (void)testPointFromArray { | ||
| NSArray<NSNumber *> *array = @[ @(1), @(2) ]; | ||
| CGPoint point = [FLTGoogleMapJSONConversions pointFromArray:array]; | ||
| XCTAssertEqual(point.x, 1); | ||
| XCTAssertEqual(point.y, 2); | ||
| } | ||
|
|
||
| - (void)testArrayFromLocation { | ||
| CLLocationCoordinate2D location = CLLocationCoordinate2DMake(1, 2); | ||
| NSArray<NSNumber *> *array = [FLTGoogleMapJSONConversions arrayFromLocation:location]; | ||
| XCTAssertEqual([array[0] integerValue], 1); | ||
| XCTAssertEqual([array[1] integerValue], 2); | ||
| } | ||
|
|
||
| - (void)testColorFromRGBA { | ||
| NSNumber *rgba = @(0x01020304); | ||
| UIColor *color = [FLTGoogleMapJSONConversions colorFromRGBA:rgba]; | ||
| CGFloat red, green, blue, alpha; | ||
| BOOL success = [color getRed:&red green:&green blue:&blue alpha:&alpha]; | ||
| XCTAssertTrue(success); | ||
| const CGFloat accuracy = 0.0001; | ||
| XCTAssertEqualWithAccuracy(red, 2 / 255.0, accuracy); | ||
| XCTAssertEqualWithAccuracy(green, 3 / 255.0, accuracy); | ||
| XCTAssertEqualWithAccuracy(blue, 4 / 255.0, accuracy); | ||
| XCTAssertEqualWithAccuracy(alpha, 1 / 255.0, accuracy); | ||
| } | ||
|
|
||
| - (void)testPointsFromLatlongs { | ||
| NSArray<NSArray *> *latlongs = @[ @[ @(1), @(2) ], @[ @(3), @(4) ] ]; | ||
| NSArray<CLLocation *> *locations = [FLTGoogleMapJSONConversions pointsFromLatlongs:latlongs]; | ||
| XCTAssertEqual(locations.count, 2); | ||
| XCTAssertEqual(locations[0].coordinate.latitude, 1); | ||
| XCTAssertEqual(locations[0].coordinate.longitude, 2); | ||
| XCTAssertEqual(locations[1].coordinate.latitude, 3); | ||
| XCTAssertEqual(locations[1].coordinate.longitude, 4); | ||
| } | ||
|
|
||
| - (void)testHolesFromPointsArray { | ||
| NSArray<NSArray *> *pointsArray = | ||
| @[ @[ @[ @(1), @(2) ], @[ @(3), @(4) ] ], @[ @[ @(5), @(6) ], @[ @(7), @(8) ] ] ]; | ||
| NSArray<NSArray<CLLocation *> *> *holes = | ||
| [FLTGoogleMapJSONConversions holesFromPointsArray:pointsArray]; | ||
| XCTAssertEqual(holes.count, 2); | ||
| XCTAssertEqual(holes[0][0].coordinate.latitude, 1); | ||
| XCTAssertEqual(holes[0][0].coordinate.longitude, 2); | ||
| XCTAssertEqual(holes[0][1].coordinate.latitude, 3); | ||
| XCTAssertEqual(holes[0][1].coordinate.longitude, 4); | ||
| XCTAssertEqual(holes[1][0].coordinate.latitude, 5); | ||
| XCTAssertEqual(holes[1][0].coordinate.longitude, 6); | ||
| XCTAssertEqual(holes[1][1].coordinate.latitude, 7); | ||
| XCTAssertEqual(holes[1][1].coordinate.longitude, 8); | ||
| } | ||
|
|
||
| - (void)testDictionaryFromPosition { | ||
| id mockPosition = OCMClassMock([GMSCameraPosition class]); | ||
| NSValue *locationValue = [NSValue valueWithMKCoordinate:CLLocationCoordinate2DMake(1, 2)]; | ||
| [(GMSCameraPosition *)[[mockPosition stub] andReturnValue:locationValue] target]; | ||
| [[[mockPosition stub] andReturnValue:@(2.0)] zoom]; | ||
| [[[mockPosition stub] andReturnValue:@(3.0)] bearing]; | ||
| [[[mockPosition stub] andReturnValue:@(75.0)] viewingAngle]; | ||
| NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromPosition:mockPosition]; | ||
| NSArray *targetArray = @[ @1, @2 ]; | ||
| XCTAssertEqualObjects(dictionary[@"target"], targetArray); | ||
| XCTAssertEqualObjects(dictionary[@"zoom"], @2.0); | ||
| XCTAssertEqualObjects(dictionary[@"bearing"], @3.0); | ||
| XCTAssertEqualObjects(dictionary[@"tilt"], @75.0); | ||
| } | ||
|
|
||
| - (void)testDictionaryFromPoint { | ||
| CGPoint point = CGPointMake(10, 20); | ||
| NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromPoint:point]; | ||
| const CGFloat accuracy = 0.0001; | ||
| XCTAssertEqualWithAccuracy([dictionary[@"x"] floatValue], point.x, accuracy); | ||
| XCTAssertEqualWithAccuracy([dictionary[@"y"] floatValue], point.y, accuracy); | ||
| } | ||
|
|
||
| - (void)testDictionaryFromCoordinateBounds { | ||
| XCTAssertNil([FLTGoogleMapJSONConversions dictionaryFromCoordinateBounds:nil]); | ||
|
|
||
| GMSCoordinateBounds *bounds = | ||
| [[GMSCoordinateBounds alloc] initWithCoordinate:CLLocationCoordinate2DMake(10, 20) | ||
| coordinate:CLLocationCoordinate2DMake(30, 40)]; | ||
| NSDictionary *dictionary = [FLTGoogleMapJSONConversions dictionaryFromCoordinateBounds:bounds]; | ||
| NSArray *southwest = @[ @10, @20 ]; | ||
| NSArray *northeast = @[ @30, @40 ]; | ||
| XCTAssertEqualObjects(dictionary[@"southwest"], southwest); | ||
| XCTAssertEqualObjects(dictionary[@"northeast"], northeast); | ||
| } | ||
|
|
||
| - (void)testCameraPostionFromDictionary { | ||
| XCTAssertNil([FLTGoogleMapJSONConversions cameraPostionFromDictionary:nil]); | ||
|
|
||
| NSDictionary *channelValue = | ||
| @{@"target" : @[ @(1), @(2) ], @"zoom" : @3, @"bearing" : @4, @"tilt" : @5}; | ||
|
|
||
| GMSCameraPosition *cameraPosition = | ||
| [FLTGoogleMapJSONConversions cameraPostionFromDictionary:channelValue]; | ||
|
|
||
| const CGFloat accuracy = 0.001; | ||
| XCTAssertEqualWithAccuracy(cameraPosition.target.latitude, 1, accuracy); | ||
| XCTAssertEqualWithAccuracy(cameraPosition.target.longitude, 2, accuracy); | ||
| XCTAssertEqualWithAccuracy(cameraPosition.zoom, 3, accuracy); | ||
| XCTAssertEqualWithAccuracy(cameraPosition.bearing, 4, accuracy); | ||
| XCTAssertEqualWithAccuracy(cameraPosition.viewingAngle, 5, accuracy); | ||
| } | ||
|
|
||
| - (void)testPointFromDictionary { | ||
| XCTAssertNil([FLTGoogleMapJSONConversions cameraPostionFromDictionary:nil]); | ||
|
|
||
| NSDictionary *dictionary = @{ | ||
| @"x" : @1, | ||
| @"y" : @2, | ||
| }; | ||
|
|
||
| CGPoint point = [FLTGoogleMapJSONConversions pointFromDictionary:dictionary]; | ||
|
|
||
| const CGFloat accuracy = 0.001; | ||
| XCTAssertEqualWithAccuracy(point.x, 1, accuracy); | ||
| XCTAssertEqualWithAccuracy(point.y, 2, accuracy); | ||
| } | ||
|
|
||
| - (void)testCoordinateBoundsFromLatlongs { | ||
| NSArray<NSNumber *> *latlong1 = @[ @(1), @(2) ]; | ||
| NSArray<NSNumber *> *latlong2 = @[ @(3), @(4) ]; | ||
|
|
||
| GMSCoordinateBounds *bounds = | ||
| [FLTGoogleMapJSONConversions coordinateBoundsFromLatlongs:@[ latlong1, latlong2 ]]; | ||
|
|
||
| const CGFloat accuracy = 0.001; | ||
| XCTAssertEqualWithAccuracy(bounds.southWest.latitude, 1, accuracy); | ||
| XCTAssertEqualWithAccuracy(bounds.southWest.longitude, 2, accuracy); | ||
| XCTAssertEqualWithAccuracy(bounds.northEast.latitude, 3, accuracy); | ||
| XCTAssertEqualWithAccuracy(bounds.northEast.longitude, 4, accuracy); | ||
| } | ||
|
|
||
| - (void)testMapViewTypeFromTypeValue { | ||
| XCTAssertEqual(kGMSTypeNormal, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@1]); | ||
| XCTAssertEqual(kGMSTypeSatellite, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@2]); | ||
| XCTAssertEqual(kGMSTypeTerrain, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@3]); | ||
| XCTAssertEqual(kGMSTypeHybrid, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@4]); | ||
| XCTAssertEqual(kGMSTypeNone, [FLTGoogleMapJSONConversions mapViewTypeFromTypeValue:@5]); | ||
| } | ||
|
|
||
| - (void)testCameraUpdateFromChannelValueNewCameraPosition { | ||
| NSArray *channelValue = @[ | ||
| @"newCameraPosition", | ||
| @{@"target" : @[ @(1), @(2) ], @"zoom" : @3, @"bearing" : @4, @"tilt" : @5} | ||
| ]; | ||
| id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); | ||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; | ||
| [[classMockCameraUpdate expect] | ||
| setCamera:[FLTGoogleMapJSONConversions cameraPostionFromDictionary:channelValue[1]]]; | ||
| [classMockCameraUpdate stopMocking]; | ||
| } | ||
|
|
||
| // TODO(cyanglaz): Fix the test for CameraUpdateFromChannelValue with the "NewLatlng" key. | ||
| // 2 approaches have been tried and neither worked for the tests. | ||
| // | ||
| // 1. Use OCMock to vefiry that [GMSCameraUpdate setTarget:] is triggered with the correct value. | ||
| // This class method conflicts with certain category method in OCMock, causing OCMock not able to | ||
| // disambigious them. | ||
| // | ||
| // 2. Directly verify the GMSCameraUpdate object returned by the method. | ||
| // The GMSCameraUpdate object returned from the method doesn't have any accessors to the "target" | ||
| // property. It can be used to update the "camera" property in GMSMapView. However, [GMSMapView | ||
| // moveCamera:] doesn't update the camera immediately. Thus the GMSCameraUpdate object cannot be | ||
| // verified. | ||
| // | ||
| // The code in below test uses the 2nd approach. | ||
| - (void)skip_testCameraUpdateFromChannelValueNewLatlong { | ||
| NSArray *channelValue = @[ @"newLatLng", @[ @1, @2 ] ]; | ||
|
|
||
| GMSCameraUpdate *update = [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; | ||
|
|
||
| GMSMapView *mapView = [[GMSMapView alloc] | ||
| initWithFrame:CGRectZero | ||
| camera:[GMSCameraPosition cameraWithTarget:CLLocationCoordinate2DMake(5, 6) zoom:1]]; | ||
| [mapView moveCamera:update]; | ||
| const CGFloat accuracy = 0.001; | ||
| XCTAssertEqualWithAccuracy(mapView.camera.target.latitude, 1, | ||
| accuracy); // mapView.camera.target.latitude is still 5. | ||
| XCTAssertEqualWithAccuracy(mapView.camera.target.longitude, 2, | ||
| accuracy); // mapView.camera.target.longitude is still 6. | ||
| } | ||
|
|
||
| - (void)testCameraUpdateFromChannelValueNewLatLngBounds { | ||
| NSArray<NSNumber *> *latlong1 = @[ @(1), @(2) ]; | ||
| NSArray<NSNumber *> *latlong2 = @[ @(3), @(4) ]; | ||
| GMSCoordinateBounds *bounds = | ||
| [FLTGoogleMapJSONConversions coordinateBoundsFromLatlongs:@[ latlong1, latlong2 ]]; | ||
|
|
||
| NSArray *channelValue = @[ @"newLatLngBounds", @[ latlong1, latlong2 ], @20 ]; | ||
| id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); | ||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; | ||
|
|
||
| [[classMockCameraUpdate expect] fitBounds:bounds withPadding:20]; | ||
| [classMockCameraUpdate stopMocking]; | ||
| } | ||
|
|
||
| - (void)testCameraUpdateFromChannelValueNewLatLngZoom { | ||
| NSArray *channelValue = @[ @"newLatLngZoom", @[ @1, @2 ], @3 ]; | ||
|
|
||
| id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); | ||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; | ||
|
|
||
| [[classMockCameraUpdate expect] setTarget:CLLocationCoordinate2DMake(1, 2) zoom:3]; | ||
| [classMockCameraUpdate stopMocking]; | ||
| } | ||
|
|
||
| - (void)testCameraUpdateFromChannelValueScrollBy { | ||
| NSArray *channelValue = @[ @"scrollBy", @1, @2 ]; | ||
|
|
||
| id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); | ||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValue]; | ||
|
|
||
| [[classMockCameraUpdate expect] scrollByX:1 Y:2]; | ||
| [classMockCameraUpdate stopMocking]; | ||
| } | ||
|
|
||
| - (void)testCameraUpdateFromChannelValueZoomBy { | ||
| NSArray *channelValueNoPoint = @[ @"zoomBy", @1 ]; | ||
|
|
||
| id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); | ||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; | ||
|
|
||
| [[classMockCameraUpdate expect] zoomBy:1]; | ||
|
|
||
| NSArray *channelValueWithPoint = @[ @"zoomBy", @1, @[ @2, @3 ] ]; | ||
|
|
||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueWithPoint]; | ||
|
|
||
| [[classMockCameraUpdate expect] zoomBy:1 atPoint:CGPointMake(2, 3)]; | ||
| [classMockCameraUpdate stopMocking]; | ||
| } | ||
|
|
||
| - (void)testCameraUpdateFromChannelValueZoomIn { | ||
| NSArray *channelValueNoPoint = @[ @"zoomIn" ]; | ||
|
|
||
| id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); | ||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; | ||
|
|
||
| [[classMockCameraUpdate expect] zoomIn]; | ||
| [classMockCameraUpdate stopMocking]; | ||
| } | ||
|
|
||
| - (void)testCameraUpdateFromChannelValueZoomOut { | ||
| NSArray *channelValueNoPoint = @[ @"zoomOut" ]; | ||
|
|
||
| id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); | ||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; | ||
|
|
||
| [[classMockCameraUpdate expect] zoomOut]; | ||
| [classMockCameraUpdate stopMocking]; | ||
| } | ||
|
|
||
| - (void)testCameraUpdateFromChannelValueZoomTo { | ||
| NSArray *channelValueNoPoint = @[ @"zoomTo", @1 ]; | ||
|
|
||
| id classMockCameraUpdate = OCMClassMock([GMSCameraUpdate class]); | ||
| [FLTGoogleMapJSONConversions cameraUpdateFromChannelValue:channelValueNoPoint]; | ||
|
|
||
| [[classMockCameraUpdate expect] zoomTo:1]; | ||
| [classMockCameraUpdate stopMocking]; | ||
| } | ||
|
|
||
| @end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -24,8 +24,9 @@ NS_ASSUME_NONNULL_BEGIN | |
| @end | ||
|
|
||
| @interface FLTTileProviderController : GMSTileLayer | ||
| @property(copy, nonatomic, readonly) NSString *tileOverlayId; | ||
| - (instancetype)init:(FlutterMethodChannel *)methodChannel tileOverlayId:(NSString *)tileOverlayId; | ||
| @property(copy, nonatomic, readonly) NSString *tileOverlayIdentifier; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Potential follow up: all of these (class, property, method) are missing comments. That's true for a lot of code in the plugin.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated the issue adding a new item about comment/docs: flutter/flutter#102597 |
||
| - (instancetype)init:(FlutterMethodChannel *)methodChannel | ||
| withTileOverlayIdentifier:(NSString *)identifier; | ||
| @end | ||
|
|
||
| @interface FLTTileOverlaysController : NSObject | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Potential follow up: comments.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated the issue adding a new item about comment/docs: flutter/flutter#102597 |
||
|
|
@@ -34,9 +35,9 @@ NS_ASSUME_NONNULL_BEGIN | |
| registrar:(NSObject<FlutterPluginRegistrar> *)registrar; | ||
| - (void)addTileOverlays:(NSArray *)tileOverlaysToAdd; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Potential follow up: Do a sweep over the plugin to add generics to all the collections.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated the issue adding a new item about adding generics to the collection types: flutter/flutter#102597 |
||
| - (void)changeTileOverlays:(NSArray *)tileOverlaysToChange; | ||
| - (void)removeTileOverlayIds:(NSArray *)tileOverlayIdsToRemove; | ||
| - (void)clearTileCache:(NSString *)tileOverlayId; | ||
| - (nullable NSDictionary *)getTileOverlayInfo:(NSString *)tileverlayId; | ||
| - (void)removeTileOverlayWithIdentifiers:(NSArray *)identifiers; | ||
| - (void)clearTileCacheWithIdentifier:(NSString *)identifiers; | ||
|
cyanglaz marked this conversation as resolved.
Outdated
|
||
| - (nullable NSDictionary *)tileOverlayInfoWithIdentifier:(NSString *)identifier; | ||
| @end | ||
|
|
||
| NS_ASSUME_NONNULL_END | ||
Uh oh!
There was an error while loading. Please reload this page.