// Copyright 2013 The Flutter 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:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';

import 'webview_controller_test.mocks.dart';

@GenerateMocks(<Type>[PlatformWebViewController, PlatformNavigationDelegate])
void main() {
  test('loadFile', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.loadFile('file/path');
    verify(mockPlatformWebViewController.loadFile('file/path'));
  });

  test('loadFlutterAsset', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.loadFlutterAsset('file/path');
    verify(mockPlatformWebViewController.loadFlutterAsset('file/path'));
  });

  test('loadHtmlString', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.loadHtmlString('html', baseUrl: 'baseUrl');
    verify(mockPlatformWebViewController.loadHtmlString(
      'html',
      baseUrl: 'baseUrl',
    ));
  });

  test('loadRequest', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.loadRequest(
      Uri(scheme: 'https', host: 'dart.dev'),
      method: LoadRequestMethod.post,
      headers: <String, String>{'a': 'header'},
      body: Uint8List(0),
    );

    final LoadRequestParams params =
        verify(mockPlatformWebViewController.loadRequest(captureAny))
            .captured[0] as LoadRequestParams;
    expect(params.uri, Uri(scheme: 'https', host: 'dart.dev'));
    expect(params.method, LoadRequestMethod.post);
    expect(params.headers, <String, String>{'a': 'header'});
    expect(params.body, Uint8List(0));
  });

  test('currentUrl', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();
    when(mockPlatformWebViewController.currentUrl()).thenAnswer(
      (_) => Future<String>.value('https://dart.dev'),
    );

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await expectLater(
      webViewController.currentUrl(),
      completion('https://dart.dev'),
    );
  });

  test('canGoBack', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();
    when(mockPlatformWebViewController.canGoBack()).thenAnswer(
      (_) => Future<bool>.value(false),
    );

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await expectLater(webViewController.canGoBack(), completion(false));
  });

  test('canGoForward', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();
    when(mockPlatformWebViewController.canGoForward()).thenAnswer(
      (_) => Future<bool>.value(true),
    );

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await expectLater(webViewController.canGoForward(), completion(true));
  });

  test('goBack', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.goBack();
    verify(mockPlatformWebViewController.goBack());
  });

  test('goForward', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.goForward();
    verify(mockPlatformWebViewController.goForward());
  });

  test('reload', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.reload();
    verify(mockPlatformWebViewController.reload());
  });

  test('clearCache', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.clearCache();
    verify(mockPlatformWebViewController.clearCache());
  });

  test('clearLocalStorage', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.clearLocalStorage();
    verify(mockPlatformWebViewController.clearLocalStorage());
  });

  test('runJavaScript', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.runJavaScript('1 + 1');
    verify(mockPlatformWebViewController.runJavaScript('1 + 1'));
  });

  test('runJavaScriptReturningResult', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();
    when(mockPlatformWebViewController.runJavaScriptReturningResult('1 + 1'))
        .thenAnswer((_) => Future<String>.value('2'));

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await expectLater(
      webViewController.runJavaScriptReturningResult('1 + 1'),
      completion('2'),
    );
  });

  test('addJavaScriptChannel', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    void onMessageReceived(JavaScriptMessage message) {}
    await webViewController.addJavaScriptChannel(
      'name',
      onMessageReceived: onMessageReceived,
    );

    final JavaScriptChannelParams params =
        verify(mockPlatformWebViewController.addJavaScriptChannel(captureAny))
            .captured[0] as JavaScriptChannelParams;
    expect(params.name, 'name');
    expect(params.onMessageReceived, onMessageReceived);
  });

  test('removeJavaScriptChannel', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.removeJavaScriptChannel('channel');
    verify(mockPlatformWebViewController.removeJavaScriptChannel('channel'));
  });

  test('getTitle', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();
    when(mockPlatformWebViewController.getTitle())
        .thenAnswer((_) => Future<String>.value('myTitle'));

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await expectLater(webViewController.getTitle(), completion('myTitle'));
  });

  test('scrollTo', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.scrollTo(2, 3);
    verify(mockPlatformWebViewController.scrollTo(2, 3));
  });

  test('scrollBy', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.scrollBy(2, 3);
    verify(mockPlatformWebViewController.scrollBy(2, 3));
  });

  test('getScrollPosition', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();
    when(mockPlatformWebViewController.getScrollPosition()).thenAnswer(
      (_) => Future<Offset>.value(const Offset(2, 3)),
    );

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await expectLater(
      webViewController.getScrollPosition(),
      completion(const Offset(2.0, 3.0)),
    );
  });

  test('enableZoom', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.enableZoom(false);
    verify(mockPlatformWebViewController.enableZoom(false));
  });

  test('setBackgroundColor', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.setBackgroundColor(Colors.green);
    verify(mockPlatformWebViewController.setBackgroundColor(Colors.green));
  });

  test('setJavaScriptMode', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.setJavaScriptMode(JavaScriptMode.disabled);
    verify(
      mockPlatformWebViewController.setJavaScriptMode(JavaScriptMode.disabled),
    );
  });

  test('setUserAgent', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();

    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    await webViewController.setUserAgent('userAgent');
    verify(mockPlatformWebViewController.setUserAgent('userAgent'));
  });

  test('setNavigationDelegate', () async {
    final MockPlatformWebViewController mockPlatformWebViewController =
        MockPlatformWebViewController();
    final WebViewController webViewController = WebViewController.fromPlatform(
      mockPlatformWebViewController,
    );

    final MockPlatformNavigationDelegate mockPlatformNavigationDelegate =
        MockPlatformNavigationDelegate();
    final NavigationDelegate navigationDelegate =
        NavigationDelegate.fromPlatform(mockPlatformNavigationDelegate);

    await webViewController.setNavigationDelegate(navigationDelegate);
    verify(mockPlatformWebViewController.setPlatformNavigationDelegate(
      mockPlatformNavigationDelegate,
    ));
  });
}
