// Mocks generated by Mockito 5.1.0 from annotations
// in webview_flutter_wkwebview/example/ios/.symlinks/plugins/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart.
// Do not manually edit this file.

import 'dart:async' as _i3;

import 'package:mockito/mockito.dart' as _i1;
import 'package:webview_flutter_wkwebview/src/common/web_kit.pigeon.dart'
    as _i4;

import '../common/test_web_kit.pigeon.dart' as _i2;

// 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

/// A class which mocks [TestWKHttpCookieStoreHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKHttpCookieStoreHostApi extends _i1.Mock
    implements _i2.TestWKHttpCookieStoreHostApi {
  MockTestWKHttpCookieStoreHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void createFromWebsiteDataStore(
          int? instanceId, int? websiteDataStoreInstanceId) =>
      super.noSuchMethod(
          Invocation.method(#createFromWebsiteDataStore,
              [instanceId, websiteDataStoreInstanceId]),
          returnValueForMissingStub: null);
  @override
  _i3.Future<void> setCookie(int? instanceId, _i4.NSHttpCookieData? cookie) =>
      (super.noSuchMethod(Invocation.method(#setCookie, [instanceId, cookie]),
          returnValue: Future<void>.value(),
          returnValueForMissingStub: Future<void>.value()) as _i3.Future<void>);
}

/// A class which mocks [TestWKNavigationDelegateHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKNavigationDelegateHostApi extends _i1.Mock
    implements _i2.TestWKNavigationDelegateHostApi {
  MockTestWKNavigationDelegateHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void create(int? instanceId) =>
      super.noSuchMethod(Invocation.method(#create, [instanceId]),
          returnValueForMissingStub: null);
  @override
  void setDidFinishNavigation(int? instanceId, int? functionInstanceId) =>
      super.noSuchMethod(
          Invocation.method(
              #setDidFinishNavigation, [instanceId, functionInstanceId]),
          returnValueForMissingStub: null);
}

/// A class which mocks [TestWKPreferencesHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKPreferencesHostApi extends _i1.Mock
    implements _i2.TestWKPreferencesHostApi {
  MockTestWKPreferencesHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void createFromWebViewConfiguration(
          int? instanceId, int? configurationInstanceId) =>
      super.noSuchMethod(
          Invocation.method(#createFromWebViewConfiguration,
              [instanceId, configurationInstanceId]),
          returnValueForMissingStub: null);
  @override
  void setJavaScriptEnabled(int? instanceId, bool? enabled) =>
      super.noSuchMethod(
          Invocation.method(#setJavaScriptEnabled, [instanceId, enabled]),
          returnValueForMissingStub: null);
}

/// A class which mocks [TestWKScriptMessageHandlerHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKScriptMessageHandlerHostApi extends _i1.Mock
    implements _i2.TestWKScriptMessageHandlerHostApi {
  MockTestWKScriptMessageHandlerHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void create(int? instanceId) =>
      super.noSuchMethod(Invocation.method(#create, [instanceId]),
          returnValueForMissingStub: null);
}

/// A class which mocks [TestWKUIDelegateHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKUIDelegateHostApi extends _i1.Mock
    implements _i2.TestWKUIDelegateHostApi {
  MockTestWKUIDelegateHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void create(int? instanceId) =>
      super.noSuchMethod(Invocation.method(#create, [instanceId]),
          returnValueForMissingStub: null);
}

/// A class which mocks [TestWKUserContentControllerHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKUserContentControllerHostApi extends _i1.Mock
    implements _i2.TestWKUserContentControllerHostApi {
  MockTestWKUserContentControllerHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void createFromWebViewConfiguration(
          int? instanceId, int? configurationInstanceId) =>
      super.noSuchMethod(
          Invocation.method(#createFromWebViewConfiguration,
              [instanceId, configurationInstanceId]),
          returnValueForMissingStub: null);
  @override
  void addScriptMessageHandler(
          int? instanceId, int? handlerInstanceid, String? name) =>
      super.noSuchMethod(
          Invocation.method(
              #addScriptMessageHandler, [instanceId, handlerInstanceid, name]),
          returnValueForMissingStub: null);
  @override
  void removeScriptMessageHandler(int? instanceId, String? name) =>
      super.noSuchMethod(
          Invocation.method(#removeScriptMessageHandler, [instanceId, name]),
          returnValueForMissingStub: null);
  @override
  void removeAllScriptMessageHandlers(int? instanceId) => super.noSuchMethod(
      Invocation.method(#removeAllScriptMessageHandlers, [instanceId]),
      returnValueForMissingStub: null);
  @override
  void addUserScript(int? instanceId, _i4.WKUserScriptData? userScript) => super
      .noSuchMethod(Invocation.method(#addUserScript, [instanceId, userScript]),
          returnValueForMissingStub: null);
  @override
  void removeAllUserScripts(int? instanceId) =>
      super.noSuchMethod(Invocation.method(#removeAllUserScripts, [instanceId]),
          returnValueForMissingStub: null);
}

/// A class which mocks [TestWKWebViewConfigurationHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKWebViewConfigurationHostApi extends _i1.Mock
    implements _i2.TestWKWebViewConfigurationHostApi {
  MockTestWKWebViewConfigurationHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void create(int? instanceId) =>
      super.noSuchMethod(Invocation.method(#create, [instanceId]),
          returnValueForMissingStub: null);
  @override
  void createFromWebView(int? instanceId, int? webViewInstanceId) =>
      super.noSuchMethod(
          Invocation.method(
              #createFromWebView, [instanceId, webViewInstanceId]),
          returnValueForMissingStub: null);
  @override
  void setAllowsInlineMediaPlayback(int? instanceId, bool? allow) =>
      super.noSuchMethod(
          Invocation.method(#setAllowsInlineMediaPlayback, [instanceId, allow]),
          returnValueForMissingStub: null);
  @override
  void setMediaTypesRequiringUserActionForPlayback(
          int? instanceId, List<_i4.WKAudiovisualMediaTypeEnumData?>? types) =>
      super.noSuchMethod(
          Invocation.method(#setMediaTypesRequiringUserActionForPlayback,
              [instanceId, types]),
          returnValueForMissingStub: null);
}

/// A class which mocks [TestWKWebViewHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKWebViewHostApi extends _i1.Mock
    implements _i2.TestWKWebViewHostApi {
  MockTestWKWebViewHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void create(int? instanceId, int? configurationInstanceId) =>
      super.noSuchMethod(
          Invocation.method(#create, [instanceId, configurationInstanceId]),
          returnValueForMissingStub: null);
  @override
  void setUIDelegate(int? instanceId, int? uiDelegateInstanceId) =>
      super.noSuchMethod(
          Invocation.method(#setUIDelegate, [instanceId, uiDelegateInstanceId]),
          returnValueForMissingStub: null);
  @override
  void setNavigationDelegate(
          int? instanceId, int? navigationDelegateInstanceId) =>
      super.noSuchMethod(
          Invocation.method(#setNavigationDelegate,
              [instanceId, navigationDelegateInstanceId]),
          returnValueForMissingStub: null);
  @override
  String? getUrl(int? instanceId) =>
      (super.noSuchMethod(Invocation.method(#getUrl, [instanceId])) as String?);
  @override
  double getEstimatedProgress(int? instanceId) => (super.noSuchMethod(
      Invocation.method(#getEstimatedProgress, [instanceId]),
      returnValue: 0.0) as double);
  @override
  void loadRequest(int? instanceId, _i4.NSUrlRequestData? request) =>
      super.noSuchMethod(Invocation.method(#loadRequest, [instanceId, request]),
          returnValueForMissingStub: null);
  @override
  void loadHtmlString(int? instanceId, String? string, String? baseUrl) =>
      super.noSuchMethod(
          Invocation.method(#loadHtmlString, [instanceId, string, baseUrl]),
          returnValueForMissingStub: null);
  @override
  void loadFileUrl(int? instanceId, String? url, String? readAccessUrl) =>
      super.noSuchMethod(
          Invocation.method(#loadFileUrl, [instanceId, url, readAccessUrl]),
          returnValueForMissingStub: null);
  @override
  void loadFlutterAsset(int? instanceId, String? key) => super.noSuchMethod(
      Invocation.method(#loadFlutterAsset, [instanceId, key]),
      returnValueForMissingStub: null);
  @override
  bool canGoBack(int? instanceId) =>
      (super.noSuchMethod(Invocation.method(#canGoBack, [instanceId]),
          returnValue: false) as bool);
  @override
  bool canGoForward(int? instanceId) =>
      (super.noSuchMethod(Invocation.method(#canGoForward, [instanceId]),
          returnValue: false) as bool);
  @override
  void goBack(int? instanceId) =>
      super.noSuchMethod(Invocation.method(#goBack, [instanceId]),
          returnValueForMissingStub: null);
  @override
  void goForward(int? instanceId) =>
      super.noSuchMethod(Invocation.method(#goForward, [instanceId]),
          returnValueForMissingStub: null);
  @override
  void reload(int? instanceId) =>
      super.noSuchMethod(Invocation.method(#reload, [instanceId]),
          returnValueForMissingStub: null);
  @override
  String? getTitle(int? instanceId) =>
      (super.noSuchMethod(Invocation.method(#getTitle, [instanceId]))
          as String?);
  @override
  void setAllowsBackForwardNavigationGestures(int? instanceId, bool? allow) =>
      super.noSuchMethod(
          Invocation.method(
              #setAllowsBackForwardNavigationGestures, [instanceId, allow]),
          returnValueForMissingStub: null);
  @override
  void setCustomUserAgent(int? instanceId, String? userAgent) =>
      super.noSuchMethod(
          Invocation.method(#setCustomUserAgent, [instanceId, userAgent]),
          returnValueForMissingStub: null);
  @override
  _i3.Future<Object?> evaluateJavaScript(
          int? instanceId, String? javaScriptString) =>
      (super.noSuchMethod(
          Invocation.method(
              #evaluateJavaScript, [instanceId, javaScriptString]),
          returnValue: Future<Object?>.value()) as _i3.Future<Object?>);
}

/// A class which mocks [TestWKWebsiteDataStoreHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestWKWebsiteDataStoreHostApi extends _i1.Mock
    implements _i2.TestWKWebsiteDataStoreHostApi {
  MockTestWKWebsiteDataStoreHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void createFromWebViewConfiguration(
          int? instanceId, int? configurationInstanceId) =>
      super.noSuchMethod(
          Invocation.method(#createFromWebViewConfiguration,
              [instanceId, configurationInstanceId]),
          returnValueForMissingStub: null);
  @override
  void createDefaultDataStore(int? instanceId) => super.noSuchMethod(
      Invocation.method(#createDefaultDataStore, [instanceId]),
      returnValueForMissingStub: null);
  @override
  _i3.Future<bool> removeDataOfTypes(
          int? instanceId,
          List<_i4.WKWebsiteDataTypeEnumData?>? dataTypes,
          double? secondsModifiedSinceEpoch) =>
      (super.noSuchMethod(
          Invocation.method(#removeDataOfTypes,
              [instanceId, dataTypes, secondsModifiedSinceEpoch]),
          returnValue: Future<bool>.value(false)) as _i3.Future<bool>);
}
