// Mocks generated by Mockito 5.3.2 from annotations
// in google_maps_flutter_web_integration_tests/integration_test/google_maps_controller_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:google_maps/google_maps.dart' as _i2;
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'
    as _i4;
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart' as _i3;
import 'package:mockito/mockito.dart' as _i1;

// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class

class _FakeGMap_0 extends _i1.SmartFake implements _i2.GMap {
  _FakeGMap_0(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

/// A class which mocks [CirclesController].
///
/// See the documentation for Mockito's code generation for more information.
class MockCirclesController extends _i1.Mock implements _i3.CirclesController {
  @override
  Map<_i4.CircleId, _i3.CircleController> get circles => (super.noSuchMethod(
        Invocation.getter(#circles),
        returnValue: <_i4.CircleId, _i3.CircleController>{},
        returnValueForMissingStub: <_i4.CircleId, _i3.CircleController>{},
      ) as Map<_i4.CircleId, _i3.CircleController>);
  @override
  _i2.GMap get googleMap => (super.noSuchMethod(
        Invocation.getter(#googleMap),
        returnValue: _FakeGMap_0(
          this,
          Invocation.getter(#googleMap),
        ),
        returnValueForMissingStub: _FakeGMap_0(
          this,
          Invocation.getter(#googleMap),
        ),
      ) as _i2.GMap);
  @override
  set googleMap(_i2.GMap? _googleMap) => super.noSuchMethod(
        Invocation.setter(
          #googleMap,
          _googleMap,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int get mapId => (super.noSuchMethod(
        Invocation.getter(#mapId),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  set mapId(int? _mapId) => super.noSuchMethod(
        Invocation.setter(
          #mapId,
          _mapId,
        ),
        returnValueForMissingStub: null,
      );
  @override
  void addCircles(Set<_i4.Circle>? circlesToAdd) => super.noSuchMethod(
        Invocation.method(
          #addCircles,
          [circlesToAdd],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void changeCircles(Set<_i4.Circle>? circlesToChange) => super.noSuchMethod(
        Invocation.method(
          #changeCircles,
          [circlesToChange],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeCircles(Set<_i4.CircleId>? circleIdsToRemove) =>
      super.noSuchMethod(
        Invocation.method(
          #removeCircles,
          [circleIdsToRemove],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void bindToMap(
    int? mapId,
    _i2.GMap? googleMap,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #bindToMap,
          [
            mapId,
            googleMap,
          ],
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [PolygonsController].
///
/// See the documentation for Mockito's code generation for more information.
class MockPolygonsController extends _i1.Mock
    implements _i3.PolygonsController {
  @override
  Map<_i4.PolygonId, _i3.PolygonController> get polygons => (super.noSuchMethod(
        Invocation.getter(#polygons),
        returnValue: <_i4.PolygonId, _i3.PolygonController>{},
        returnValueForMissingStub: <_i4.PolygonId, _i3.PolygonController>{},
      ) as Map<_i4.PolygonId, _i3.PolygonController>);
  @override
  _i2.GMap get googleMap => (super.noSuchMethod(
        Invocation.getter(#googleMap),
        returnValue: _FakeGMap_0(
          this,
          Invocation.getter(#googleMap),
        ),
        returnValueForMissingStub: _FakeGMap_0(
          this,
          Invocation.getter(#googleMap),
        ),
      ) as _i2.GMap);
  @override
  set googleMap(_i2.GMap? _googleMap) => super.noSuchMethod(
        Invocation.setter(
          #googleMap,
          _googleMap,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int get mapId => (super.noSuchMethod(
        Invocation.getter(#mapId),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  set mapId(int? _mapId) => super.noSuchMethod(
        Invocation.setter(
          #mapId,
          _mapId,
        ),
        returnValueForMissingStub: null,
      );
  @override
  void addPolygons(Set<_i4.Polygon>? polygonsToAdd) => super.noSuchMethod(
        Invocation.method(
          #addPolygons,
          [polygonsToAdd],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void changePolygons(Set<_i4.Polygon>? polygonsToChange) => super.noSuchMethod(
        Invocation.method(
          #changePolygons,
          [polygonsToChange],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removePolygons(Set<_i4.PolygonId>? polygonIdsToRemove) =>
      super.noSuchMethod(
        Invocation.method(
          #removePolygons,
          [polygonIdsToRemove],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void bindToMap(
    int? mapId,
    _i2.GMap? googleMap,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #bindToMap,
          [
            mapId,
            googleMap,
          ],
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [PolylinesController].
///
/// See the documentation for Mockito's code generation for more information.
class MockPolylinesController extends _i1.Mock
    implements _i3.PolylinesController {
  @override
  Map<_i4.PolylineId, _i3.PolylineController> get lines => (super.noSuchMethod(
        Invocation.getter(#lines),
        returnValue: <_i4.PolylineId, _i3.PolylineController>{},
        returnValueForMissingStub: <_i4.PolylineId, _i3.PolylineController>{},
      ) as Map<_i4.PolylineId, _i3.PolylineController>);
  @override
  _i2.GMap get googleMap => (super.noSuchMethod(
        Invocation.getter(#googleMap),
        returnValue: _FakeGMap_0(
          this,
          Invocation.getter(#googleMap),
        ),
        returnValueForMissingStub: _FakeGMap_0(
          this,
          Invocation.getter(#googleMap),
        ),
      ) as _i2.GMap);
  @override
  set googleMap(_i2.GMap? _googleMap) => super.noSuchMethod(
        Invocation.setter(
          #googleMap,
          _googleMap,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int get mapId => (super.noSuchMethod(
        Invocation.getter(#mapId),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  set mapId(int? _mapId) => super.noSuchMethod(
        Invocation.setter(
          #mapId,
          _mapId,
        ),
        returnValueForMissingStub: null,
      );
  @override
  void addPolylines(Set<_i4.Polyline>? polylinesToAdd) => super.noSuchMethod(
        Invocation.method(
          #addPolylines,
          [polylinesToAdd],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void changePolylines(Set<_i4.Polyline>? polylinesToChange) =>
      super.noSuchMethod(
        Invocation.method(
          #changePolylines,
          [polylinesToChange],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removePolylines(Set<_i4.PolylineId>? polylineIdsToRemove) =>
      super.noSuchMethod(
        Invocation.method(
          #removePolylines,
          [polylineIdsToRemove],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void bindToMap(
    int? mapId,
    _i2.GMap? googleMap,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #bindToMap,
          [
            mapId,
            googleMap,
          ],
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [MarkersController].
///
/// See the documentation for Mockito's code generation for more information.
class MockMarkersController extends _i1.Mock implements _i3.MarkersController {
  @override
  Map<_i4.MarkerId, _i3.MarkerController> get markers => (super.noSuchMethod(
        Invocation.getter(#markers),
        returnValue: <_i4.MarkerId, _i3.MarkerController>{},
        returnValueForMissingStub: <_i4.MarkerId, _i3.MarkerController>{},
      ) as Map<_i4.MarkerId, _i3.MarkerController>);
  @override
  _i2.GMap get googleMap => (super.noSuchMethod(
        Invocation.getter(#googleMap),
        returnValue: _FakeGMap_0(
          this,
          Invocation.getter(#googleMap),
        ),
        returnValueForMissingStub: _FakeGMap_0(
          this,
          Invocation.getter(#googleMap),
        ),
      ) as _i2.GMap);
  @override
  set googleMap(_i2.GMap? _googleMap) => super.noSuchMethod(
        Invocation.setter(
          #googleMap,
          _googleMap,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int get mapId => (super.noSuchMethod(
        Invocation.getter(#mapId),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  set mapId(int? _mapId) => super.noSuchMethod(
        Invocation.setter(
          #mapId,
          _mapId,
        ),
        returnValueForMissingStub: null,
      );
  @override
  void addMarkers(Set<_i4.Marker>? markersToAdd) => super.noSuchMethod(
        Invocation.method(
          #addMarkers,
          [markersToAdd],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void changeMarkers(Set<_i4.Marker>? markersToChange) => super.noSuchMethod(
        Invocation.method(
          #changeMarkers,
          [markersToChange],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeMarkers(Set<_i4.MarkerId>? markerIdsToRemove) =>
      super.noSuchMethod(
        Invocation.method(
          #removeMarkers,
          [markerIdsToRemove],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void showMarkerInfoWindow(_i4.MarkerId? markerId) => super.noSuchMethod(
        Invocation.method(
          #showMarkerInfoWindow,
          [markerId],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void hideMarkerInfoWindow(_i4.MarkerId? markerId) => super.noSuchMethod(
        Invocation.method(
          #hideMarkerInfoWindow,
          [markerId],
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool isInfoWindowShown(_i4.MarkerId? markerId) => (super.noSuchMethod(
        Invocation.method(
          #isInfoWindowShown,
          [markerId],
        ),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  void bindToMap(
    int? mapId,
    _i2.GMap? googleMap,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #bindToMap,
          [
            mapId,
            googleMap,
          ],
        ),
        returnValueForMissingStub: null,
      );
}
