Skip to content

Commit 97de228

Browse files
RobertOdrowazandroidseb
authored andcommitted
[camera_avfoundation] Tests backfilling - part 5 (flutter#8873)
Backfills tests for the FLTCam class as part of flutter/flutter#119109 Adds tests for the `setExposureMode` and zoom-related methods of the `FLTCam` class. Modifies tests for focus mode to test the `setFocusMode` method instead of `applyFocusMode` because it's actually used by `CameraPlugin`. There is also a small refactor to make `exposureMode`, `focusMode`, and `flashMode` properties private since they are never access directly. ## Pre-Review Checklist
1 parent 358bed8 commit 97de228

File tree

12 files changed

+311
-134
lines changed

12 files changed

+311
-134
lines changed

packages/camera/camera_avfoundation/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 0.9.18+10
2+
3+
* Backfills unit tests for the `FLTCam` class.
4+
* Makes `exposureMode`, `focusMode`, and `flashMode` properties of `FLTCam` private.
5+
16
## 0.9.18+9
27

38
* Backfills unit tests for `CameraPlugin` class.

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@
2727
970ADAC02D6764CC00EFDCD9 /* MockEventChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970ADABF2D6764CC00EFDCD9 /* MockEventChannel.swift */; };
2828
972CA92B2D5A1D8C004B846F /* CameraPropertiesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972CA92A2D5A1D8C004B846F /* CameraPropertiesTests.swift */; };
2929
972CA92D2D5A28C4004B846F /* QueueUtilsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972CA92C2D5A28C4004B846F /* QueueUtilsTests.swift */; };
30-
972CA9312D5A366C004B846F /* CameraExposureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972CA9302D5A366C004B846F /* CameraExposureTests.swift */; };
3130
977A25202D5A439300931E34 /* AvailableCamerasTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 977A251F2D5A439300931E34 /* AvailableCamerasTests.swift */; };
32-
977A25222D5A49EC00931E34 /* CameraFocusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 977A25212D5A49EC00931E34 /* CameraFocusTests.swift */; };
31+
977A25222D5A49EC00931E34 /* FLTCamFocusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 977A25212D5A49EC00931E34 /* FLTCamFocusTests.swift */; };
3332
977A25242D5A511600931E34 /* CameraPermissionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 977A25232D5A511600931E34 /* CameraPermissionTests.swift */; };
3433
977CAC9F2D5E5180001E5DC3 /* ThreadSafeEventChannelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 977CAC9E2D5E5180001E5DC3 /* ThreadSafeEventChannelTests.swift */; };
3534
978296CF2D5F744B0009BDD3 /* PhotoCaptureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 978296CE2D5F744B0009BDD3 /* PhotoCaptureTests.swift */; };
@@ -49,8 +48,10 @@
4948
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
5049
97DB234D2D566D0700CEFE66 /* CameraPreviewPauseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DB234C2D566D0700CEFE66 /* CameraPreviewPauseTests.swift */; };
5150
E0CDBAC227CD9729002561D9 /* CameraTestUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = E0CDBAC127CD9729002561D9 /* CameraTestUtils.m */; };
51+
E11D6A912D82C7740031E6C5 /* FLTCamExposureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11D6A902D82C7740031E6C5 /* FLTCamExposureTests.swift */; };
5252
E12C4FF62D68C69000515E70 /* CameraPluginDelegatingMethodTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E12C4FF52D68C69000515E70 /* CameraPluginDelegatingMethodTests.swift */; };
5353
E12C4FF82D68E85500515E70 /* MockFLTCameraPermissionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E12C4FF72D68E85500515E70 /* MockFLTCameraPermissionManager.swift */; };
54+
E16602952D8471C0003CFE12 /* FLTCamZoomTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E16602942D8471C0003CFE12 /* FLTCamZoomTests.swift */; };
5455
E1A5F4E32D80259C0005BA64 /* FLTCamSetFlashModeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1A5F4E22D80259C0005BA64 /* FLTCamSetFlashModeTests.swift */; };
5556
E1FFEAAD2D6C8DD700B14107 /* MockFLTCam.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FFEAAC2D6C8DD700B14107 /* MockFLTCam.swift */; };
5657
E1FFEAAF2D6CDA8C00B14107 /* CameraPluginCreateCameraTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FFEAAE2D6CDA8C00B14107 /* CameraPluginCreateCameraTests.swift */; };
@@ -116,11 +117,10 @@
116117
970ADABF2D6764CC00EFDCD9 /* MockEventChannel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockEventChannel.swift; sourceTree = "<group>"; };
117118
972CA92A2D5A1D8C004B846F /* CameraPropertiesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraPropertiesTests.swift; sourceTree = "<group>"; };
118119
972CA92C2D5A28C4004B846F /* QueueUtilsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueUtilsTests.swift; sourceTree = "<group>"; };
119-
972CA9302D5A366C004B846F /* CameraExposureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraExposureTests.swift; sourceTree = "<group>"; };
120120
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
121121
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
122122
977A251F2D5A439300931E34 /* AvailableCamerasTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvailableCamerasTests.swift; sourceTree = "<group>"; };
123-
977A25212D5A49EC00931E34 /* CameraFocusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraFocusTests.swift; sourceTree = "<group>"; };
123+
977A25212D5A49EC00931E34 /* FLTCamFocusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FLTCamFocusTests.swift; sourceTree = "<group>"; };
124124
977A25232D5A511600931E34 /* CameraPermissionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraPermissionTests.swift; sourceTree = "<group>"; };
125125
977CAC9E2D5E5180001E5DC3 /* ThreadSafeEventChannelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadSafeEventChannelTests.swift; sourceTree = "<group>"; };
126126
978296CE2D5F744B0009BDD3 /* PhotoCaptureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoCaptureTests.swift; sourceTree = "<group>"; };
@@ -147,8 +147,10 @@
147147
B61D98BBC8FB276D1C4A7BB2 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
148148
E0CDBAC027CD9729002561D9 /* CameraTestUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CameraTestUtils.h; sourceTree = "<group>"; };
149149
E0CDBAC127CD9729002561D9 /* CameraTestUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CameraTestUtils.m; sourceTree = "<group>"; };
150+
E11D6A902D82C7740031E6C5 /* FLTCamExposureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FLTCamExposureTests.swift; sourceTree = "<group>"; };
150151
E12C4FF52D68C69000515E70 /* CameraPluginDelegatingMethodTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraPluginDelegatingMethodTests.swift; sourceTree = "<group>"; };
151152
E12C4FF72D68E85500515E70 /* MockFLTCameraPermissionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFLTCameraPermissionManager.swift; sourceTree = "<group>"; };
153+
E16602942D8471C0003CFE12 /* FLTCamZoomTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FLTCamZoomTests.swift; sourceTree = "<group>"; };
152154
E1A5F4E22D80259C0005BA64 /* FLTCamSetFlashModeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FLTCamSetFlashModeTests.swift; sourceTree = "<group>"; };
153155
E1FFEAAC2D6C8DD700B14107 /* MockFLTCam.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFLTCam.swift; sourceTree = "<group>"; };
154156
E1FFEAAE2D6CDA8C00B14107 /* CameraPluginCreateCameraTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraPluginCreateCameraTests.swift; sourceTree = "<group>"; };
@@ -196,9 +198,7 @@
196198
97DB234C2D566D0700CEFE66 /* CameraPreviewPauseTests.swift */,
197199
972CA92A2D5A1D8C004B846F /* CameraPropertiesTests.swift */,
198200
972CA92C2D5A28C4004B846F /* QueueUtilsTests.swift */,
199-
972CA9302D5A366C004B846F /* CameraExposureTests.swift */,
200201
977A251F2D5A439300931E34 /* AvailableCamerasTests.swift */,
201-
977A25212D5A49EC00931E34 /* CameraFocusTests.swift */,
202202
977A25232D5A511600931E34 /* CameraPermissionTests.swift */,
203203
97C0FFAD2D5E023200A36284 /* SavePhotoDelegateTests.swift */,
204204
977CAC9E2D5E5180001E5DC3 /* ThreadSafeEventChannelTests.swift */,
@@ -208,7 +208,10 @@
208208
E12C4FF52D68C69000515E70 /* CameraPluginDelegatingMethodTests.swift */,
209209
E1FFEAAE2D6CDA8C00B14107 /* CameraPluginCreateCameraTests.swift */,
210210
E1FFEAB02D6CDE5B00B14107 /* CameraPluginInitializeCameraTests.swift */,
211+
E11D6A902D82C7740031E6C5 /* FLTCamExposureTests.swift */,
212+
977A25212D5A49EC00931E34 /* FLTCamFocusTests.swift */,
211213
E1A5F4E22D80259C0005BA64 /* FLTCamSetFlashModeTests.swift */,
214+
E16602942D8471C0003CFE12 /* FLTCamZoomTests.swift */,
212215
);
213216
path = RunnerTests;
214217
sourceTree = "<group>";
@@ -539,6 +542,7 @@
539542
isa = PBXSourcesBuildPhase;
540543
buildActionMask = 2147483647;
541544
files = (
545+
E11D6A912D82C7740031E6C5 /* FLTCamExposureTests.swift in Sources */,
542546
97BD4A0E2D5CC5AE00F857D5 /* CameraSettingsTests.swift in Sources */,
543547
972CA92D2D5A28C4004B846F /* QueueUtilsTests.swift in Sources */,
544548
E1FFEAB12D6CDE5B00B14107 /* CameraPluginInitializeCameraTests.swift in Sources */,
@@ -562,14 +566,14 @@
562566
97DB234D2D566D0700CEFE66 /* CameraPreviewPauseTests.swift in Sources */,
563567
970ADAC02D6764CC00EFDCD9 /* MockEventChannel.swift in Sources */,
564568
977A25202D5A439300931E34 /* AvailableCamerasTests.swift in Sources */,
565-
972CA9312D5A366C004B846F /* CameraExposureTests.swift in Sources */,
566569
E1FFEAAD2D6C8DD700B14107 /* MockFLTCam.swift in Sources */,
567570
7F29EB292D26A59000740257 /* MockCameraDeviceDiscoverer.m in Sources */,
571+
E16602952D8471C0003CFE12 /* FLTCamZoomTests.swift in Sources */,
568572
97BD4A102D5CE13500F857D5 /* CameraSessionPresetsTests.swift in Sources */,
569573
7FD582272D57C020003B1200 /* MockAssetWriter.m in Sources */,
570574
979B3E022D5BA48F009BDE1A /* CameraOrientationTests.swift in Sources */,
571575
E12C4FF62D68C69000515E70 /* CameraPluginDelegatingMethodTests.swift in Sources */,
572-
977A25222D5A49EC00931E34 /* CameraFocusTests.swift in Sources */,
576+
977A25222D5A49EC00931E34 /* FLTCamFocusTests.swift in Sources */,
573577
978D90B42D5F630300CD817E /* StreamingTests.swift in Sources */,
574578
7F29EB412D281C7E00740257 /* MockCaptureSession.m in Sources */,
575579
7FCEDD352D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m in Sources */,

packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraExposureTests.swift

Lines changed: 0 additions & 66 deletions
This file was deleted.
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
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 XCTest
6+
7+
@testable import camera_avfoundation
8+
9+
final class FLTCamExposureTests: XCTestCase {
10+
private func createCamera() -> (FLTCam, MockCaptureDevice, MockDeviceOrientationProvider) {
11+
let mockDevice = MockCaptureDevice()
12+
let mockDeviceOrientationProvider = MockDeviceOrientationProvider()
13+
14+
let configuration = FLTCreateTestCameraConfiguration()
15+
configuration.captureDeviceFactory = { mockDevice }
16+
configuration.deviceOrientationProvider = mockDeviceOrientationProvider
17+
let camera = FLTCreateCamWithConfiguration(configuration)
18+
19+
return (camera, mockDevice, mockDeviceOrientationProvider)
20+
}
21+
22+
func testSetExposureModeLocked_setsAuthExposeMode() {
23+
let (camera, mockDevice, _) = createCamera()
24+
25+
mockDevice.setExposureModeStub = { mode in
26+
// AVCaptureExposureModeAutoExpose automatically adjusts the exposure one time, and then
27+
// locks exposure for the device
28+
XCTAssertEqual(mode, .autoExpose)
29+
}
30+
31+
camera.setExposureMode(.locked)
32+
}
33+
34+
func testSetExposureModeAuto_setsContinousAutoExposureMode_ifSupported() {
35+
let (camera, mockDevice, _) = createCamera()
36+
37+
// All exposure modes are supported
38+
mockDevice.isExposureModeSupportedStub = { _ in true }
39+
40+
mockDevice.setExposureModeStub = { mode in
41+
XCTAssertEqual(mode, .continuousAutoExposure)
42+
}
43+
44+
camera.setExposureMode(.auto)
45+
}
46+
47+
func testSetExposureModeAuto_setsAutoExposeMode_ifContinousAutoIsNotSupported() {
48+
let (camera, mockDevice, _) = createCamera()
49+
50+
// Continous auto exposure is not supported
51+
mockDevice.isExposureModeSupportedStub = { mode in
52+
mode != .continuousAutoExposure
53+
}
54+
55+
mockDevice.setExposureModeStub = { mode in
56+
XCTAssertEqual(mode, .autoExpose)
57+
}
58+
59+
camera.setExposureMode(.auto)
60+
}
61+
62+
func testSetExposurePoint_setsExposurePointOfInterest() {
63+
let (camera, mockDevice, mockDeviceOrientationProvider) = createCamera()
64+
// UI is currently in landscape left orientation.
65+
mockDeviceOrientationProvider.orientation = .landscapeLeft
66+
// Exposure point of interest is supported.
67+
mockDevice.exposurePointOfInterestSupported = true
68+
69+
// Verify the focus point of interest has been set.
70+
var setPoint = CGPoint.zero
71+
mockDevice.setExposurePointOfInterestStub = { point in
72+
if point == CGPoint(x: 1, y: 1) {
73+
setPoint = point
74+
}
75+
}
76+
77+
let expectation = expectation(description: "Completion called")
78+
camera.setExposurePoint(FCPPlatformPoint.makeWith(x: 1, y: 1)) { error in
79+
XCTAssertNil(error)
80+
expectation.fulfill()
81+
}
82+
83+
waitForExpectations(timeout: 30, handler: nil)
84+
XCTAssertEqual(setPoint, CGPoint(x: 1.0, y: 1.0))
85+
}
86+
87+
func testSetExposurePoint_returnsError_ifNotSupported() {
88+
let (camera, mockDevice, mockDeviceOrientationProvider) = createCamera()
89+
// UI is currently in landscape left orientation.
90+
mockDeviceOrientationProvider.orientation = .landscapeLeft
91+
// Exposure point of interest is not supported.
92+
mockDevice.exposurePointOfInterestSupported = false
93+
94+
let expectation = expectation(description: "Completion with error")
95+
96+
camera.setExposurePoint(FCPPlatformPoint.makeWith(x: 1, y: 1)) { error in
97+
XCTAssertNotNil(error)
98+
XCTAssertEqual(error?.code, "setExposurePointFailed")
99+
XCTAssertEqual(error?.message, "Device does not have exposure point capabilities")
100+
expectation.fulfill()
101+
}
102+
103+
waitForExpectations(timeout: 30, handler: nil)
104+
}
105+
106+
func testSetExposureOffset_setsExposureTargetBias() {
107+
let (camera, mockDevice, _) = createCamera()
108+
109+
let targetOffset = CGFloat(1.0)
110+
111+
var setExposureTargetBiasCalled = false
112+
mockDevice.setExposureTargetBiasStub = { bias, handler in
113+
XCTAssertEqual(bias, Float(targetOffset))
114+
setExposureTargetBiasCalled = true
115+
}
116+
117+
camera.setExposureOffset(targetOffset)
118+
119+
XCTAssertTrue(setExposureTargetBiasCalled)
120+
}
121+
122+
func testMaximumExposureOffset_returnsDeviceMaxExposureTargetBias() {
123+
let (camera, mockDevice, _) = createCamera()
124+
125+
let targetOffset = CGFloat(1.0)
126+
127+
mockDevice.maxExposureTargetBias = Float(targetOffset)
128+
129+
XCTAssertEqual(camera.maximumExposureOffset, targetOffset)
130+
}
131+
132+
func testMinimumExposureOffset_returnsDeviceMinExposureTargetBias() {
133+
let (camera, mockDevice, _) = createCamera()
134+
135+
let targetOffset = CGFloat(1.0)
136+
137+
mockDevice.minExposureTargetBias = Float(targetOffset)
138+
139+
XCTAssertEqual(camera.minimumExposureOffset, targetOffset)
140+
}
141+
}

0 commit comments

Comments
 (0)