Skip to content

Commit fae9234

Browse files
mchudyFMorschel
authored andcommitted
[camera] Remove OCMock from FLTCamPhotoCaptureTests, FLTSavePhotoDelegateTests and StreamingTests (flutter#8590)
Continuation of OCMock removal from tests related to flutter/flutter#119109. Introduces two new protocols `FLTFileWriter` and `FLTCapturePhotoOutput`.
1 parent 148b3b5 commit fae9234

File tree

19 files changed

+329
-97
lines changed

19 files changed

+329
-97
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+3
2+
3+
* Refactors implementations to reduce usage of OCMock in internal testing.
4+
15
## 0.9.18+2
26

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

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
7FA99E592D22C75300582559 /* CameraExposureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FA99E582D22C75300582559 /* CameraExposureTests.m */; };
3030
7FCEDD352D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FCEDD342D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m */; };
3131
7FCEDD362D43C2B900EA1CA8 /* MockCaptureDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */; };
32+
7FD582122D579650003B1200 /* MockWritableData.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD582112D579650003B1200 /* MockWritableData.m */; };
33+
7FD582202D579ECC003B1200 /* MockCapturePhotoOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD5821F2D579ECC003B1200 /* MockCapturePhotoOutput.m */; };
3234
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
3335
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
3436
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
@@ -102,6 +104,10 @@
102104
7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCaptureDevice.m; sourceTree = "<group>"; };
103105
7FCEDD332D43C2B900EA1CA8 /* MockDeviceOrientationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockDeviceOrientationProvider.h; sourceTree = "<group>"; };
104106
7FCEDD342D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockDeviceOrientationProvider.m; sourceTree = "<group>"; };
107+
7FD582112D579650003B1200 /* MockWritableData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockWritableData.m; sourceTree = "<group>"; };
108+
7FD582132D57965A003B1200 /* MockWritableData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockWritableData.h; sourceTree = "<group>"; };
109+
7FD5821F2D579ECC003B1200 /* MockCapturePhotoOutput.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCapturePhotoOutput.m; sourceTree = "<group>"; };
110+
7FD582212D579ED9003B1200 /* MockCapturePhotoOutput.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockCapturePhotoOutput.h; sourceTree = "<group>"; };
105111
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
106112
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
107113
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -199,6 +205,8 @@
199205
7F8FD2272D4BFA8D001AF2C1 /* MockGlobalEventApi.h */,
200206
7FCEDD312D43C2B900EA1CA8 /* MockCaptureDevice.h */,
201207
7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */,
208+
7FD582212D579ED9003B1200 /* MockCapturePhotoOutput.h */,
209+
7FD5821F2D579ECC003B1200 /* MockCapturePhotoOutput.m */,
202210
7FCEDD332D43C2B900EA1CA8 /* MockDeviceOrientationProvider.h */,
203211
7FCEDD342D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m */,
204212
7F29EB282D26A59000740257 /* MockCameraDeviceDiscoverer.m */,
@@ -207,6 +215,8 @@
207215
7F29EB212D269ED500740257 /* MockEventChannel.m */,
208216
7F29EB3E2D281C5800740257 /* MockCaptureSession.h */,
209217
7F29EB402D281C7E00740257 /* MockCaptureSession.m */,
218+
7FD582112D579650003B1200 /* MockWritableData.m */,
219+
7FD582132D57965A003B1200 /* MockWritableData.h */,
210220
);
211221
path = Mocks;
212222
sourceTree = "<group>";
@@ -512,13 +522,15 @@
512522
43ED1537282570DE00EB00DE /* AvailableCamerasTest.m in Sources */,
513523
E0CDBAC227CD9729002561D9 /* CameraTestUtils.m in Sources */,
514524
334733EA2668111C00DCC49E /* CameraOrientationTests.m in Sources */,
525+
7FD582202D579ECC003B1200 /* MockCapturePhotoOutput.m in Sources */,
515526
CEF6611A2B5E36A500D33FD4 /* CameraSessionPresetsTests.m in Sources */,
516527
E032F250279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m in Sources */,
517528
7F29EB292D26A59000740257 /* MockCameraDeviceDiscoverer.m in Sources */,
518529
788A065A27B0E02900533D74 /* StreamingTest.m in Sources */,
519530
E0C6E2022770F01A00EA6AA3 /* ThreadSafeEventChannelTests.m in Sources */,
520531
7F29EB412D281C7E00740257 /* MockCaptureSession.m in Sources */,
521532
E01EE4A82799F3A5008C1950 /* QueueUtilsTests.m in Sources */,
533+
7FD582122D579650003B1200 /* MockWritableData.m in Sources */,
522534
7FCEDD352D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m in Sources */,
523535
7FCEDD362D43C2B900EA1CA8 /* MockCaptureDevice.m in Sources */,
524536
7F8FD22C2D4D07DD001AF2C1 /* MockFlutterTextureRegistry.m in Sources */,

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

