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

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

import 'package:camera_android_camerax/src/camera_info.dart' as _i4;
import 'package:camera_android_camerax/src/camera_selector.dart' as _i5;
import 'package:camera_android_camerax/src/process_camera_provider.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
// ignore_for_file: subtype_of_sealed_class

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

  @override
  _i3.Future<List<_i4.CameraInfo>> getAvailableCameraInfos() =>
      (super.noSuchMethod(
        Invocation.method(
          #getAvailableCameraInfos,
          [],
        ),
        returnValue: _i3.Future<List<_i4.CameraInfo>>.value(<_i4.CameraInfo>[]),
      ) as _i3.Future<List<_i4.CameraInfo>>);
}

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

  @override
  _i3.Future<List<_i4.CameraInfo>> filter(List<_i4.CameraInfo>? cameraInfos) =>
      (super.noSuchMethod(
        Invocation.method(
          #filter,
          [cameraInfos],
        ),
        returnValue: _i3.Future<List<_i4.CameraInfo>>.value(<_i4.CameraInfo>[]),
      ) as _i3.Future<List<_i4.CameraInfo>>);
}

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

  @override
  _i3.Future<int> getSensorRotationDegrees() => (super.noSuchMethod(
        Invocation.method(
          #getSensorRotationDegrees,
          [],
        ),
        returnValue: _i3.Future<int>.value(0),
      ) as _i3.Future<int>);
}
