|  | // Copyright 2019 The Chromium 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 'package:flutter/services.dart'; | 
|  | import 'package:flutter/widgets.dart'; | 
|  | import 'package:flutter_test/flutter_test.dart'; | 
|  | import 'package:google_maps_flutter/google_maps_flutter.dart'; | 
|  |  | 
|  | import 'fake_maps_controllers.dart'; | 
|  |  | 
|  | Set<Circle> _toSet({Circle c1, Circle c2, Circle c3}) { | 
|  | final Set<Circle> res = Set<Circle>.identity(); | 
|  | if (c1 != null) { | 
|  | res.add(c1); | 
|  | } | 
|  | if (c2 != null) { | 
|  | res.add(c2); | 
|  | } | 
|  | if (c3 != null) { | 
|  | res.add(c3); | 
|  | } | 
|  | return res; | 
|  | } | 
|  |  | 
|  | Widget _mapWithCircles(Set<Circle> circles) { | 
|  | return Directionality( | 
|  | textDirection: TextDirection.ltr, | 
|  | child: GoogleMap( | 
|  | initialCameraPosition: const CameraPosition(target: LatLng(10.0, 15.0)), | 
|  | circles: circles, | 
|  | ), | 
|  | ); | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | TestWidgetsFlutterBinding.ensureInitialized(); | 
|  |  | 
|  | final FakePlatformViewsController fakePlatformViewsController = | 
|  | FakePlatformViewsController(); | 
|  |  | 
|  | setUpAll(() { | 
|  | SystemChannels.platform_views.setMockMethodCallHandler( | 
|  | fakePlatformViewsController.fakePlatformViewsMethodHandler); | 
|  | }); | 
|  |  | 
|  | setUp(() { | 
|  | fakePlatformViewsController.reset(); | 
|  | }); | 
|  |  | 
|  | testWidgets('Initializing a circle', (WidgetTester tester) async { | 
|  | final Circle c1 = Circle(circleId: CircleId("circle_1")); | 
|  | await tester.pumpWidget(_mapWithCircles(_toSet(c1: c1))); | 
|  |  | 
|  | final FakePlatformGoogleMap platformGoogleMap = | 
|  | fakePlatformViewsController.lastCreatedView; | 
|  | expect(platformGoogleMap.circlesToAdd.length, 1); | 
|  |  | 
|  | final Circle initializedCircle = platformGoogleMap.circlesToAdd.first; | 
|  | expect(initializedCircle, equals(c1)); | 
|  | expect(platformGoogleMap.circleIdsToRemove.isEmpty, true); | 
|  | expect(platformGoogleMap.circlesToChange.isEmpty, true); | 
|  | }); | 
|  |  | 
|  | testWidgets("Adding a circle", (WidgetTester tester) async { | 
|  | final Circle c1 = Circle(circleId: CircleId("circle_1")); | 
|  | final Circle c2 = Circle(circleId: CircleId("circle_2")); | 
|  |  | 
|  | await tester.pumpWidget(_mapWithCircles(_toSet(c1: c1))); | 
|  | await tester.pumpWidget(_mapWithCircles(_toSet(c1: c1, c2: c2))); | 
|  |  | 
|  | final FakePlatformGoogleMap platformGoogleMap = | 
|  | fakePlatformViewsController.lastCreatedView; | 
|  | expect(platformGoogleMap.circlesToAdd.length, 1); | 
|  |  | 
|  | final Circle addedCircle = platformGoogleMap.circlesToAdd.first; | 
|  | expect(addedCircle, equals(c2)); | 
|  |  | 
|  | expect(platformGoogleMap.circleIdsToRemove.isEmpty, true); | 
|  |  | 
|  | expect(platformGoogleMap.circlesToChange.isEmpty, true); | 
|  | }); | 
|  |  | 
|  | testWidgets("Removing a circle", (WidgetTester tester) async { | 
|  | final Circle c1 = Circle(circleId: CircleId("circle_1")); | 
|  |  | 
|  | await tester.pumpWidget(_mapWithCircles(_toSet(c1: c1))); | 
|  | await tester.pumpWidget(_mapWithCircles(null)); | 
|  |  | 
|  | final FakePlatformGoogleMap platformGoogleMap = | 
|  | fakePlatformViewsController.lastCreatedView; | 
|  | expect(platformGoogleMap.circleIdsToRemove.length, 1); | 
|  | expect(platformGoogleMap.circleIdsToRemove.first, equals(c1.circleId)); | 
|  |  | 
|  | expect(platformGoogleMap.circlesToChange.isEmpty, true); | 
|  | expect(platformGoogleMap.circlesToAdd.isEmpty, true); | 
|  | }); | 
|  |  | 
|  | testWidgets("Updating a circle", (WidgetTester tester) async { | 
|  | final Circle c1 = Circle(circleId: CircleId("circle_1")); | 
|  | final Circle c2 = Circle(circleId: CircleId("circle_1"), radius: 10); | 
|  |  | 
|  | await tester.pumpWidget(_mapWithCircles(_toSet(c1: c1))); | 
|  | await tester.pumpWidget(_mapWithCircles(_toSet(c1: c2))); | 
|  |  | 
|  | final FakePlatformGoogleMap platformGoogleMap = | 
|  | fakePlatformViewsController.lastCreatedView; | 
|  | expect(platformGoogleMap.circlesToChange.length, 1); | 
|  | expect(platformGoogleMap.circlesToChange.first, equals(c2)); | 
|  |  | 
|  | expect(platformGoogleMap.circleIdsToRemove.isEmpty, true); | 
|  | expect(platformGoogleMap.circlesToAdd.isEmpty, true); | 
|  | }); | 
|  |  | 
|  | testWidgets("Updating a circle", (WidgetTester tester) async { | 
|  | final Circle c1 = Circle(circleId: CircleId("circle_1")); | 
|  | final Circle c2 = Circle(circleId: CircleId("circle_1"), radius: 10); | 
|  |  | 
|  | await tester.pumpWidget(_mapWithCircles(_toSet(c1: c1))); | 
|  | await tester.pumpWidget(_mapWithCircles(_toSet(c1: c2))); | 
|  |  | 
|  | final FakePlatformGoogleMap platformGoogleMap = | 
|  | fakePlatformViewsController.lastCreatedView; | 
|  | expect(platformGoogleMap.circlesToChange.length, 1); | 
|  |  | 
|  | final Circle update = platformGoogleMap.circlesToChange.first; | 
|  | expect(update, equals(c2)); | 
|  | expect(update.radius, 10); | 
|  | }); | 
|  |  | 
|  | testWidgets("Multi Update", (WidgetTester tester) async { | 
|  | Circle c1 = Circle(circleId: CircleId("circle_1")); | 
|  | Circle c2 = Circle(circleId: CircleId("circle_2")); | 
|  | final Set<Circle> prev = _toSet(c1: c1, c2: c2); | 
|  | c1 = Circle(circleId: CircleId("circle_1"), visible: false); | 
|  | c2 = Circle(circleId: CircleId("circle_2"), radius: 10); | 
|  | final Set<Circle> cur = _toSet(c1: c1, c2: c2); | 
|  |  | 
|  | await tester.pumpWidget(_mapWithCircles(prev)); | 
|  | await tester.pumpWidget(_mapWithCircles(cur)); | 
|  |  | 
|  | final FakePlatformGoogleMap platformGoogleMap = | 
|  | fakePlatformViewsController.lastCreatedView; | 
|  |  | 
|  | expect(platformGoogleMap.circlesToChange, cur); | 
|  | expect(platformGoogleMap.circleIdsToRemove.isEmpty, true); | 
|  | expect(platformGoogleMap.circlesToAdd.isEmpty, true); | 
|  | }); | 
|  |  | 
|  | testWidgets("Multi Update", (WidgetTester tester) async { | 
|  | Circle c2 = Circle(circleId: CircleId("circle_2")); | 
|  | final Circle c3 = Circle(circleId: CircleId("circle_3")); | 
|  | final Set<Circle> prev = _toSet(c2: c2, c3: c3); | 
|  |  | 
|  | // c1 is added, c2 is updated, c3 is removed. | 
|  | final Circle c1 = Circle(circleId: CircleId("circle_1")); | 
|  | c2 = Circle(circleId: CircleId("circle_2"), radius: 10); | 
|  | final Set<Circle> cur = _toSet(c1: c1, c2: c2); | 
|  |  | 
|  | await tester.pumpWidget(_mapWithCircles(prev)); | 
|  | await tester.pumpWidget(_mapWithCircles(cur)); | 
|  |  | 
|  | final FakePlatformGoogleMap platformGoogleMap = | 
|  | fakePlatformViewsController.lastCreatedView; | 
|  |  | 
|  | expect(platformGoogleMap.circlesToChange.length, 1); | 
|  | expect(platformGoogleMap.circlesToAdd.length, 1); | 
|  | expect(platformGoogleMap.circleIdsToRemove.length, 1); | 
|  |  | 
|  | expect(platformGoogleMap.circlesToChange.first, equals(c2)); | 
|  | expect(platformGoogleMap.circlesToAdd.first, equals(c1)); | 
|  | expect(platformGoogleMap.circleIdsToRemove.first, equals(c3.circleId)); | 
|  | }); | 
|  |  | 
|  | testWidgets("Partial Update", (WidgetTester tester) async { | 
|  | final Circle c1 = Circle(circleId: CircleId("circle_1")); | 
|  | final Circle c2 = Circle(circleId: CircleId("circle_2")); | 
|  | Circle c3 = Circle(circleId: CircleId("circle_3")); | 
|  | final Set<Circle> prev = _toSet(c1: c1, c2: c2, c3: c3); | 
|  | c3 = Circle(circleId: CircleId("circle_3"), radius: 10); | 
|  | final Set<Circle> cur = _toSet(c1: c1, c2: c2, c3: c3); | 
|  |  | 
|  | await tester.pumpWidget(_mapWithCircles(prev)); | 
|  | await tester.pumpWidget(_mapWithCircles(cur)); | 
|  |  | 
|  | final FakePlatformGoogleMap platformGoogleMap = | 
|  | fakePlatformViewsController.lastCreatedView; | 
|  |  | 
|  | expect(platformGoogleMap.circlesToChange, _toSet(c3: c3)); | 
|  | expect(platformGoogleMap.circleIdsToRemove.isEmpty, true); | 
|  | expect(platformGoogleMap.circlesToAdd.isEmpty, true); | 
|  | }); | 
|  | } |