// 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:integration_test/integration_test.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() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  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);
    });
  });
}
