// Copyright 2017 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 'dart:async';

import 'package:e2e/e2e.dart';
import 'package:google_maps/google_maps.dart' as gmaps;
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';

class _MockMarker extends Mock implements gmaps.Marker {
  final onClickController = StreamController<gmaps.MouseEvent>();
  final onDragEndController = StreamController<gmaps.MouseEvent>();

  @override
  Stream<gmaps.MouseEvent> get onClick => onClickController.stream;

  @override
  Stream<gmaps.MouseEvent> get onDragend => onDragEndController.stream;
}

class _MockMouseEvent extends Mock implements gmaps.MouseEvent {}

class _MockInfoWindow extends Mock implements gmaps.InfoWindow {}

/// Test Markers
void main() {
  E2EWidgetsFlutterBinding.ensureInitialized() as E2EWidgetsFlutterBinding;

  bool called = false;
  void onTap() {
    called = true;
  }

  void onDragEnd(gmaps.LatLng _) {
    called = true;
  }

  setUp(() {
    called = false;
  });

  group('MarkerController', () {
    _MockMarker marker;

    setUp(() {
      marker = _MockMarker();
    });

    testWidgets('onTap gets called', (WidgetTester tester) async {
      MarkerController(marker: marker, onTap: onTap);
      // Simulate a click
      await marker.onClickController.add(null);
      expect(called, isTrue);
    });

    testWidgets('onDragEnd gets called', (WidgetTester tester) async {
      when(marker.draggable).thenReturn(true);
      MarkerController(marker: marker, onDragEnd: onDragEnd);
      // Simulate a drag end
      await marker.onDragEndController.add(_MockMouseEvent());
      expect(called, isTrue);
    });

    testWidgets('update', (WidgetTester tester) async {
      final controller = MarkerController(marker: marker);
      final options = gmaps.MarkerOptions()..draggable = false;
      controller.update(options);
      verify(marker.options = options);
    });

    testWidgets('infoWindow null, showInfoWindow.',
        (WidgetTester tester) async {
      final controller = MarkerController(marker: marker);
      controller.showInfoWindow();
      expect(controller.infoWindowShown, isFalse);
    });

    testWidgets('showInfoWindow', (WidgetTester tester) async {
      final infoWindow = _MockInfoWindow();
      final controller =
          MarkerController(marker: marker, infoWindow: infoWindow);
      controller.showInfoWindow();
      verify(infoWindow.open(any, any)).called(1);
      expect(controller.infoWindowShown, isTrue);
    });

    testWidgets('hideInfoWindow', (WidgetTester tester) async {
      final infoWindow = _MockInfoWindow();
      final controller =
          MarkerController(marker: marker, infoWindow: infoWindow);
      controller.hideInfoWindow();
      verify(infoWindow.close()).called(1);
      expect(controller.infoWindowShown, isFalse);
    });
  });
}
