Skip to content

Commit c6036d8

Browse files
authored
[camera_avfoundation] Migrate tests to Swift - part 1 (#8603)
This PR migrates some of Objective-C tests to Swift as a part of Swift migration: [flutter/flutter/issues/119109](flutter/flutter#119109). I kept the names of test cases the same. I also left most of the implementation comments, although I removed some of them that I considered not very helpful (e.g. "Run test"). Tests migrated in this PR: - AvailableCamerasTests - CameraExposureTests - CameraFocusTests - CameraPermissionTests - CameraPreviewPauseTests - CameraPropertiesTests - QueueUtilsTests
1 parent 09888cb commit c6036d8

22 files changed

+863
-783
lines changed

packages/camera/camera_avfoundation/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.9.18+5
2+
3+
* Migrates unit tests to Swift.
4+
15
## 0.9.18+4
26

37
* Refactors implementations to reduce usage of OCMock in internal testing.

packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 47 additions & 35 deletions
Large diffs are not rendered by default.

packages/camera/camera_avfoundation/example/ios/RunnerTests/AvailableCamerasTest.m

Lines changed: 0 additions & 151 deletions
This file was deleted.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import AVFoundation
6+
import XCTest
7+
8+
@testable import camera_avfoundation
9+
10+
final class AvailableCamerasTest: XCTestCase {
11+
private func createCameraPlugin(with deviceDiscoverer: MockCameraDeviceDiscoverer) -> CameraPlugin
12+
{
13+
return CameraPlugin(
14+
registry: MockFlutterTextureRegistry(),
15+
messenger: MockFlutterBinaryMessenger(),
16+
globalAPI: MockGlobalEventApi(),
17+
deviceDiscoverer: deviceDiscoverer,
18+
deviceFactory: { _ in MockCaptureDevice() },
19+
captureSessionFactory: { MockCaptureSession() },
20+
captureDeviceInputFactory: MockCaptureDeviceInputFactory()
21+
)
22+
}
23+
24+
func testAvailableCamerasShouldReturnAllCamerasOnMultiCameraIPhone() {
25+
let mockDeviceDiscoverer = MockCameraDeviceDiscoverer()
26+
let cameraPlugin = createCameraPlugin(with: mockDeviceDiscoverer)
27+
let expectation = self.expectation(description: "Result finished")
28+
29+
// iPhone 13 Cameras:
30+
let wideAngleCamera = MockCaptureDevice()
31+
wideAngleCamera.uniqueID = "0"
32+
wideAngleCamera.position = .back
33+
34+
let frontFacingCamera = MockCaptureDevice()
35+
frontFacingCamera.uniqueID = "1"
36+
frontFacingCamera.position = .front
37+
38+
let ultraWideCamera = MockCaptureDevice()
39+
ultraWideCamera.uniqueID = "2"
40+
ultraWideCamera.position = .back
41+
42+
let telephotoCamera = MockCaptureDevice()
43+
telephotoCamera.uniqueID = "3"
44+
telephotoCamera.position = .back
45+
46+
var requiredTypes: [AVCaptureDevice.DeviceType] = [
47+
.builtInWideAngleCamera, .builtInTelephotoCamera,
48+
]
49+
if #available(iOS 13.0, *) {
50+
requiredTypes.append(.builtInUltraWideCamera)
51+
}
52+
var cameras: [MockCaptureDevice] = [wideAngleCamera, frontFacingCamera, telephotoCamera]
53+
if #available(iOS 13.0, *) {
54+
cameras.append(ultraWideCamera)
55+
}
56+
57+
mockDeviceDiscoverer.discoverySessionStub = { deviceTypes, mediaType, position in
58+
XCTAssertEqual(deviceTypes, requiredTypes)
59+
XCTAssertEqual(mediaType, .video)
60+
XCTAssertEqual(position, .unspecified)
61+
return cameras
62+
}
63+
64+
var resultValue: [FCPPlatformCameraDescription]?
65+
cameraPlugin.availableCameras { result, error in
66+
XCTAssertNil(error)
67+
resultValue = result
68+
expectation.fulfill()
69+
}
70+
waitForExpectations(timeout: 30, handler: nil)
71+
72+
// Verify the result.
73+
if #available(iOS 13.0, *) {
74+
XCTAssertEqual(resultValue?.count, 4)
75+
} else {
76+
XCTAssertEqual(resultValue?.count, 3)
77+
}
78+
}
79+
80+
func testAvailableCamerasShouldReturnOneCameraOnSingleCameraIPhone() {
81+
let mockDeviceDiscoverer = MockCameraDeviceDiscoverer()
82+
let cameraPlugin = createCameraPlugin(with: mockDeviceDiscoverer)
83+
let expectation = self.expectation(description: "Result finished")
84+
85+
// iPhone 8 Cameras:
86+
let wideAngleCamera = MockCaptureDevice()
87+
wideAngleCamera.uniqueID = "0"
88+
wideAngleCamera.position = .back
89+
90+
let frontFacingCamera = MockCaptureDevice()
91+
frontFacingCamera.uniqueID = "1"
92+
frontFacingCamera.position = .front
93+
94+
var requiredTypes: [AVCaptureDevice.DeviceType] = [
95+
.builtInWideAngleCamera, .builtInTelephotoCamera,
96+
]
97+
if #available(iOS 13.0, *) {
98+
requiredTypes.append(.builtInUltraWideCamera)
99+
}
100+
let cameras: [MockCaptureDevice] = [wideAngleCamera, frontFacingCamera]
101+
102+
mockDeviceDiscoverer.discoverySessionStub = { deviceTypes, mediaType, position in
103+
XCTAssertEqual(deviceTypes, requiredTypes)
104+
XCTAssertEqual(mediaType, .video)
105+
XCTAssertEqual(position, .unspecified)
106+
return cameras
107+
}
108+
109+
var resultValue: [FCPPlatformCameraDescription]?
110+
cameraPlugin.availableCameras { result, error in
111+
XCTAssertNil(error)
112+
resultValue = result
113+
expectation.fulfill()
114+
}
115+
waitForExpectations(timeout: 30, handler: nil)
116+
117+
// Verify the result.
118+
XCTAssertEqual(resultValue?.count, 2)
119+
}
120+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import AVFoundation
6+
import XCTest
7+
8+
@testable import camera_avfoundation
9+
10+
final class CameraExposureTests: XCTestCase {
11+
private func createSutAndMocks() -> (FLTCam, MockCaptureDevice, MockDeviceOrientationProvider) {
12+
let mockDevice = MockCaptureDevice()
13+
let mockDeviceOrientationProvider = MockDeviceOrientationProvider()
14+
15+
let configuration = FLTCreateTestCameraConfiguration()
16+
configuration.captureDeviceFactory = { mockDevice }
17+
configuration.deviceOrientationProvider = mockDeviceOrientationProvider
18+
let camera = FLTCreateCamWithConfiguration(configuration)
19+
20+
return (camera, mockDevice, mockDeviceOrientationProvider)
21+
}
22+
23+
func testSetExposurePointWithResult_SetsExposurePointOfInterest() {
24+
let (camera, mockDevice, mockDeviceOrientationProvider) = createSutAndMocks()
25+
// UI is currently in landscape left orientation.
26+
mockDeviceOrientationProvider.orientation = .landscapeLeft
27+
// Exposure point of interest is supported.
28+
mockDevice.exposurePointOfInterestSupported = true
29+
30+
// Verify the focus point of interest has been set.
31+
var setPoint = CGPoint.zero
32+
mockDevice.setExposurePointOfInterestStub = { point in
33+
if point == CGPoint(x: 1, y: 1) {
34+
setPoint = point
35+
}
36+
}
37+
38+
let completionExpectation = expectation(description: "Completion called")
39+
camera.setExposurePoint(FCPPlatformPoint.makeWith(x: 1, y: 1)) { error in
40+
XCTAssertNil(error)
41+
completionExpectation.fulfill()
42+
}
43+
44+
waitForExpectations(timeout: 30, handler: nil)
45+
XCTAssertEqual(setPoint, CGPoint(x: 1.0, y: 1.0))
46+
}
47+
48+
func testSetExposurePoint_WhenNotSupported_ReturnsError() {
49+
let (camera, mockDevice, mockDeviceOrientationProvider) = createSutAndMocks()
50+
// UI is currently in landscape left orientation.
51+
mockDeviceOrientationProvider.orientation = .landscapeLeft
52+
// Exposure point of interest is not supported.
53+
mockDevice.exposurePointOfInterestSupported = false
54+
55+
let expectation = self.expectation(description: "Completion with error")
56+
57+
camera.setExposurePoint(FCPPlatformPoint.makeWith(x: 1, y: 1)) { error in
58+
XCTAssertNotNil(error)
59+
XCTAssertEqual(error?.code, "setExposurePointFailed")
60+
XCTAssertEqual(error?.message, "Device does not have exposure point capabilities")
61+
expectation.fulfill()
62+
}
63+
64+
waitForExpectations(timeout: 30, handler: nil)
65+
}
66+
}

0 commit comments

Comments
 (0)