// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:image_picker_ios/image_picker_ios.dart';
import 'package:image_picker_ios/src/messages.g.dart';
import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';

import 'test_api.dart';

@immutable
class _LoggedMethodCall {
  const _LoggedMethodCall(this.name, {required this.arguments});
  final String name;
  final Map<String, Object?> arguments;

  @override
  bool operator ==(Object other) {
    return other is _LoggedMethodCall &&
        name == other.name &&
        mapEquals(arguments, other.arguments);
  }

  @override
  int get hashCode => Object.hash(name, arguments);

  @override
  String toString() {
    return 'MethodCall: $name $arguments';
  }
}

class _ApiLogger implements TestHostImagePickerApi {
  // The value to return from future calls.
  dynamic returnValue = '';
  final List<_LoggedMethodCall> calls = <_LoggedMethodCall>[];

  @override
  Future<String?> pickImage(
      SourceSpecification source, MaxSize maxSize, int? imageQuality) async {
    // Flatten arguments for easy comparison.
    calls.add(_LoggedMethodCall('pickImage', arguments: <String, dynamic>{
      'source': source.type,
      'cameraDevice': source.camera,
      'maxWidth': maxSize.width,
      'maxHeight': maxSize.height,
      'imageQuality': imageQuality,
    }));
    return returnValue as String?;
  }

  @override
  Future<List<String?>?> pickMultiImage(
      MaxSize maxSize, int? imageQuality) async {
    calls.add(_LoggedMethodCall('pickMultiImage', arguments: <String, dynamic>{
      'maxWidth': maxSize.width,
      'maxHeight': maxSize.height,
      'imageQuality': imageQuality,
    }));
    return returnValue as List<String?>?;
  }

