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

108 lines
4.2 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 AVFoundation
import XCTest
@testable import camera_avfoundation
final class CameraSetDeviceOrientationTests: XCTestCase {
private func createCamera() -> (Camera, MockCaptureConnection, MockCaptureConnection) {
let camera = CameraTestUtils.createTestCamera()
let mockCapturePhotoOutput = MockCapturePhotoOutput()
let mockPhotoCaptureConnection = MockCaptureConnection()
mockPhotoCaptureConnection.isVideoOrientationSupported = true
mockCapturePhotoOutput.connectionWithMediaTypeStub = { _ in mockPhotoCaptureConnection }
camera.capturePhotoOutput = mockCapturePhotoOutput
let mockCaptureVideoDataOutput = MockCaptureVideoDataOutput()
let mockVideoCaptureConnection = MockCaptureConnection()
mockVideoCaptureConnection.isVideoOrientationSupported = true
mockCaptureVideoDataOutput.connectionWithMediaTypeStub = { _ in mockVideoCaptureConnection }
camera.captureVideoOutput = mockCaptureVideoDataOutput
return (camera, mockPhotoCaptureConnection, mockVideoCaptureConnection)
}
func testSetDeviceOrientation_setsOrientationsOfCaptureConnections() {
let (camera, mockPhotoCaptureConnection, mockVideoCaptureConnection) = createCamera()
var photoSetVideoOrientationCalled = false
mockPhotoCaptureConnection.setVideoOrientationStub = { orientation in
// Device orientation is flipped compared to video orientation. When UIDeviceOrientation
// is landscape left the video orientation should be landscape right.
XCTAssertEqual(orientation, .landscapeRight)
photoSetVideoOrientationCalled = true
}
var videoSetVideoOrientationCalled = false
mockVideoCaptureConnection.setVideoOrientationStub = { orientation in
// Device orientation is flipped compared to video orientation. When UIDeviceOrientation
// is landscape left the video orientation should be landscape right.
XCTAssertEqual(orientation, .landscapeRight)
videoSetVideoOrientationCalled = true
}
camera.deviceOrientation = .landscapeLeft
XCTAssertTrue(photoSetVideoOrientationCalled)
XCTAssertTrue(videoSetVideoOrientationCalled)
}
func
testSetDeviceOrientation_setsLockedOrientationsOfCaptureConnection_ifCaptureOrientationIsLocked()
{
let (camera, mockPhotoCaptureConnection, mockVideoCaptureConnection) = createCamera()
var photoSetVideoOrientationCalled = false
mockPhotoCaptureConnection.setVideoOrientationStub = { orientation in
XCTAssertEqual(orientation, .portraitUpsideDown)
photoSetVideoOrientationCalled = true
}
var videoSetVideoOrientationCalled = false
mockVideoCaptureConnection.setVideoOrientationStub = { orientation in
XCTAssertEqual(orientation, .portraitUpsideDown)
videoSetVideoOrientationCalled = true
}
camera.lockCaptureOrientation(PlatformDeviceOrientation.portraitDown)
camera.deviceOrientation = .landscapeLeft
XCTAssertTrue(photoSetVideoOrientationCalled)
XCTAssertTrue(videoSetVideoOrientationCalled)
}
func testSetDeviceOrientation_doesNotSetOrientations_ifRecordingIsInProgress() {
let (camera, mockPhotoCaptureConnection, mockVideoCaptureConnection) = createCamera()
camera.startVideoRecording(completion: { _ in }, messengerForStreaming: nil)
mockPhotoCaptureConnection.setVideoOrientationStub = { _ in XCTFail() }
mockVideoCaptureConnection.setVideoOrientationStub = { _ in XCTFail() }
camera.deviceOrientation = .landscapeLeft
}
func testSetDeviceOrientation_doesNotSetOrientations_forDuplicateUpdates() {
let (camera, mockPhotoCaptureConnection, mockVideoCaptureConnection) = createCamera()
var photoSetVideoOrientationCallCount = 0
mockPhotoCaptureConnection.setVideoOrientationStub = { _ in
photoSetVideoOrientationCallCount += 1
}
var videoSetVideoOrientationCallCount = 0
mockVideoCaptureConnection.setVideoOrientationStub = { _ in
videoSetVideoOrientationCallCount += 1
}
camera.deviceOrientation = .landscapeRight
camera.deviceOrientation = .landscapeRight
XCTAssertEqual(photoSetVideoOrientationCallCount, 1)
XCTAssertEqual(videoSetVideoOrientationCallCount, 1)
}
}