// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter/test/webview_cookie_manager_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i4;

import 'package:mockito/mockito.dart' as _i1;
import 'package:webview_flutter_platform_interface/src/platform_webview_cookie_manager.dart'
    as _i3;
import 'package:webview_flutter_platform_interface/src/webview_platform.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
// ignore_for_file: subtype_of_sealed_class

class _FakePlatformWebViewCookieManagerCreationParams_0 extends _i1.SmartFake
    implements _i2.PlatformWebViewCookieManagerCreationParams {
  _FakePlatformWebViewCookieManagerCreationParams_0(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

  @override
  _i2.PlatformWebViewCookieManagerCreationParams get params =>
      (super.noSuchMethod(
        Invocation.getter(#params),
        returnValue: _FakePlatformWebViewCookieManagerCreationParams_0(
          this,
          Invocation.getter(#params),
        ),
      ) as _i2.PlatformWebViewCookieManagerCreationParams);
  @override
  _i4.Future<bool> clearCookies() => (super.noSuchMethod(
        Invocation.method(
          #clearCookies,
          [],
        ),
        returnValue: _i4.Future<bool>.value(false),
      ) as _i4.Future<bool>);
  @override
  _i4.Future<void> setCookie(_i2.WebViewCookie? cookie) => (super.noSuchMethod(
        Invocation.method(
          #setCookie,
          [cookie],
        ),
        returnValue: _i4.Future<void>.value(),
        returnValueForMissingStub: _i4.Future<void>.value(),
      ) as _i4.Future<void>);
}