Lines changed: 38 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
#endif
99
@import AVFoundation;
1010
@import XCTest;
11-
#import <OCMock/OCMock.h>
11+
1212
#import "CameraTestUtils.h"
13+
#import "MockCaptureDevice.h"
14+
#import "MockCapturePhotoOutput.h"
1315

1416
/// Includes test cases related to photo capture operations for FLTCam class.
1517
@interface FLTCamPhotoCaptureTests : XCTestCase
@@ -27,22 +29,19 @@ - (void)testCaptureToFile_mustReportErrorToResultIfSavePhotoDelegateCompletionsW
2729
dispatch_queue_set_specific(captureSessionQueue, FLTCaptureSessionQueueSpecific,
2830
(void *)FLTCaptureSessionQueueSpecific, NULL);
2931
FLTCam *cam = FLTCreateCamWithCaptureSessionQueue(captureSessionQueue);
30-
AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings];
31-
id mockSettings = OCMClassMock([AVCapturePhotoSettings class]);
32-
OCMStub([mockSettings photoSettings]).andReturn(settings);
3332

3433
NSError *error = [NSError errorWithDomain:@"test" code:0 userInfo:nil];
3534

36-
id mockOutput = OCMClassMock([AVCapturePhotoOutput class]);
37-
OCMStub([mockOutput capturePhotoWithSettings:OCMOCK_ANY delegate:OCMOCK_ANY])
38-
.andDo(^(NSInvocation *invocation) {
35+
MockCapturePhotoOutput *mockOutput = [[MockCapturePhotoOutput alloc] init];
36+
mockOutput.capturePhotoWithSettingsStub =
37+
^(AVCapturePhotoSettings *settings, NSObject<AVCapturePhotoCaptureDelegate> *photoDelegate) {
3938
FLTSavePhotoDelegate *delegate = cam.inProgressSavePhotoDelegates[@(settings.uniqueID)];
4039
// Completion runs on IO queue.
4140
dispatch_queue_t ioQueue = dispatch_queue_create("io_queue", NULL);
4241
dispatch_async(ioQueue, ^{
4342
delegate.completionHandler(nil, error);
4443
});
45-
});
44+
};
4645
cam.capturePhotoOutput = mockOutput;
4746

4847
// `FLTCam::captureToFile` runs on capture session queue.
@@ -67,22 +66,18 @@ - (void)testCaptureToFile_mustReportPathToResultIfSavePhotoDelegateCompletionsWi
6766
(void *)FLTCaptureSessionQueueSpecific, NULL);
6867
FLTCam *cam = FLTCreateCamWithCaptureSessionQueue(captureSessionQueue);
6968

70-
AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings];
71-
id mockSettings = OCMClassMock([AVCapturePhotoSettings class]);
72-
OCMStub([mockSettings photoSettings]).andReturn(settings);
73-
7469
NSString *filePath = @"test";
7570

76-
id mockOutput = OCMClassMock([AVCapturePhotoOutput class]);
77-
OCMStub([mockOutput capturePhotoWithSettings:OCMOCK_ANY delegate:OCMOCK_ANY])
78-
.andDo(^(NSInvocation *invocation) {
71+
MockCapturePhotoOutput *mockOutput = [[MockCapturePhotoOutput alloc] init];
72+
mockOutput.capturePhotoWithSettingsStub =
73+
^(AVCapturePhotoSettings *settings, NSObject<AVCapturePhotoCaptureDelegate> *photoDelegate) {
7974
FLTSavePhotoDelegate *delegate = cam.inProgressSavePhotoDelegates[@(settings.uniqueID)];
8075
// Completion runs on IO queue.
8176
dispatch_queue_t ioQueue = dispatch_queue_create("io_queue", NULL);
8277
dispatch_async(ioQueue, ^{
8378
delegate.completionHandler(filePath, nil);
8479
});
85-
});
80+
};
8681
cam.capturePhotoOutput = mockOutput;
8782

8883
// `FLTCam::captureToFile` runs on capture session queue.
@@ -105,27 +100,19 @@ - (void)testCaptureToFile_mustReportFileExtensionWithHeifWhenHEVCIsAvailableAndF
105100
FLTCam *cam = FLTCreateCamWithCaptureSessionQueue(captureSessionQueue);
106101
[cam setImageFileFormat:FCPPlatformImageFileFormatHeif];
107102

