// Mocks generated by Mockito 5.2.0 from annotations
// in file_selector_windows/example/windows/flutter/ephemeral/.plugin_symlinks/file_selector_windows/test/file_selector_windows_test.dart.
// Do not manually edit this file.

import 'package:file_selector_windows/src/messages.g.dart' as _i3;
import 'package:mockito/mockito.dart' as _i1;

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

  @override
  List<String?> showOpenDialog(_i3.SelectionOptions? options,
          String? initialDirectory, String? confirmButtonText) =>
      (super.noSuchMethod(
          Invocation.method(
              #showOpenDialog, [options, initialDirectory, confirmButtonText]),
          returnValue: <String?>[]) as List<String?>);
  @override
  List<String?> showSaveDialog(
          _i3.SelectionOptions? options,
          String? initialDirectory,
          String? suggestedName,
          String? confirmButtonText) =>
      (super.noSuchMethod(
          Invocation.method(#showSaveDialog,
              [options, initialDirectory, suggestedName, confirmButtonText]),
          returnValue: <String?>[]) as List<String?>);
}
