From 52fe074215981377e8ea062a976037427f057587 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:12:20 -0400 Subject: [PATCH 1/4] undo web int test skip --- script/configs/exclude_integration_web.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/script/configs/exclude_integration_web.yaml b/script/configs/exclude_integration_web.yaml index 59b7d8fae145..6c0fc4efcb7a 100644 --- a/script/configs/exclude_integration_web.yaml +++ b/script/configs/exclude_integration_web.yaml @@ -1,4 +1,2 @@ # Currently missing: https://github.com/flutter/flutter/issues/82211 - file_selector -# Waiting on https://github.com/flutter/flutter/issues/145149 -- google_maps_flutter From 408fcff478f93b41631f18b00d16ee7051b0a612 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Jul 2024 13:01:50 -0400 Subject: [PATCH 2/4] skip just markers test --- .../integration_test/markers_test.dart | 946 +++++++++--------- 1 file changed, 481 insertions(+), 465 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart index f068ec8db307..a5dca9e9c79e 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart @@ -22,480 +22,496 @@ import 'resources/icon_image_base64.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - group('MarkersController', () { - late StreamController> events; - late MarkersController controller; - late ClusterManagersController clusterManagersController; - late gmaps.GMap map; - - setUp(() { - events = StreamController>(); - - clusterManagersController = ClusterManagersController(stream: events); - controller = MarkersController( - stream: events, clusterManagersController: clusterManagersController); - map = gmaps.GMap(createDivElement()); - clusterManagersController.bindToMap(123, map); - controller.bindToMap(123, map); - }); - - testWidgets('addMarkers', (WidgetTester tester) async { - final Set markers = { - const Marker(markerId: MarkerId('1')), - const Marker(markerId: MarkerId('2')), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 2); - expect(controller.markers, contains(const MarkerId('1'))); - expect(controller.markers, contains(const MarkerId('2'))); - expect(controller.markers, isNot(contains(const MarkerId('66')))); - }); - - testWidgets('changeMarkers', (WidgetTester tester) async { - gmaps.Marker? marker; - gmaps.LatLng? position; - - final Set markers = { - const Marker(markerId: MarkerId('1')), - }; - await controller.addMarkers(markers); - - marker = controller.markers[const MarkerId('1')]?.marker; - expect(marker, isNotNull); - expect(marker!.draggable, isFalse); - - // By default, markers fall in LatLng(0, 0) - position = marker.position; - expect(position, isNotNull); - expect(position!.lat, equals(0)); - expect(position.lng, equals(0)); - - // Update the marker with draggable and position - final Set updatedMarkers = { - const Marker( - markerId: MarkerId('1'), - draggable: true, - position: LatLng(42, 54), - ), - }; - await controller.changeMarkers(updatedMarkers); - expect(controller.markers.length, 1); - - marker = controller.markers[const MarkerId('1')]?.marker; - expect(marker, isNotNull); - expect(marker!.draggable, isTrue); - - position = marker.position; - expect(position, isNotNull); - expect(position!.lat, equals(42)); - expect(position.lng, equals(54)); - }); - - testWidgets( - 'changeMarkers resets marker position if not passed when updating!', - (WidgetTester tester) async { - gmaps.Marker? marker; - gmaps.LatLng? position; - - final Set markers = { - const Marker( - markerId: MarkerId('1'), - position: LatLng(42, 54), - ), - }; - await controller.addMarkers(markers); - - marker = controller.markers[const MarkerId('1')]?.marker; - expect(marker, isNotNull); - expect(marker!.draggable, isFalse); - - position = marker.position; - expect(position, isNotNull); - expect(position!.lat, equals(42)); - expect(position.lng, equals(54)); - - // Update the marker without position - final Set updatedMarkers = { - const Marker( - markerId: MarkerId('1'), - draggable: true, - ), - }; - await controller.changeMarkers(updatedMarkers); - expect(controller.markers.length, 1); - - marker = controller.markers[const MarkerId('1')]?.marker; - expect(marker, isNotNull); - expect(marker!.draggable, isTrue); - - position = marker.position; - expect(position, isNotNull); - expect(position!.lat, equals(0)); - expect(position.lng, equals(0)); - }); - - testWidgets('removeMarkers', (WidgetTester tester) async { - final Set markers = { - const Marker(markerId: MarkerId('1')), - const Marker(markerId: MarkerId('2')), - const Marker(markerId: MarkerId('3')), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 3); - - // Remove some markers... - final Set markerIdsToRemove = { - const MarkerId('1'), - const MarkerId('3'), - }; - - controller.removeMarkers(markerIdsToRemove); - - expect(controller.markers.length, 1); - expect(controller.markers, isNot(contains(const MarkerId('1')))); - expect(controller.markers, contains(const MarkerId('2'))); - expect(controller.markers, isNot(contains(const MarkerId('3')))); - }); - - testWidgets('InfoWindow show/hide', (WidgetTester tester) async { - final Set markers = { - const Marker( - markerId: MarkerId('1'), - infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), - ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); - - controller.showMarkerInfoWindow(const MarkerId('1')); - - expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isTrue); - - controller.hideMarkerInfoWindow(const MarkerId('1')); - - expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); - }); - - // https://github.com/flutter/flutter/issues/67380 - testWidgets('only single InfoWindow is visible', - (WidgetTester tester) async { - final Set markers = { - const Marker( - markerId: MarkerId('1'), - infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), - ), - const Marker( - markerId: MarkerId('2'), - infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), - ), - }; - await controller.addMarkers(markers); - - expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); - expect(controller.markers[const MarkerId('2')]?.infoWindowShown, isFalse); - - controller.showMarkerInfoWindow(const MarkerId('1')); - - expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isTrue); - expect(controller.markers[const MarkerId('2')]?.infoWindowShown, isFalse); - - controller.showMarkerInfoWindow(const MarkerId('2')); - - expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); - expect(controller.markers[const MarkerId('2')]?.infoWindowShown, isTrue); - }); - - testWidgets('markers with custom asset icon work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/red_square.png', - imagePixelRatio: 1.0, - )), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = - controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String assetUrl = icon!.url!; - expect(assetUrl, startsWith('assets')); - - final gmaps.Size size = icon.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // asset size is 48x48 physical pixels - expect(size.width, 48); - expect(size.height, 48); - expect(scaledSize.width, 48); - expect(scaledSize.height, 48); - }); - - testWidgets('markers with custom asset icon and pixelratio work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/red_square.png', - imagePixelRatio: 2.0, - )), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = - controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String assetUrl = icon!.url!; - expect(assetUrl, startsWith('assets')); - - final gmaps.Size size = icon.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // Asset size is 48x48 physical pixels, and with pixel ratio 2.0 it - // should be drawn with size 24x24 logical pixels. - expect(size.width, 24); - expect(size.height, 24); - expect(scaledSize.width, 24); - expect(scaledSize.height, 24); - }); - testWidgets('markers with custom asset icon with width and height work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/red_square.png', - imagePixelRatio: 2.0, - width: 64, - height: 64, - )), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = - controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String assetUrl = icon!.url!; - expect(assetUrl, startsWith('assets')); - - final gmaps.Size size = icon.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // Asset size is 48x48 physical pixels, - // and scaled to requested 64x64 size. - expect(size.width, 64); - expect(size.height, 64); - expect(scaledSize.width, 64); - expect(scaledSize.height, 64); - }); - - testWidgets('markers with missing asset icon should not set size', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Set markers = { - Marker( + group( + 'MarkersController', + () { + late StreamController> events; + late MarkersController controller; + late ClusterManagersController clusterManagersController; + late gmaps.GMap map; + + setUp(() { + events = StreamController>(); + + clusterManagersController = ClusterManagersController(stream: events); + controller = MarkersController( + stream: events, + clusterManagersController: clusterManagersController); + map = gmaps.GMap(createDivElement()); + clusterManagersController.bindToMap(123, map); + controller.bindToMap(123, map); + }); + + testWidgets('addMarkers', (WidgetTester tester) async { + final Set markers = { + const Marker(markerId: MarkerId('1')), + const Marker(markerId: MarkerId('2')), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 2); + expect(controller.markers, contains(const MarkerId('1'))); + expect(controller.markers, contains(const MarkerId('2'))); + expect(controller.markers, isNot(contains(const MarkerId('66')))); + }); + + testWidgets('changeMarkers', (WidgetTester tester) async { + gmaps.Marker? marker; + gmaps.LatLng? position; + + final Set markers = { + const Marker(markerId: MarkerId('1')), + }; + await controller.addMarkers(markers); + + marker = controller.markers[const MarkerId('1')]?.marker; + expect(marker, isNotNull); + expect(marker!.draggable, isFalse); + + // By default, markers fall in LatLng(0, 0) + position = marker.position; + expect(position, isNotNull); + expect(position!.lat, equals(0)); + expect(position.lng, equals(0)); + + // Update the marker with draggable and position + final Set updatedMarkers = { + const Marker( + markerId: MarkerId('1'), + draggable: true, + position: LatLng(42, 54), + ), + }; + await controller.changeMarkers(updatedMarkers); + expect(controller.markers.length, 1); + + marker = controller.markers[const MarkerId('1')]?.marker; + expect(marker, isNotNull); + expect(marker!.draggable, isTrue); + + position = marker.position; + expect(position, isNotNull); + expect(position!.lat, equals(42)); + expect(position.lng, equals(54)); + }); + + testWidgets( + 'changeMarkers resets marker position if not passed when updating!', + (WidgetTester tester) async { + gmaps.Marker? marker; + gmaps.LatLng? position; + + final Set markers = { + const Marker( + markerId: MarkerId('1'), + position: LatLng(42, 54), + ), + }; + await controller.addMarkers(markers); + + marker = controller.markers[const MarkerId('1')]?.marker; + expect(marker, isNotNull); + expect(marker!.draggable, isFalse); + + position = marker.position; + expect(position, isNotNull); + expect(position!.lat, equals(42)); + expect(position.lng, equals(54)); + + // Update the marker without position + final Set updatedMarkers = { + const Marker( + markerId: MarkerId('1'), + draggable: true, + ), + }; + await controller.changeMarkers(updatedMarkers); + expect(controller.markers.length, 1); + + marker = controller.markers[const MarkerId('1')]?.marker; + expect(marker, isNotNull); + expect(marker!.draggable, isTrue); + + position = marker.position; + expect(position, isNotNull); + expect(position!.lat, equals(0)); + expect(position.lng, equals(0)); + }); + + testWidgets('removeMarkers', (WidgetTester tester) async { + final Set markers = { + const Marker(markerId: MarkerId('1')), + const Marker(markerId: MarkerId('2')), + const Marker(markerId: MarkerId('3')), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 3); + + // Remove some markers... + final Set markerIdsToRemove = { + const MarkerId('1'), + const MarkerId('3'), + }; + + controller.removeMarkers(markerIdsToRemove); + + expect(controller.markers.length, 1); + expect(controller.markers, isNot(contains(const MarkerId('1')))); + expect(controller.markers, contains(const MarkerId('2'))); + expect(controller.markers, isNot(contains(const MarkerId('3')))); + }); + + testWidgets('InfoWindow show/hide', (WidgetTester tester) async { + final Set markers = { + const Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), + ), + }; + + await controller.addMarkers(markers); + + expect( + controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); + + controller.showMarkerInfoWindow(const MarkerId('1')); + + expect( + controller.markers[const MarkerId('1')]?.infoWindowShown, isTrue); + + controller.hideMarkerInfoWindow(const MarkerId('1')); + + expect( + controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); + }); + + // https://github.com/flutter/flutter/issues/67380 + testWidgets('only single InfoWindow is visible', + (WidgetTester tester) async { + final Set markers = { + const Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), + ), + const Marker( + markerId: MarkerId('2'), + infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), + ), + }; + await controller.addMarkers(markers); + + expect( + controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); + expect( + controller.markers[const MarkerId('2')]?.infoWindowShown, isFalse); + + controller.showMarkerInfoWindow(const MarkerId('1')); + + expect( + controller.markers[const MarkerId('1')]?.infoWindowShown, isTrue); + expect( + controller.markers[const MarkerId('2')]?.infoWindowShown, isFalse); + + controller.showMarkerInfoWindow(const MarkerId('2')); + + expect( + controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); + expect( + controller.markers[const MarkerId('2')]?.infoWindowShown, isTrue); + }); + + testWidgets('markers with custom asset icon work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: AssetMapBitmap( + 'assets/red_square.png', + imagePixelRatio: 1.0, + )), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = controller + .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String assetUrl = icon!.url!; + expect(assetUrl, startsWith('assets')); + + final gmaps.Size size = icon.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // asset size is 48x48 physical pixels + expect(size.width, 48); + expect(size.height, 48); + expect(scaledSize.width, 48); + expect(scaledSize.height, 48); + }); + + testWidgets('markers with custom asset icon and pixelratio work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: AssetMapBitmap( + 'assets/red_square.png', + imagePixelRatio: 2.0, + )), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = controller + .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String assetUrl = icon!.url!; + expect(assetUrl, startsWith('assets')); + + final gmaps.Size size = icon.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // Asset size is 48x48 physical pixels, and with pixel ratio 2.0 it + // should be drawn with size 24x24 logical pixels. + expect(size.width, 24); + expect(size.height, 24); + expect(scaledSize.width, 24); + expect(scaledSize.height, 24); + }); + testWidgets('markers with custom asset icon with width and height work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: AssetMapBitmap( + 'assets/red_square.png', + imagePixelRatio: 2.0, + width: 64, + height: 64, + )), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = controller + .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String assetUrl = icon!.url!; + expect(assetUrl, startsWith('assets')); + + final gmaps.Size size = icon.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // Asset size is 48x48 physical pixels, + // and scaled to requested 64x64 size. + expect(size.width, 64); + expect(size.height, 64); + expect(scaledSize.width, 64); + expect(scaledSize.height, 64); + }); + + testWidgets('markers with missing asset icon should not set size', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: AssetMapBitmap( + 'assets/broken_asset_name.png', + imagePixelRatio: 2.0, + )), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = controller + .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String assetUrl = icon!.url!; + expect(assetUrl, startsWith('assets')); + + // For invalid assets, the size and scaledSize should be null. + expect(icon.size, null); + expect(icon.scaledSize, null); + }); + + // https://github.com/flutter/flutter/issues/66622 + testWidgets('markers with custom bitmap icon work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); + final Set markers = { + Marker( markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/broken_asset_name.png', - imagePixelRatio: 2.0, - )), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = - controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String assetUrl = icon!.url!; - expect(assetUrl, startsWith('assets')); - - // For invalid assets, the size and scaledSize should be null. - expect(icon.size, null); - expect(icon.scaledSize, null); - }); - - // https://github.com/flutter/flutter/issues/66622 - testWidgets('markers with custom bitmap icon work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: BytesMapBitmap( - bytes, - imagePixelRatio: tester.view.devicePixelRatio, + icon: BytesMapBitmap( + bytes, + imagePixelRatio: tester.view.devicePixelRatio, + ), ), - ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = - controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String blobUrl = icon!.url!; - expect(blobUrl, startsWith('blob:')); - - final http.Response response = await http.get(Uri.parse(blobUrl)); - expect(response.bodyBytes, bytes, - reason: - 'Bytes from the Icon blob must match bytes used to create Marker'); - - final gmaps.Size size = icon.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // Icon size is 16x16 pixels, this should be automatically read from the - // bitmap and set to the icon size scaled to 8x8 using the - // given imagePixelRatio. - final int expectedSize = 16 ~/ tester.view.devicePixelRatio; - expect(size.width, expectedSize); - expect(size.height, expectedSize); - expect(scaledSize.width, expectedSize); - expect(scaledSize.height, expectedSize); - }); - - testWidgets('markers with custom bitmap icon and pixelratio work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: BytesMapBitmap( - bytes, - imagePixelRatio: 1, + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = controller + .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String blobUrl = icon!.url!; + expect(blobUrl, startsWith('blob:')); + + final http.Response response = await http.get(Uri.parse(blobUrl)); + expect(response.bodyBytes, bytes, + reason: + 'Bytes from the Icon blob must match bytes used to create Marker'); + + final gmaps.Size size = icon.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // Icon size is 16x16 pixels, this should be automatically read from the + // bitmap and set to the icon size scaled to 8x8 using the + // given imagePixelRatio. + final int expectedSize = 16 ~/ tester.view.devicePixelRatio; + expect(size.width, expectedSize); + expect(size.height, expectedSize); + expect(scaledSize.width, expectedSize); + expect(scaledSize.height, expectedSize); + }); + + testWidgets('markers with custom bitmap icon and pixelratio work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: BytesMapBitmap( + bytes, + imagePixelRatio: 1, + ), ), - ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = - controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final gmaps.Size size = icon!.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // Icon size is 16x16 pixels, this should be automatically read from the - // bitmap and set to the icon size and should not be changed as - // image pixel ratio is set to 1.0. - expect(size.width, 16); - expect(size.height, 16); - expect(scaledSize.width, 16); - expect(scaledSize.height, 16); - }); - - // https://github.com/flutter/flutter/issues/73789 - testWidgets('markers with custom bitmap icon pass size to sdk', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: BytesMapBitmap( - bytes, - width: 20, - height: 30, + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = controller + .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final gmaps.Size size = icon!.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // Icon size is 16x16 pixels, this should be automatically read from the + // bitmap and set to the icon size and should not be changed as + // image pixel ratio is set to 1.0. + expect(size.width, 16); + expect(size.height, 16); + expect(scaledSize.width, 16); + expect(scaledSize.height, 16); + }); + + // https://github.com/flutter/flutter/issues/73789 + testWidgets('markers with custom bitmap icon pass size to sdk', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: BytesMapBitmap( + bytes, + width: 20, + height: 30, + ), ), - ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = - controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final gmaps.Size size = icon!.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - expect(size.width, 20); - expect(size.height, 30); - expect(scaledSize.width, 20); - expect(scaledSize.height, 30); - }); - - // https://github.com/flutter/flutter/issues/67854 - testWidgets('InfoWindow snippet can have links', - (WidgetTester tester) async { - final Set markers = { - const Marker( - markerId: MarkerId('1'), - infoWindow: InfoWindow( - title: 'title for test', - snippet: 'Go to Google >>>', + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = controller + .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final gmaps.Size size = icon!.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + expect(size.width, 20); + expect(size.height, 30); + expect(scaledSize.width, 20); + expect(scaledSize.height, 30); + }); + + // https://github.com/flutter/flutter/issues/67854 + testWidgets('InfoWindow snippet can have links', + (WidgetTester tester) async { + final Set markers = { + const Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow( + title: 'title for test', + snippet: 'Go to Google >>>', + ), ), - ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final HTMLElement? content = controller - .markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?; - expect(content?.innerHTML, contains('title for test')); - expect( - content?.innerHTML, - contains( - 'Go to Google >>>', - )); - }); - - // https://github.com/flutter/flutter/issues/67289 - testWidgets('InfoWindow content is clickable', (WidgetTester tester) async { - final Set markers = { - const Marker( - markerId: MarkerId('1'), - infoWindow: InfoWindow( - title: 'title for test', - snippet: 'some snippet', + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final HTMLElement? content = controller + .markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?; + expect(content?.innerHTML, contains('title for test')); + expect( + content?.innerHTML, + contains( + 'Go to Google >>>', + )); + }); + + // https://github.com/flutter/flutter/issues/67289 + testWidgets('InfoWindow content is clickable', + (WidgetTester tester) async { + final Set markers = { + const Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow( + title: 'title for test', + snippet: 'some snippet', + ), ), - ), - }; + }; - await controller.addMarkers(markers); + await controller.addMarkers(markers); - expect(controller.markers.length, 1); - final HTMLElement? content = controller - .markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?; + expect(controller.markers.length, 1); + final HTMLElement? content = controller + .markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?; - content?.click(); + content?.click(); - final MapEvent event = await events.stream.first; + final MapEvent event = await events.stream.first; - expect(event, isA()); - expect((event as InfoWindowTapEvent).value, equals(const MarkerId('1'))); - }); - }); + expect(event, isA()); + expect( + (event as InfoWindowTapEvent).value, equals(const MarkerId('1'))); + }); + }, + skip: true, + ); } From a81482373ea903dccd201ea69fd44dacff28a21f Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:35:31 -0400 Subject: [PATCH 3/4] skip if web --- .../example/integration_test/google_maps_test.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart b/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart index 92c873bd4d5f..72fde89a77c8 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart @@ -6,6 +6,7 @@ import 'package:integration_test/integration_test.dart'; import 'src/maps_controller.dart' as maps_controller; import 'src/maps_inspector.dart' as maps_inspector; +import 'src/shared.dart'; import 'src/tiles_inspector.dart' as tiles_inspector; /// Recombine all test files in `src` into a single test app. @@ -15,6 +16,10 @@ import 'src/tiles_inspector.dart' as tiles_inspector; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + if (isWeb) { + return; + } + maps_controller.runTests(); maps_inspector.runTests(); tiles_inspector.runTests(); From 0d0647b80f0bdb38d5186de278d86c24b1bd0023 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 11 Jul 2024 13:51:55 -0400 Subject: [PATCH 4/4] skip specific tests --- .../integration_test/google_maps_test.dart | 2 + .../integration_test/markers_test.dart | 949 +++++++++--------- 2 files changed, 470 insertions(+), 481 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart b/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart index 72fde89a77c8..0edf077c5eb8 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart @@ -16,6 +16,8 @@ import 'src/tiles_inspector.dart' as tiles_inspector; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + // TODO(bparrishMines): These tests are failing on web due to an error being + // thrown after completion. See https://github.com/flutter/flutter/issues/145149 if (isWeb) { return; } diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart index a5dca9e9c79e..89b280bf046c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart @@ -22,496 +22,483 @@ import 'resources/icon_image_base64.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - group( - 'MarkersController', - () { - late StreamController> events; - late MarkersController controller; - late ClusterManagersController clusterManagersController; - late gmaps.GMap map; - - setUp(() { - events = StreamController>(); - - clusterManagersController = ClusterManagersController(stream: events); - controller = MarkersController( - stream: events, - clusterManagersController: clusterManagersController); - map = gmaps.GMap(createDivElement()); - clusterManagersController.bindToMap(123, map); - controller.bindToMap(123, map); - }); - - testWidgets('addMarkers', (WidgetTester tester) async { - final Set markers = { - const Marker(markerId: MarkerId('1')), - const Marker(markerId: MarkerId('2')), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 2); - expect(controller.markers, contains(const MarkerId('1'))); - expect(controller.markers, contains(const MarkerId('2'))); - expect(controller.markers, isNot(contains(const MarkerId('66')))); - }); - - testWidgets('changeMarkers', (WidgetTester tester) async { - gmaps.Marker? marker; - gmaps.LatLng? position; - - final Set markers = { - const Marker(markerId: MarkerId('1')), - }; - await controller.addMarkers(markers); - - marker = controller.markers[const MarkerId('1')]?.marker; - expect(marker, isNotNull); - expect(marker!.draggable, isFalse); - - // By default, markers fall in LatLng(0, 0) - position = marker.position; - expect(position, isNotNull); - expect(position!.lat, equals(0)); - expect(position.lng, equals(0)); - - // Update the marker with draggable and position - final Set updatedMarkers = { - const Marker( - markerId: MarkerId('1'), - draggable: true, - position: LatLng(42, 54), - ), - }; - await controller.changeMarkers(updatedMarkers); - expect(controller.markers.length, 1); - - marker = controller.markers[const MarkerId('1')]?.marker; - expect(marker, isNotNull); - expect(marker!.draggable, isTrue); - - position = marker.position; - expect(position, isNotNull); - expect(position!.lat, equals(42)); - expect(position.lng, equals(54)); - }); - - testWidgets( - 'changeMarkers resets marker position if not passed when updating!', - (WidgetTester tester) async { - gmaps.Marker? marker; - gmaps.LatLng? position; - - final Set markers = { - const Marker( - markerId: MarkerId('1'), - position: LatLng(42, 54), - ), - }; - await controller.addMarkers(markers); - - marker = controller.markers[const MarkerId('1')]?.marker; - expect(marker, isNotNull); - expect(marker!.draggable, isFalse); - - position = marker.position; - expect(position, isNotNull); - expect(position!.lat, equals(42)); - expect(position.lng, equals(54)); - - // Update the marker without position - final Set updatedMarkers = { - const Marker( - markerId: MarkerId('1'), - draggable: true, - ), - }; - await controller.changeMarkers(updatedMarkers); - expect(controller.markers.length, 1); - - marker = controller.markers[const MarkerId('1')]?.marker; - expect(marker, isNotNull); - expect(marker!.draggable, isTrue); - - position = marker.position; - expect(position, isNotNull); - expect(position!.lat, equals(0)); - expect(position.lng, equals(0)); - }); - - testWidgets('removeMarkers', (WidgetTester tester) async { - final Set markers = { - const Marker(markerId: MarkerId('1')), - const Marker(markerId: MarkerId('2')), - const Marker(markerId: MarkerId('3')), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 3); - - // Remove some markers... - final Set markerIdsToRemove = { - const MarkerId('1'), - const MarkerId('3'), - }; - - controller.removeMarkers(markerIdsToRemove); - - expect(controller.markers.length, 1); - expect(controller.markers, isNot(contains(const MarkerId('1')))); - expect(controller.markers, contains(const MarkerId('2'))); - expect(controller.markers, isNot(contains(const MarkerId('3')))); - }); - - testWidgets('InfoWindow show/hide', (WidgetTester tester) async { - final Set markers = { - const Marker( - markerId: MarkerId('1'), - infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), - ), - }; - - await controller.addMarkers(markers); - - expect( - controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); - - controller.showMarkerInfoWindow(const MarkerId('1')); - - expect( - controller.markers[const MarkerId('1')]?.infoWindowShown, isTrue); - - controller.hideMarkerInfoWindow(const MarkerId('1')); - - expect( - controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); - }); - - // https://github.com/flutter/flutter/issues/67380 - testWidgets('only single InfoWindow is visible', - (WidgetTester tester) async { - final Set markers = { - const Marker( - markerId: MarkerId('1'), - infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), - ), - const Marker( - markerId: MarkerId('2'), - infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), - ), - }; - await controller.addMarkers(markers); - - expect( - controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); - expect( - controller.markers[const MarkerId('2')]?.infoWindowShown, isFalse); - - controller.showMarkerInfoWindow(const MarkerId('1')); - - expect( - controller.markers[const MarkerId('1')]?.infoWindowShown, isTrue); - expect( - controller.markers[const MarkerId('2')]?.infoWindowShown, isFalse); - - controller.showMarkerInfoWindow(const MarkerId('2')); - - expect( - controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); - expect( - controller.markers[const MarkerId('2')]?.infoWindowShown, isTrue); - }); - - testWidgets('markers with custom asset icon work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/red_square.png', - imagePixelRatio: 1.0, - )), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = controller - .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String assetUrl = icon!.url!; - expect(assetUrl, startsWith('assets')); - - final gmaps.Size size = icon.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // asset size is 48x48 physical pixels - expect(size.width, 48); - expect(size.height, 48); - expect(scaledSize.width, 48); - expect(scaledSize.height, 48); - }); - - testWidgets('markers with custom asset icon and pixelratio work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/red_square.png', - imagePixelRatio: 2.0, - )), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = controller - .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String assetUrl = icon!.url!; - expect(assetUrl, startsWith('assets')); - - final gmaps.Size size = icon.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // Asset size is 48x48 physical pixels, and with pixel ratio 2.0 it - // should be drawn with size 24x24 logical pixels. - expect(size.width, 24); - expect(size.height, 24); - expect(scaledSize.width, 24); - expect(scaledSize.height, 24); - }); - testWidgets('markers with custom asset icon with width and height work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/red_square.png', - imagePixelRatio: 2.0, - width: 64, - height: 64, - )), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = controller - .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String assetUrl = icon!.url!; - expect(assetUrl, startsWith('assets')); - - final gmaps.Size size = icon.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // Asset size is 48x48 physical pixels, - // and scaled to requested 64x64 size. - expect(size.width, 64); - expect(size.height, 64); - expect(scaledSize.width, 64); - expect(scaledSize.height, 64); - }); - - testWidgets('markers with missing asset icon should not set size', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Set markers = { - Marker( - markerId: const MarkerId('1'), - icon: AssetMapBitmap( - 'assets/broken_asset_name.png', - imagePixelRatio: 2.0, - )), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = controller - .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String assetUrl = icon!.url!; - expect(assetUrl, startsWith('assets')); - - // For invalid assets, the size and scaledSize should be null. - expect(icon.size, null); - expect(icon.scaledSize, null); - }); - - // https://github.com/flutter/flutter/issues/66622 - testWidgets('markers with custom bitmap icon work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); - final Set markers = { - Marker( + group('MarkersController', () { + late StreamController> events; + late MarkersController controller; + late ClusterManagersController clusterManagersController; + late gmaps.GMap map; + + setUp(() { + events = StreamController>(); + + clusterManagersController = ClusterManagersController(stream: events); + controller = MarkersController( + stream: events, clusterManagersController: clusterManagersController); + map = gmaps.GMap(createDivElement()); + clusterManagersController.bindToMap(123, map); + controller.bindToMap(123, map); + }); + + testWidgets('addMarkers', (WidgetTester tester) async { + final Set markers = { + const Marker(markerId: MarkerId('1')), + const Marker(markerId: MarkerId('2')), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 2); + expect(controller.markers, contains(const MarkerId('1'))); + expect(controller.markers, contains(const MarkerId('2'))); + expect(controller.markers, isNot(contains(const MarkerId('66')))); + }); + + testWidgets('changeMarkers', (WidgetTester tester) async { + gmaps.Marker? marker; + gmaps.LatLng? position; + + final Set markers = { + const Marker(markerId: MarkerId('1')), + }; + await controller.addMarkers(markers); + + marker = controller.markers[const MarkerId('1')]?.marker; + expect(marker, isNotNull); + expect(marker!.draggable, isFalse); + + // By default, markers fall in LatLng(0, 0) + position = marker.position; + expect(position, isNotNull); + expect(position!.lat, equals(0)); + expect(position.lng, equals(0)); + + // Update the marker with draggable and position + final Set updatedMarkers = { + const Marker( + markerId: MarkerId('1'), + draggable: true, + position: LatLng(42, 54), + ), + }; + await controller.changeMarkers(updatedMarkers); + expect(controller.markers.length, 1); + + marker = controller.markers[const MarkerId('1')]?.marker; + expect(marker, isNotNull); + expect(marker!.draggable, isTrue); + + position = marker.position; + expect(position, isNotNull); + expect(position!.lat, equals(42)); + expect(position.lng, equals(54)); + }); + + testWidgets( + 'changeMarkers resets marker position if not passed when updating!', + (WidgetTester tester) async { + gmaps.Marker? marker; + gmaps.LatLng? position; + + final Set markers = { + const Marker( + markerId: MarkerId('1'), + position: LatLng(42, 54), + ), + }; + await controller.addMarkers(markers); + + marker = controller.markers[const MarkerId('1')]?.marker; + expect(marker, isNotNull); + expect(marker!.draggable, isFalse); + + position = marker.position; + expect(position, isNotNull); + expect(position!.lat, equals(42)); + expect(position.lng, equals(54)); + + // Update the marker without position + final Set updatedMarkers = { + const Marker( + markerId: MarkerId('1'), + draggable: true, + ), + }; + await controller.changeMarkers(updatedMarkers); + expect(controller.markers.length, 1); + + marker = controller.markers[const MarkerId('1')]?.marker; + expect(marker, isNotNull); + expect(marker!.draggable, isTrue); + + position = marker.position; + expect(position, isNotNull); + expect(position!.lat, equals(0)); + expect(position.lng, equals(0)); + }); + + testWidgets('removeMarkers', (WidgetTester tester) async { + final Set markers = { + const Marker(markerId: MarkerId('1')), + const Marker(markerId: MarkerId('2')), + const Marker(markerId: MarkerId('3')), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 3); + + // Remove some markers... + final Set markerIdsToRemove = { + const MarkerId('1'), + const MarkerId('3'), + }; + + controller.removeMarkers(markerIdsToRemove); + + expect(controller.markers.length, 1); + expect(controller.markers, isNot(contains(const MarkerId('1')))); + expect(controller.markers, contains(const MarkerId('2'))); + expect(controller.markers, isNot(contains(const MarkerId('3')))); + }); + + testWidgets('InfoWindow show/hide', (WidgetTester tester) async { + final Set markers = { + const Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), + ), + }; + + await controller.addMarkers(markers); + + expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); + + controller.showMarkerInfoWindow(const MarkerId('1')); + + expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isTrue); + + controller.hideMarkerInfoWindow(const MarkerId('1')); + + expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); + }); + + // https://github.com/flutter/flutter/issues/67380 + testWidgets('only single InfoWindow is visible', + (WidgetTester tester) async { + final Set markers = { + const Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), + ), + const Marker( + markerId: MarkerId('2'), + infoWindow: InfoWindow(title: 'Title', snippet: 'Snippet'), + ), + }; + await controller.addMarkers(markers); + + expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); + expect(controller.markers[const MarkerId('2')]?.infoWindowShown, isFalse); + + controller.showMarkerInfoWindow(const MarkerId('1')); + + expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isTrue); + expect(controller.markers[const MarkerId('2')]?.infoWindowShown, isFalse); + + controller.showMarkerInfoWindow(const MarkerId('2')); + + expect(controller.markers[const MarkerId('1')]?.infoWindowShown, isFalse); + expect(controller.markers[const MarkerId('2')]?.infoWindowShown, isTrue); + }); + + testWidgets('markers with custom asset icon work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Set markers = { + Marker( markerId: const MarkerId('1'), - icon: BytesMapBitmap( - bytes, - imagePixelRatio: tester.view.devicePixelRatio, - ), - ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = controller - .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final String blobUrl = icon!.url!; - expect(blobUrl, startsWith('blob:')); - - final http.Response response = await http.get(Uri.parse(blobUrl)); - expect(response.bodyBytes, bytes, - reason: - 'Bytes from the Icon blob must match bytes used to create Marker'); - - final gmaps.Size size = icon.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // Icon size is 16x16 pixels, this should be automatically read from the - // bitmap and set to the icon size scaled to 8x8 using the - // given imagePixelRatio. - final int expectedSize = 16 ~/ tester.view.devicePixelRatio; - expect(size.width, expectedSize); - expect(size.height, expectedSize); - expect(scaledSize.width, expectedSize); - expect(scaledSize.height, expectedSize); - }); - - testWidgets('markers with custom bitmap icon and pixelratio work', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); - final Set markers = { - Marker( + icon: AssetMapBitmap( + 'assets/red_square.png', + imagePixelRatio: 1.0, + )), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = + controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String assetUrl = icon!.url!; + expect(assetUrl, startsWith('assets')); + + final gmaps.Size size = icon.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // asset size is 48x48 physical pixels + expect(size.width, 48); + expect(size.height, 48); + expect(scaledSize.width, 48); + expect(scaledSize.height, 48); + }); + + testWidgets('markers with custom asset icon and pixelratio work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Set markers = { + Marker( markerId: const MarkerId('1'), - icon: BytesMapBitmap( - bytes, - imagePixelRatio: 1, - ), - ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = controller - .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final gmaps.Size size = icon!.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - // Icon size is 16x16 pixels, this should be automatically read from the - // bitmap and set to the icon size and should not be changed as - // image pixel ratio is set to 1.0. - expect(size.width, 16); - expect(size.height, 16); - expect(scaledSize.width, 16); - expect(scaledSize.height, 16); - }); - - // https://github.com/flutter/flutter/issues/73789 - testWidgets('markers with custom bitmap icon pass size to sdk', - (WidgetTester tester) async { - tester.view.devicePixelRatio = 2.0; - final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); - final Set markers = { - Marker( + icon: AssetMapBitmap( + 'assets/red_square.png', + imagePixelRatio: 2.0, + )), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = + controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String assetUrl = icon!.url!; + expect(assetUrl, startsWith('assets')); + + final gmaps.Size size = icon.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // Asset size is 48x48 physical pixels, and with pixel ratio 2.0 it + // should be drawn with size 24x24 logical pixels. + expect(size.width, 24); + expect(size.height, 24); + expect(scaledSize.width, 24); + expect(scaledSize.height, 24); + }); + testWidgets('markers with custom asset icon with width and height work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: AssetMapBitmap( + 'assets/red_square.png', + imagePixelRatio: 2.0, + width: 64, + height: 64, + )), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = + controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String assetUrl = icon!.url!; + expect(assetUrl, startsWith('assets')); + + final gmaps.Size size = icon.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // Asset size is 48x48 physical pixels, + // and scaled to requested 64x64 size. + expect(size.width, 64); + expect(size.height, 64); + expect(scaledSize.width, 64); + expect(scaledSize.height, 64); + }); + + testWidgets('markers with missing asset icon should not set size', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Set markers = { + Marker( markerId: const MarkerId('1'), - icon: BytesMapBitmap( - bytes, - width: 20, - height: 30, - ), + icon: AssetMapBitmap( + 'assets/broken_asset_name.png', + imagePixelRatio: 2.0, + )), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = + controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String assetUrl = icon!.url!; + expect(assetUrl, startsWith('assets')); + + // For invalid assets, the size and scaledSize should be null. + expect(icon.size, null); + expect(icon.scaledSize, null); + }); + + // https://github.com/flutter/flutter/issues/66622 + testWidgets('markers with custom bitmap icon work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: BytesMapBitmap( + bytes, + imagePixelRatio: tester.view.devicePixelRatio, + ), + ), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = + controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final String blobUrl = icon!.url!; + expect(blobUrl, startsWith('blob:')); + + final http.Response response = await http.get(Uri.parse(blobUrl)); + expect(response.bodyBytes, bytes, + reason: + 'Bytes from the Icon blob must match bytes used to create Marker'); + + final gmaps.Size size = icon.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // Icon size is 16x16 pixels, this should be automatically read from the + // bitmap and set to the icon size scaled to 8x8 using the + // given imagePixelRatio. + final int expectedSize = 16 ~/ tester.view.devicePixelRatio; + expect(size.width, expectedSize); + expect(size.height, expectedSize); + expect(scaledSize.width, expectedSize); + expect(scaledSize.height, expectedSize); + }); + + testWidgets('markers with custom bitmap icon and pixelratio work', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: BytesMapBitmap( + bytes, + imagePixelRatio: 1, + ), + ), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = + controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final gmaps.Size size = icon!.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + // Icon size is 16x16 pixels, this should be automatically read from the + // bitmap and set to the icon size and should not be changed as + // image pixel ratio is set to 1.0. + expect(size.width, 16); + expect(size.height, 16); + expect(scaledSize.width, 16); + expect(scaledSize.height, 16); + }); + + // https://github.com/flutter/flutter/issues/73789 + testWidgets('markers with custom bitmap icon pass size to sdk', + (WidgetTester tester) async { + tester.view.devicePixelRatio = 2.0; + final Uint8List bytes = const Base64Decoder().convert(iconImageBase64); + final Set markers = { + Marker( + markerId: const MarkerId('1'), + icon: BytesMapBitmap( + bytes, + width: 20, + height: 30, ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final gmaps.Icon? icon = controller - .markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; - expect(icon, isNotNull); - - final gmaps.Size size = icon!.size!; - final gmaps.Size scaledSize = icon.scaledSize!; - - expect(size.width, 20); - expect(size.height, 30); - expect(scaledSize.width, 20); - expect(scaledSize.height, 30); - }); - - // https://github.com/flutter/flutter/issues/67854 - testWidgets('InfoWindow snippet can have links', - (WidgetTester tester) async { - final Set markers = { - const Marker( - markerId: MarkerId('1'), - infoWindow: InfoWindow( - title: 'title for test', - snippet: 'Go to Google >>>', - ), + ), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final gmaps.Icon? icon = + controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?; + expect(icon, isNotNull); + + final gmaps.Size size = icon!.size!; + final gmaps.Size scaledSize = icon.scaledSize!; + + expect(size.width, 20); + expect(size.height, 30); + expect(scaledSize.width, 20); + expect(scaledSize.height, 30); + }); + + // https://github.com/flutter/flutter/issues/67854 + testWidgets('InfoWindow snippet can have links', + (WidgetTester tester) async { + final Set markers = { + const Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow( + title: 'title for test', + snippet: 'Go to Google >>>', ), - }; - - await controller.addMarkers(markers); - - expect(controller.markers.length, 1); - final HTMLElement? content = controller - .markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?; - expect(content?.innerHTML, contains('title for test')); - expect( - content?.innerHTML, - contains( - 'Go to Google >>>', - )); - }); - - // https://github.com/flutter/flutter/issues/67289 - testWidgets('InfoWindow content is clickable', - (WidgetTester tester) async { - final Set markers = { - const Marker( - markerId: MarkerId('1'), - infoWindow: InfoWindow( - title: 'title for test', - snippet: 'some snippet', - ), + ), + }; + + await controller.addMarkers(markers); + + expect(controller.markers.length, 1); + final HTMLElement? content = controller + .markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?; + expect(content?.innerHTML, contains('title for test')); + expect( + content?.innerHTML, + contains( + 'Go to Google >>>', + )); + }); + + // https://github.com/flutter/flutter/issues/67289 + testWidgets('InfoWindow content is clickable', (WidgetTester tester) async { + final Set markers = { + const Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow( + title: 'title for test', + snippet: 'some snippet', ), - }; + ), + }; - await controller.addMarkers(markers); + await controller.addMarkers(markers); - expect(controller.markers.length, 1); - final HTMLElement? content = controller - .markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?; + expect(controller.markers.length, 1); + final HTMLElement? content = controller + .markers[const MarkerId('1')]?.infoWindow?.content as HTMLElement?; - content?.click(); + content?.click(); - final MapEvent event = await events.stream.first; + final MapEvent event = await events.stream.first; - expect(event, isA()); - expect( - (event as InfoWindowTapEvent).value, equals(const MarkerId('1'))); - }); - }, - skip: true, - ); + expect(event, isA()); + expect((event as InfoWindowTapEvent).value, equals(const MarkerId('1'))); + }); + }, + // TODO(bparrishMines): This is failing due to an error being thrown after + // completion. See https://github.com/flutter/flutter/issues/145149 + skip: true); }