twonly-app-dependencies/camera_avfoundation/darwin/Tests/CameraExposureTests.swift
2026-10-07 22:18:23 +02:00

146 lines
4.7 KiB
Swift

// Copyright 2013 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import XCTest
@testable import camera_avfoundation
final class CameraExposureTests: XCTestCase {
private func createCamera() -> (Camera, MockCaptureDevice, MockDeviceOrientationProvider) {
let mockDevice = MockCaptureDevice()
let mockDeviceOrientationProvider = MockDeviceOrientationProvider()
let configuration = CameraTestUtils.createTestCameraConfiguration()
configuration.videoCaptureDeviceFactory = { _ in mockDevice }
configuration.deviceOrientationProvider = mockDeviceOrientationProvider
let camera = CameraTestUtils.createTestCamera(configuration)
return (camera, mockDevice, mockDeviceOrientationProvider)
}
func testSetExposureModeLocked_setsAuthExposeMode() {
let (camera, mockDevice, _) = createCamera()
mockDevice.setExposureModeStub = { mode in
// AVCaptureExposureModeAutoExpose automatically adjusts the exposure one time, and then
// locks exposure for the device
XCTAssertEqual(mode, .autoExpose)
}
camera.setExposureMode(.locked)
}
func testSetExposureModeAuto_setsContinousAutoExposureMode_ifSupported() {
let (camera, mockDevice, _) = createCamera()
// All exposure modes are supported
mockDevice.isExposureModeSupportedStub = { _ in true }
mockDevice.setExposureModeStub = { mode in
XCTAssertEqual(mode, .continuousAutoExposure)
}
camera.setExposureMode(.auto)
}
func testSetExposureModeAuto_setsAutoExposeMode_ifContinousAutoIsNotSupported() {
let (camera, mockDevice, _) = createCamera()
// Continous auto exposure is not supported
mockDevice.isExposureModeSupportedStub = { mode in
mode != .continuousAutoExposure
}
mockDevice.setExposureModeStub = { mode in
XCTAssertEqual(mode, .autoExpose)
}
camera.setExposureMode(.auto)
}
func testSetExposurePoint_setsExposurePointOfInterest() {
let (camera, mockDevice, mockDeviceOrientationProvider) = createCamera()
// UI is currently in landscape left orientation.
mockDeviceOrientationProvider.orientationStub = { .landscapeLeft }
// Exposure point of interest is supported.
mockDevice.isExposurePointOfInterestSupported = true
// Verify the focus point of interest has been set.
var setPoint = CGPoint.zero
mockDevice.setExposurePointOfInterestStub = { point in
if point == CGPoint(x: 1, y: 1) {
setPoint = point
}
}
let expectation = expectation(description: "Completion called")
camera.setExposurePoint(PlatformPoint(x: 1, y: 1)) {
result in
let _ = self.assertSuccess(result)
expectation.fulfill()
}
waitForExpectations(timeout: 30, handler: nil)
XCTAssertEqual(setPoint, CGPoint(x: 1.0, y: 1.0))
}
func testSetExposurePoint_returnsError_ifNotSupported() {
let (camera, mockDevice, mockDeviceOrientationProvider) = createCamera()
// UI is currently in landscape left orientation.
mockDeviceOrientationProvider.orientationStub = { .landscapeLeft }
// Exposure point of interest is not supported.
mockDevice.isExposurePointOfInterestSupported = false
let expectation = expectation(description: "Completion with error")
camera.setExposurePoint(PlatformPoint(x: 1, y: 1)) { result in
switch result {
case .failure(let error as PigeonError):
XCTAssertEqual(error.code, "setExposurePointFailed")
XCTAssertEqual(error.message, "Device does not have exposure point capabilities")
default:
XCTFail("Expected failure")
}
expectation.fulfill()
}
waitForExpectations(timeout: 30, handler: nil)
}
func testSetExposureOffset_setsExposureTargetBias() {
let (camera, mockDevice, _) = createCamera()
let targetOffset = CGFloat(1.0)
var setExposureTargetBiasCalled = false
mockDevice.setExposureTargetBiasStub = { bias, handler in
XCTAssertEqual(bias, Float(targetOffset))
setExposureTargetBiasCalled = true
}
camera.setExposureOffset(targetOffset)
XCTAssertTrue(setExposureTargetBiasCalled)
}
func testMaximumExposureOffset_returnsDeviceMaxExposureTargetBias() {
let (camera, mockDevice, _) = createCamera()
let targetOffset = CGFloat(1.0)
mockDevice.maxExposureTargetBias = Float(targetOffset)
XCTAssertEqual(camera.maximumExposureOffset, targetOffset)
}
func testMinimumExposureOffset_returnsDeviceMinExposureTargetBias() {
let (camera, mockDevice, _) = createCamera()
let targetOffset = CGFloat(1.0)
mockDevice.minExposureTargetBias = Float(targetOffset)
XCTAssertEqual(camera.minimumExposureOffset, targetOffset)
}
}