  @override
  Future<String?> pickVideo(
      SourceSpecification source, int? maxDurationSeconds) async {
    calls.add(_LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
      'source': source.type,
      'cameraDevice': source.camera,
      'maxDuration': maxDurationSeconds,
    }));
    return returnValue as String?;
  }
}

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  final ImagePickerIOS picker = ImagePickerIOS();
  late _ApiLogger log;

  setUp(() {
    log = _ApiLogger();
    TestHostImagePickerApi.setup(log);
  });

  test('registration', () async {
    ImagePickerIOS.registerWith();
    expect(ImagePickerPlatform.instance, isA<ImagePickerIOS>());
  });

  group('#pickImage', () {
    test('passes the image source argument correctly', () async {
      await picker.pickImage(source: ImageSource.camera);
      await picker.pickImage(source: ImageSource.gallery);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.gallery,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
        ],
      );
    });

    test('passes the width and height arguments correctly', () async {
      await picker.pickImage(source: ImageSource.camera);
      await picker.pickImage(
        source: ImageSource.camera,
        maxWidth: 10.0,
      );
      await picker.pickImage(
        source: ImageSource.camera,
        maxHeight: 10.0,
      );
      await picker.pickImage(
        source: ImageSource.camera,
        maxWidth: 10.0,
        maxHeight: 20.0,
      );
      await picker.pickImage(
        source: ImageSource.camera,
        maxWidth: 10.0,
        imageQuality: 70,
      );
      await picker.pickImage(
        source: ImageSource.camera,
        maxHeight: 10.0,
        imageQuality: 70,
      );
      await picker.pickImage(
        source: ImageSource.camera,
        maxWidth: 10.0,
        maxHeight: 20.0,
        imageQuality: 70,
      );

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': 10.0,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': 10.0,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': 10.0,
            'maxHeight': 20.0,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': 10.0,
            'maxHeight': null,
            'imageQuality': 70,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': 10.0,
            'imageQuality': 70,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': 10.0,
            'maxHeight': 20.0,
            'imageQuality': 70,
            'cameraDevice': SourceCamera.rear
          }),
        ],
      );
    });

    test('does not accept a invalid imageQuality argument', () {
      expect(
        () => picker.pickImage(imageQuality: -1, source: ImageSource.gallery),
        throwsArgumentError,
      );

      expect(
        () => picker.pickImage(imageQuality: 101, source: ImageSource.gallery),
        throwsArgumentError,
      );

      expect(
        () => picker.pickImage(imageQuality: -1, source: ImageSource.camera),
        throwsArgumentError,
      );

      expect(
        () => picker.pickImage(imageQuality: 101, source: ImageSource.camera),
        throwsArgumentError,
      );
    });

    test('does not accept a negative width or height argument', () {
      expect(
        () => picker.pickImage(source: ImageSource.camera, maxWidth: -1.0),
        throwsArgumentError,
      );

      expect(
        () => picker.pickImage(source: ImageSource.camera, maxHeight: -1.0),
        throwsArgumentError,
      );
    });

    test('handles a null image path response gracefully', () async {
      log.returnValue = null;

      expect(await picker.pickImage(source: ImageSource.gallery), isNull);
      expect(await picker.pickImage(source: ImageSource.camera), isNull);
    });

    test('camera position defaults to back', () async {
      await picker.pickImage(source: ImageSource.camera);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear,
          }),
        ],
      );
    });

    test('camera position can set to front', () async {
      await picker.pickImage(
          source: ImageSource.camera,
          preferredCameraDevice: CameraDevice.front);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.front,
          }),
        ],
      );
    });
  });

  group('#pickMultiImage', () {
    test('calls the method correctly', () async {
      log.returnValue = <String>['0', '1'];
      await picker.pickMultiImage();

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': null,
                'maxHeight': null,
                'imageQuality': null,
              }),
        ],
      );
    });

    test('passes the width and height arguments correctly', () async {
      log.returnValue = <String>['0', '1'];
      await picker.pickMultiImage();
      await picker.pickMultiImage(
        maxWidth: 10.0,
      );
      await picker.pickMultiImage(
        maxHeight: 10.0,
      );
      await picker.pickMultiImage(
        maxWidth: 10.0,
        maxHeight: 20.0,
      );
      await picker.pickMultiImage(
        maxWidth: 10.0,
        imageQuality: 70,
      );
      await picker.pickMultiImage(
        maxHeight: 10.0,
        imageQuality: 70,
      );
      await picker.pickMultiImage(
        maxWidth: 10.0,
        maxHeight: 20.0,
        imageQuality: 70,
      );

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': null,
                'maxHeight': null,
                'imageQuality': null,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': 10.0,
                'maxHeight': null,
                'imageQuality': null,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': null,
                'maxHeight': 10.0,
                'imageQuality': null,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': 10.0,
                'maxHeight': 20.0,
                'imageQuality': null,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': 10.0,
                'maxHeight': null,
                'imageQuality': 70,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': null,
                'maxHeight': 10.0,
                'imageQuality': 70,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': 10.0,
                'maxHeight': 20.0,
                'imageQuality': 70,
              }),
        ],
      );
    });

    test('does not accept a negative width or height argument', () {
      expect(
        () => picker.pickMultiImage(maxWidth: -1.0),
        throwsArgumentError,
      );

      expect(
        () => picker.pickMultiImage(maxHeight: -1.0),
        throwsArgumentError,
      );
    });

    test('does not accept a invalid imageQuality argument', () {
      expect(
        () => picker.pickMultiImage(imageQuality: -1),
        throwsArgumentError,
      );

      expect(
        () => picker.pickMultiImage(imageQuality: 101),
        throwsArgumentError,
      );
    });

    test('handles a null image path response gracefully', () async {
      log.returnValue = null;

      expect(await picker.pickMultiImage(), isNull);
    });
  });

  group('#pickVideo', () {
    test('passes the image source argument correctly', () async {
      await picker.pickVideo(source: ImageSource.camera);
      await picker.pickVideo(source: ImageSource.gallery);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'cameraDevice': SourceCamera.rear,
            'maxDuration': null,
          }),
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.gallery,
            'cameraDevice': SourceCamera.rear,
            'maxDuration': null,
          }),
        ],
      );
    });

    test('passes the duration argument correctly', () async {
      await picker.pickVideo(source: ImageSource.camera);
      await picker.pickVideo(
        source: ImageSource.camera,
        maxDuration: const Duration(seconds: 10),
      );
      await picker.pickVideo(
        source: ImageSource.camera,
        maxDuration: const Duration(minutes: 1),
      );
      await picker.pickVideo(
        source: ImageSource.camera,
        maxDuration: const Duration(hours: 1),
      );
      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': null,
            'cameraDevice': SourceCamera.rear,
          }),
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': 10,
            'cameraDevice': SourceCamera.rear,
          }),
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': 60,
            'cameraDevice': SourceCamera.rear,
          }),
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': 3600,
            'cameraDevice': SourceCamera.rear,
          }),
        ],
      );
    });

    test('handles a null video path response gracefully', () async {
      log.returnValue = null;

      expect(await picker.pickVideo(source: ImageSource.gallery), isNull);
      expect(await picker.pickVideo(source: ImageSource.camera), isNull);
    });

    test('camera position defaults to back', () async {
      await picker.pickVideo(source: ImageSource.camera);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'cameraDevice': SourceCamera.rear,
            'maxDuration': null,
          }),
        ],
      );
    });

    test('camera position can set to front', () async {
      await picker.pickVideo(
        source: ImageSource.camera,
        preferredCameraDevice: CameraDevice.front,
      );

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': null,
            'cameraDevice': SourceCamera.front,
          }),
        ],
      );
    });
  });

  group('#getImage', () {
    test('passes the image source argument correctly', () async {
      await picker.getImage(source: ImageSource.camera);
      await picker.getImage(source: ImageSource.gallery);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.gallery,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
        ],
      );
    });

    test('passes the width and height arguments correctly', () async {
      await picker.getImage(source: ImageSource.camera);
      await picker.getImage(
        source: ImageSource.camera,
        maxWidth: 10.0,
      );
      await picker.getImage(
        source: ImageSource.camera,
        maxHeight: 10.0,
      );
      await picker.getImage(
        source: ImageSource.camera,
        maxWidth: 10.0,
        maxHeight: 20.0,
      );
      await picker.getImage(
        source: ImageSource.camera,
        maxWidth: 10.0,
        imageQuality: 70,
      );
      await picker.getImage(
        source: ImageSource.camera,
        maxHeight: 10.0,
        imageQuality: 70,
      );
      await picker.getImage(
        source: ImageSource.camera,
        maxWidth: 10.0,
        maxHeight: 20.0,
        imageQuality: 70,
      );

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': 10.0,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': 10.0,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': 10.0,
            'maxHeight': 20.0,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': 10.0,
            'maxHeight': null,
            'imageQuality': 70,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': 10.0,
            'imageQuality': 70,
            'cameraDevice': SourceCamera.rear
          }),
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': 10.0,
            'maxHeight': 20.0,
            'imageQuality': 70,
            'cameraDevice': SourceCamera.rear
          }),
        ],
      );
    });

    test('does not accept a invalid imageQuality argument', () {
      expect(
        () => picker.getImage(imageQuality: -1, source: ImageSource.gallery),
        throwsArgumentError,
      );

      expect(
        () => picker.getImage(imageQuality: 101, source: ImageSource.gallery),
        throwsArgumentError,
      );

      expect(
        () => picker.getImage(imageQuality: -1, source: ImageSource.camera),
        throwsArgumentError,
      );

      expect(
        () => picker.getImage(imageQuality: 101, source: ImageSource.camera),
        throwsArgumentError,
      );
    });

    test('does not accept a negative width or height argument', () {
      expect(
        () => picker.getImage(source: ImageSource.camera, maxWidth: -1.0),
        throwsArgumentError,
      );

      expect(
        () => picker.getImage(source: ImageSource.camera, maxHeight: -1.0),
        throwsArgumentError,
      );
    });

    test('handles a null image path response gracefully', () async {
      log.returnValue = null;

      expect(await picker.getImage(source: ImageSource.gallery), isNull);
      expect(await picker.getImage(source: ImageSource.camera), isNull);
    });

    test('camera position defaults to back', () async {
      await picker.getImage(source: ImageSource.camera);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.rear,
          }),
        ],
      );
    });

    test('camera position can set to front', () async {
      await picker.getImage(
          source: ImageSource.camera,
          preferredCameraDevice: CameraDevice.front);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickImage', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxWidth': null,
            'maxHeight': null,
            'imageQuality': null,
            'cameraDevice': SourceCamera.front,
          }),
        ],
      );
    });
  });

  group('#getMultiImage', () {
    test('calls the method correctly', () async {
      log.returnValue = <String>['0', '1'];
      await picker.getMultiImage();

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': null,
                'maxHeight': null,
                'imageQuality': null,
              }),
        ],
      );
    });

    test('passes the width and height arguments correctly', () async {
      log.returnValue = <String>['0', '1'];
      await picker.getMultiImage();
      await picker.getMultiImage(
        maxWidth: 10.0,
      );
      await picker.getMultiImage(
        maxHeight: 10.0,
      );
      await picker.getMultiImage(
        maxWidth: 10.0,
        maxHeight: 20.0,
      );
      await picker.getMultiImage(
        maxWidth: 10.0,
        imageQuality: 70,
      );
      await picker.getMultiImage(
        maxHeight: 10.0,
        imageQuality: 70,
      );
      await picker.getMultiImage(
        maxWidth: 10.0,
        maxHeight: 20.0,
        imageQuality: 70,
      );

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': null,
                'maxHeight': null,
                'imageQuality': null,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': 10.0,
                'maxHeight': null,
                'imageQuality': null,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': null,
                'maxHeight': 10.0,
                'imageQuality': null,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': 10.0,
                'maxHeight': 20.0,
                'imageQuality': null,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': 10.0,
                'maxHeight': null,
                'imageQuality': 70,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': null,
                'maxHeight': 10.0,
                'imageQuality': 70,
              }),
          const _LoggedMethodCall('pickMultiImage',
              arguments: <String, dynamic>{
                'maxWidth': 10.0,
                'maxHeight': 20.0,
                'imageQuality': 70,
              }),
        ],
      );
    });

    test('does not accept a negative width or height argument', () {
      log.returnValue = <String>['0', '1'];
      expect(
        () => picker.getMultiImage(maxWidth: -1.0),
        throwsArgumentError,
      );

      expect(
        () => picker.getMultiImage(maxHeight: -1.0),
        throwsArgumentError,
      );
    });

    test('does not accept a invalid imageQuality argument', () {
      log.returnValue = <String>['0', '1'];
      expect(
        () => picker.getMultiImage(imageQuality: -1),
        throwsArgumentError,
      );

      expect(
        () => picker.getMultiImage(imageQuality: 101),
        throwsArgumentError,
      );
    });

    test('handles a null image path response gracefully', () async {
      log.returnValue = null;

      expect(await picker.getMultiImage(), isNull);
      expect(await picker.getMultiImage(), isNull);
    });
  });

  group('#getVideo', () {
    test('passes the image source argument correctly', () async {
      await picker.getVideo(source: ImageSource.camera);
      await picker.getVideo(source: ImageSource.gallery);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'cameraDevice': SourceCamera.rear,
            'maxDuration': null,
          }),
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.gallery,
            'cameraDevice': SourceCamera.rear,
            'maxDuration': null,
          }),
        ],
      );
    });

    test('passes the duration argument correctly', () async {
      await picker.getVideo(source: ImageSource.camera);
      await picker.getVideo(
        source: ImageSource.camera,
        maxDuration: const Duration(seconds: 10),
      );
      await picker.getVideo(
        source: ImageSource.camera,
        maxDuration: const Duration(minutes: 1),
      );
      await picker.getVideo(
        source: ImageSource.camera,
        maxDuration: const Duration(hours: 1),
      );
      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': null,
            'cameraDevice': SourceCamera.rear,
          }),
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': 10,
            'cameraDevice': SourceCamera.rear,
          }),
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': 60,
            'cameraDevice': SourceCamera.rear,
          }),
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': 3600,
            'cameraDevice': SourceCamera.rear,
          }),
        ],
      );
    });

    test('handles a null video path response gracefully', () async {
      log.returnValue = null;

      expect(await picker.getVideo(source: ImageSource.gallery), isNull);
      expect(await picker.getVideo(source: ImageSource.camera), isNull);
    });

    test('camera position defaults to back', () async {
      await picker.getVideo(source: ImageSource.camera);

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'cameraDevice': SourceCamera.rear,
            'maxDuration': null,
          }),
        ],
      );
    });

    test('camera position can set to front', () async {
      await picker.getVideo(
        source: ImageSource.camera,
        preferredCameraDevice: CameraDevice.front,
      );

      expect(
        log.calls,
        <_LoggedMethodCall>[
          const _LoggedMethodCall('pickVideo', arguments: <String, dynamic>{
            'source': SourceType.camera,
            'maxDuration': null,
            'cameraDevice': SourceCamera.front,
          }),
        ],
      );
    });
  });
}