108-
AVCapturePhotoSettings *settings =
109-
[AVCapturePhotoSettings photoSettingsWithFormat:@{AVVideoCodecKey : AVVideoCodecTypeHEVC}];
110-
111-
id mockSettings = OCMClassMock([AVCapturePhotoSettings class]);
112-
OCMStub([mockSettings photoSettingsWithFormat:OCMOCK_ANY]).andReturn(settings);
113-
114-
id mockOutput = OCMClassMock([AVCapturePhotoOutput class]);
115-
// Set availablePhotoCodecTypes to HEVC
116-
NSArray *codecTypes = @[ AVVideoCodecTypeHEVC ];
117-
OCMStub([mockOutput availablePhotoCodecTypes]).andReturn(codecTypes);
118-
119-
OCMStub([mockOutput capturePhotoWithSettings:OCMOCK_ANY delegate:OCMOCK_ANY])
120-
.andDo(^(NSInvocation *invocation) {
103+
MockCapturePhotoOutput *mockOutput = [[MockCapturePhotoOutput alloc] init];
104+
mockOutput.availablePhotoCodecTypes = @[ AVVideoCodecTypeHEVC ];
105+
mockOutput.capturePhotoWithSettingsStub =
106+
^(AVCapturePhotoSettings *settings, NSObject<AVCapturePhotoCaptureDelegate> *photoDelegate) {
121107
FLTSavePhotoDelegate *delegate = cam.inProgressSavePhotoDelegates[@(settings.uniqueID)];
122108
// Completion runs on IO queue.
123109
dispatch_queue_t ioQueue = dispatch_queue_create("io_queue", NULL);
124110
dispatch_async(ioQueue, ^{
125111
delegate.completionHandler(delegate.filePath, nil);
126112
});
127-
});
113+
};
128114
cam.capturePhotoOutput = mockOutput;
115+
129116
// `FLTCam::captureToFile` runs on capture session queue.
130117
dispatch_async(captureSessionQueue, ^{
131118
[cam captureToFileWithCompletion:^(NSString *filePath, FlutterError *error) {
@@ -146,22 +133,18 @@ - (void)testCaptureToFile_mustReportFileExtensionWithJpgWhenHEVCNotAvailableAndF
146133
FLTCam *cam = FLTCreateCamWithCaptureSessionQueue(captureSessionQueue);
147134
[cam setImageFileFormat:FCPPlatformImageFileFormatHeif];
148135

149-
AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings];
150-
id mockSettings = OCMClassMock([AVCapturePhotoSettings class]);
151-
OCMStub([mockSettings photoSettings]).andReturn(settings);
152-
153-
id mockOutput = OCMClassMock([AVCapturePhotoOutput class]);
154-
155-
OCMStub([mockOutput capturePhotoWithSettings:OCMOCK_ANY delegate:OCMOCK_ANY])
156-
.andDo(^(NSInvocation *invocation) {
136+
MockCapturePhotoOutput *mockOutput = [[MockCapturePhotoOutput alloc] init];
137+
mockOutput.capturePhotoWithSettingsStub =
138+
^(AVCapturePhotoSettings *settings, NSObject<AVCapturePhotoCaptureDelegate> *photoDelegate) {
157139
FLTSavePhotoDelegate *delegate = cam.inProgressSavePhotoDelegates[@(settings.uniqueID)];
158140
// Completion runs on IO queue.
159141
dispatch_queue_t ioQueue = dispatch_queue_create("io_queue", NULL);
160142
dispatch_async(ioQueue, ^{
161143
delegate.completionHandler(delegate.filePath, nil);
162144
});
163-
});
145+
};
164146
cam.capturePhotoOutput = mockOutput;
147+
165148
// `FLTCam::captureToFile` runs on capture session queue.
166149
dispatch_async(captureSessionQueue, ^{
167150
[cam captureToFileWithCompletion:^(NSString *filePath, FlutterError *error) {
@@ -176,12 +159,18 @@ - (void)testCaptureToFile_handlesTorchMode {
176159
XCTestExpectation *pathExpectation =
177160
[self expectationWithDescription:
178161
@"Must send file path to result if save photo delegate completes with file path."];
179-
180-
id captureDeviceMock = OCMProtocolMock(@protocol(FLTCaptureDevice));
181-
OCMStub([captureDeviceMock hasTorch]).andReturn(YES);
182-
OCMStub([captureDeviceMock isTorchAvailable]).andReturn(YES);
183-
OCMStub([captureDeviceMock torchMode]).andReturn(AVCaptureTorchModeAuto);
184-
OCMExpect([captureDeviceMock setTorchMode:AVCaptureTorchModeOn]);
162+
XCTestExpectation *setTorchExpectation =
163+
[self expectationWithDescription:@"Should set torch mode to AVCaptureTorchModeOn."];
164+
165+
MockCaptureDevice *captureDeviceMock = [[MockCaptureDevice alloc] init];
166+
captureDeviceMock.hasTorch = YES;
167+
captureDeviceMock.isTorchAvailable = YES;
168+
captureDeviceMock.torchMode = AVCaptureTorchModeAuto;
169+
captureDeviceMock.setTorchModeStub = ^(AVCaptureTorchMode mode) {
170+
if (mode == AVCaptureTorchModeOn) {
171+
[setTorchExpectation fulfill];
172+
}
173+
};
185174

186175
dispatch_queue_t captureSessionQueue = dispatch_queue_create("capture_session_queue", NULL);
187176
dispatch_queue_set_specific(captureSessionQueue, FLTCaptureSessionQueueSpecific,
@@ -194,22 +183,18 @@ - (void)testCaptureToFile_handlesTorchMode {
194183
},
195184
nil);
196185

197-
AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings];
198-
id mockSettings = OCMClassMock([AVCapturePhotoSettings class]);
199-
OCMStub([mockSettings photoSettings]).andReturn(settings);
200-
201186
NSString *filePath = @"test";
202187

203-
id mockOutput = OCMClassMock([AVCapturePhotoOutput class]);
204-
OCMStub([mockOutput capturePhotoWithSettings:OCMOCK_ANY delegate:OCMOCK_ANY])
205-
.andDo(^(NSInvocation *invocation) {
188+
MockCapturePhotoOutput *mockOutput = [[MockCapturePhotoOutput alloc] init];
189+
mockOutput.capturePhotoWithSettingsStub =
190+
^(AVCapturePhotoSettings *settings, NSObject<AVCapturePhotoCaptureDelegate> *photoDelegate) {
206191
FLTSavePhotoDelegate *delegate = cam.inProgressSavePhotoDelegates[@(settings.uniqueID)];
207192
// Completion runs on IO queue.
208193
dispatch_queue_t ioQueue = dispatch_queue_create("io_queue", NULL);
209194
dispatch_async(ioQueue, ^{
210195
delegate.completionHandler(filePath, nil);
211196
});
212-
});
197+
};
213198
cam.capturePhotoOutput = mockOutput;
214199

215200
// `FLTCam::captureToFile` runs on capture session queue.
@@ -223,6 +208,5 @@ - (void)testCaptureToFile_handlesTorchMode {
223208
}];
224209
});
225210
[self waitForExpectationsWithTimeout:1 handler:nil];
226-
OCMVerifyAll(captureDeviceMock);
227211
}
228212
@end

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

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
#endif
99
@import AVFoundation;
1010
@import XCTest;
11-
#import <OCMock/OCMock.h>
11+
12+
#import "MockWritableData.h"
1213

1314
@interface FLTSavePhotoDelegateTests : XCTestCase
1415

@@ -55,16 +56,16 @@ - (void)testHandlePhotoCaptureResult_mustCompleteWithErrorIfFailedToWrite {
5556
[completionExpectation fulfill];
5657
}];
5758

58-
// Do not use OCMClassMock for NSData because some XCTest APIs uses NSData (e.g.
59-
// `XCTRunnerIDESession::logDebugMessage:`) on a private queue.
60-
id mockData = OCMPartialMock([NSData data]);
61-
OCMStub([mockData writeToFile:OCMOCK_ANY
62-
options:NSDataWritingAtomic
63-
error:[OCMArg setTo:ioError]])
64-
.andReturn(NO);
59+
MockWritableData *mockWritableData = [[MockWritableData alloc] init];
60+
mockWritableData.writeToFileStub =
61+
^BOOL(NSString *path, NSDataWritingOptions options, NSError *__autoreleasing *error) {
62+
*error = ioError;
63+
return NO;
64+
};
65+
6566
[delegate handlePhotoCaptureResultWithError:nil
66-
photoDataProvider:^NSData * {
67-
return mockData;
67+
photoDataProvider:^NSObject<FLTWritableData> * {
68+
return mockWritableData;
6869
}];
6970
[self waitForExpectationsWithTimeout:1 handler:nil];
7071
}
@@ -84,15 +85,15 @@ - (void)testHandlePhotoCaptureResult_mustCompleteWithFilePathIfSuccessToWrite {
8485
[completionExpectation fulfill];
8586
}];
8687

87-
// Do not use OCMClassMock for NSData because some XCTest APIs uses NSData (e.g.
88-
// `XCTRunnerIDESession::logDebugMessage:`) on a private queue.
89-
id mockData = OCMPartialMock([NSData data]);
90-
OCMStub([mockData writeToFile:filePath options:NSDataWritingAtomic error:[OCMArg setTo:nil]])
91-
.andReturn(YES);
88+
MockWritableData *mockWritableData = [[MockWritableData alloc] init];
89+
mockWritableData.writeToFileStub =
90+
^BOOL(NSString *path, NSDataWritingOptions options, NSError *__autoreleasing *error) {
91+
return YES;
92+
};
9293

9394
[delegate handlePhotoCaptureResultWithError:nil
94-
photoDataProvider:^NSData * {
95-
return mockData;
95+
photoDataProvider:^NSObject<FLTWritableData> * {
96+
return mockWritableData;
9697
}];
9798
[self waitForExpectationsWithTimeout:1 handler:nil];
9899
}
@@ -109,16 +110,14 @@ - (void)testHandlePhotoCaptureResult_bothProvideDataAndSaveFileMustRunOnIOQueue
109110
const char *ioQueueSpecific = "io_queue_specific";
110111
dispatch_queue_set_specific(ioQueue, ioQueueSpecific, (void *)ioQueueSpecific, NULL);
111112

112-
// Do not use OCMClassMock for NSData because some XCTest APIs uses NSData (e.g.
113-
// `XCTRunnerIDESession::logDebugMessage:`) on a private queue.
114-
id mockData = OCMPartialMock([NSData data]);
115-
OCMStub([mockData writeToFile:OCMOCK_ANY options:NSDataWritingAtomic error:[OCMArg setTo:nil]])
116-
.andDo(^(NSInvocation *invocation) {
113+
MockWritableData *mockWritableData = [[MockWritableData alloc] init];
114+
mockWritableData.writeToFileStub =
115+
^BOOL(NSString *path, NSDataWritingOptions options, NSError *__autoreleasing *error) {
117116
if (dispatch_get_specific(ioQueueSpecific)) {
118117
[writeFileQueueExpectation fulfill];
119118
}
120-
})
121-
.andReturn(YES);
119+
return YES;
120+
};
122121

123122
NSString *filePath = @"test";
124123
FLTSavePhotoDelegate *delegate = [[FLTSavePhotoDelegate alloc]
@@ -129,11 +128,11 @@ - (void)testHandlePhotoCaptureResult_bothProvideDataAndSaveFileMustRunOnIOQueue
129128
}];
130129

