108 lines
4.2 KiB
Swift
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)
|
|
}
|
|
}
|