// Mocks generated by Mockito 5.1.0 from annotations
// in image_picker_windows/example/windows/flutter/ephemeral/.plugin_symlinks/image_picker_windows/test/image_picker_windows_test.dart.
// Do not manually edit this file.

import 'dart:async' as _i3;

import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'
    as _i2;
import 'package:mockito/mockito.dart' as _i1;

// 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 [FileSelectorPlatform].
///
/// See the documentation for Mockito's code generation for more information.
class MockFileSelectorPlatform extends _i1.Mock
    implements _i2.FileSelectorPlatform {
  MockFileSelectorPlatform() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i3.Future<_i2.XFile?> openFile(
          {List<_i2.XTypeGroup>? acceptedTypeGroups,
          String? initialDirectory,
          String? confirmButtonText}) =>
      (super.noSuchMethod(
          Invocation.method(#openFile, [], {
            #acceptedTypeGroups: acceptedTypeGroups,
            #initialDirectory: initialDirectory,
            #confirmButtonText: confirmButtonText
          }),
          returnValue: Future<_i2.XFile?>.value()) as _i3.Future<_i2.XFile?>);
  @override
  _i3.Future<List<_i2.XFile>> openFiles(
          {List<_i2.XTypeGroup>? acceptedTypeGroups,
          String? initialDirectory,
          String? confirmButtonText}) =>
      (super.noSuchMethod(
              Invocation.method(#openFiles, [], {
                #acceptedTypeGroups: acceptedTypeGroups,
                #initialDirectory: initialDirectory,
                #confirmButtonText: confirmButtonText
              }),
              returnValue: Future<List<_i2.XFile>>.value(<_i2.XFile>[]))
          as _i3.Future<List<_i2.XFile>>);
  @override
  _i3.Future<String?> getSavePath(
          {List<_i2.XTypeGroup>? acceptedTypeGroups,
          String? initialDirectory,
          String? suggestedName,
          String? confirmButtonText}) =>
      (super.noSuchMethod(
          Invocation.method(#getSavePath, [], {
            #acceptedTypeGroups: acceptedTypeGroups,
            #initialDirectory: initialDirectory,
            #suggestedName: suggestedName,
            #confirmButtonText: confirmButtonText
          }),
          returnValue: Future<String?>.value()) as _i3.Future<String?>);
  @override
  _i3.Future<String?> getDirectoryPath(
          {String? initialDirectory, String? confirmButtonText}) =>
      (super.noSuchMethod(
          Invocation.method(#getDirectoryPath, [], {
            #initialDirectory: initialDirectory,
            #confirmButtonText: confirmButtonText
          }),
          returnValue: Future<String?>.value()) as _i3.Future<String?>);
}