131130
[delegate handlePhotoCaptureResultWithError:nil
132-
photoDataProvider:^NSData * {
131+
photoDataProvider:^NSObject<FLTWritableData> * {
133132
if (dispatch_get_specific(ioQueueSpecific)) {
134133
[dataProviderQueueExpectation fulfill];
135134
}
136-
return mockData;
135+
return mockWritableData;
137136
}];
138137

139138
[self waitForExpectationsWithTimeout:1 handler:nil];
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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 camera_avfoundation;
6+
@import AVFoundation;
7+
8+
/// Mock implementation of `FLTCapturePhotoOutput` protocol which allows injecting a custom
9+
/// implementation.
10+
@interface MockCapturePhotoOutput : NSObject <FLTCapturePhotoOutput>
11+
12+
// Properties re-declared as read/write so a mocked value can be set during testing.
13+
@property(nonatomic, strong) AVCapturePhotoOutput *photoOutput;
14+
@property(nonatomic, strong) NSArray<AVVideoCodecType> *availablePhotoCodecTypes;
15+
@property(nonatomic, assign) BOOL highResolutionCaptureEnabled;
16+
@property(nonatomic, strong) NSArray<NSNumber *> *supportedFlashModes;
17+
18+
// Stub that is called when the corresponding public method is called.
19+
@property(nonatomic, copy) void (^capturePhotoWithSettingsStub)
20+
(AVCapturePhotoSettings *, NSObject<AVCapturePhotoCaptureDelegate> *);
21+
22+
@end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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 "MockCapturePhotoOutput.h"
6+
7+
@implementation MockCapturePhotoOutput
8+
- (void)capturePhotoWithSettings:(AVCapturePhotoSettings *)settings
9+
delegate:(id<AVCapturePhotoCaptureDelegate>)delegate {
10+
if (self.capturePhotoWithSettingsStub) {
11+
self.capturePhotoWithSettingsStub(settings, delegate);
12+
}
13+
}
14+
15+
- (nullable AVCaptureConnection *)connectionWithMediaType:(nonnull AVMediaType)mediaType {
16+
return nil;
17+
}
18+
19+
@end

0 commit comments

Comments
 (0)