// 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 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import 'package:webview_flutter_platform_interface/v4/src/platform_webview_controller.dart';
import 'package:webview_flutter_platform_interface/v4/src/platform_webview_widget.dart';
import 'package:webview_flutter_platform_interface/v4/src/webview_platform.dart';

import 'webview_platform_test.mocks.dart';

void main() {
  setUp(() {
    WebViewPlatform.instance = MockWebViewPlatformWithMixin();
  });

  test('Cannot be implemented with `implements`', () {
    final MockWebViewControllerDelegate controller =
        MockWebViewControllerDelegate();
    final PlatformWebViewWidgetCreationParams params =
        PlatformWebViewWidgetCreationParams(controller: controller);
    when(WebViewPlatform.instance!.createPlatformWebViewWidget(params))
        .thenReturn(ImplementsWebViewWidgetDelegate());

    expect(() {
      PlatformWebViewWidget(params);
    }, throwsNoSuchMethodError);
  });

  test('Can be extended', () {
    final MockWebViewControllerDelegate controller =
        MockWebViewControllerDelegate();
    final PlatformWebViewWidgetCreationParams params =
        PlatformWebViewWidgetCreationParams(controller: controller);
    when(WebViewPlatform.instance!.createPlatformWebViewWidget(params))
        .thenReturn(ExtendsWebViewWidgetDelegate(params));

    expect(PlatformWebViewWidget(params), isNotNull);
  });

  test('Can be mocked with `implements`', () {
    final MockWebViewControllerDelegate controller =
        MockWebViewControllerDelegate();
    final PlatformWebViewWidgetCreationParams params =
        PlatformWebViewWidgetCreationParams(controller: controller);
    when(WebViewPlatform.instance!.createPlatformWebViewWidget(params))
        .thenReturn(MockWebViewWidgetDelegate());

    expect(PlatformWebViewWidget(params), isNotNull);
  });
}

class MockWebViewPlatformWithMixin extends MockWebViewPlatform
    with
        // ignore: prefer_mixin
        MockPlatformInterfaceMixin {}

class ImplementsWebViewWidgetDelegate implements PlatformWebViewWidget {
  @override
  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

class MockWebViewWidgetDelegate extends Mock
    with
        // ignore: prefer_mixin
        MockPlatformInterfaceMixin
    implements
        PlatformWebViewWidget {}

class ExtendsWebViewWidgetDelegate extends PlatformWebViewWidget {
  ExtendsWebViewWidgetDelegate(PlatformWebViewWidgetCreationParams params)
      : super.implementation(params);

  @override
  Widget build(BuildContext context) {
    throw UnimplementedError(
        'build is not implemented for ExtendedWebViewWidgetDelegate.');
  }
}

class MockWebViewControllerDelegate extends Mock
    with
        // ignore: prefer_mixin
        MockPlatformInterfaceMixin
    implements
        PlatformWebViewController {}
