Skip to content

Commit 625023a

Browse files
authored
[camera] Remove OCMock from AvailableCamerasTests, CameraOrientationTests and ThreadSafeEventChannelTests (#8363)
Follow-up on #8342. This should be merged after #8351 - Removes OCMock dependency in `AvailableCamerasTests.m`, `CameraOrientationTests.m` and `ThreadSafeEventChannelTests.m` - Introduces new protocol wrappers to enable mocking `FLTEventChannel` and `FLTCameraDeviceDiscovering`
1 parent cb18978 commit 625023a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

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

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

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

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,16 @@
1919
788A065A27B0E02900533D74 /* StreamingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 788A065927B0E02900533D74 /* StreamingTest.m */; };
2020
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
2121
7D5FCCD42AEF9D0200FB7108 /* CameraSettingsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D5FCCD32AEF9D0200FB7108 /* CameraSettingsTests.m */; };
22+
7F29EB222D269ED500740257 /* MockEventChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F29EB212D269ED500740257 /* MockEventChannel.m */; };
23+
7F29EB292D26A59000740257 /* MockCameraDeviceDiscoverer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F29EB282D26A59000740257 /* MockCameraDeviceDiscoverer.m */; };
24+
7F29EB412D281C7E00740257 /* MockCaptureSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F29EB402D281C7E00740257 /* MockCaptureSession.m */; };
2225
7F56D0382D1EDDCE005676A5 /* CameraPermissionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0B0D2BA27DFF2AF00E71E4B /* CameraPermissionTests.m */; };
23-
7F87E8022D01FD6F00A3549C /* MockCaptureDeviceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F87E8012D01FD5600A3549C /* MockCaptureDeviceController.m */; };
24-
7F87E80C2D0325D900A3549C /* MockDeviceOrientationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F87E80B2D0325D700A3549C /* MockDeviceOrientationProvider.m */; };
26+
7F8FD2292D4BFABF001AF2C1 /* MockGlobalEventApi.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8FD2282D4BFABF001AF2C1 /* MockGlobalEventApi.m */; };
27+
7F8FD22C2D4D07DD001AF2C1 /* MockFlutterTextureRegistry.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8FD22B2D4D07DD001AF2C1 /* MockFlutterTextureRegistry.m */; };
28+
7F8FD22F2D4D0B88001AF2C1 /* MockFlutterBinaryMessenger.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8FD22E2D4D0B88001AF2C1 /* MockFlutterBinaryMessenger.m */; };
2529
7FA99E592D22C75300582559 /* CameraExposureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FA99E582D22C75300582559 /* CameraExposureTests.m */; };
30+
7FCEDD352D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FCEDD342D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m */; };
31+
7FCEDD362D43C2B900EA1CA8 /* MockCaptureDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */; };
2632
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
2733
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
2834
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
@@ -79,11 +85,23 @@
7985
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
8086
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
8187
7D5FCCD32AEF9D0200FB7108 /* CameraSettingsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CameraSettingsTests.m; sourceTree = "<group>"; };
82-
7F87E8012D01FD5600A3549C /* MockCaptureDeviceController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCaptureDeviceController.m; sourceTree = "<group>"; };
83-
7F87E8032D02FF8C00A3549C /* MockCaptureDeviceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockCaptureDeviceController.h; sourceTree = "<group>"; };
84-
7F87E80A2D0325B200A3549C /* MockDeviceOrientationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockDeviceOrientationProvider.h; sourceTree = "<group>"; };
85-
7F87E80B2D0325D700A3549C /* MockDeviceOrientationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockDeviceOrientationProvider.m; sourceTree = "<group>"; };
88+
7F29EB202D269E4300740257 /* MockEventChannel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockEventChannel.h; sourceTree = "<group>"; };
89+
7F29EB212D269ED500740257 /* MockEventChannel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockEventChannel.m; sourceTree = "<group>"; };
90+
7F29EB272D26A55300740257 /* MockCameraDeviceDiscoverer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockCameraDeviceDiscoverer.h; sourceTree = "<group>"; };
91+
7F29EB282D26A59000740257 /* MockCameraDeviceDiscoverer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCameraDeviceDiscoverer.m; sourceTree = "<group>"; };
92+
7F29EB3E2D281C5800740257 /* MockCaptureSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockCaptureSession.h; sourceTree = "<group>"; };
93+
7F29EB402D281C7E00740257 /* MockCaptureSession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCaptureSession.m; sourceTree = "<group>"; };
94+
7F8FD2272D4BFA8D001AF2C1 /* MockGlobalEventApi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockGlobalEventApi.h; sourceTree = "<group>"; };
95+
7F8FD2282D4BFABF001AF2C1 /* MockGlobalEventApi.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockGlobalEventApi.m; sourceTree = "<group>"; };
96+
7F8FD22A2D4D07A6001AF2C1 /* MockFlutterTextureRegistry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockFlutterTextureRegistry.h; sourceTree = "<group>"; };
97+
7F8FD22B2D4D07DD001AF2C1 /* MockFlutterTextureRegistry.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockFlutterTextureRegistry.m; sourceTree = "<group>"; };
98+
7F8FD22D2D4D0B73001AF2C1 /* MockFlutterBinaryMessenger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockFlutterBinaryMessenger.h; sourceTree = "<group>"; };
99+
7F8FD22E2D4D0B88001AF2C1 /* MockFlutterBinaryMessenger.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockFlutterBinaryMessenger.m; sourceTree = "<group>"; };
86100
7FA99E582D22C75300582559 /* CameraExposureTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CameraExposureTests.m; sourceTree = "<group>"; };
101+
7FCEDD312D43C2B900EA1CA8 /* MockCaptureDevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockCaptureDevice.h; sourceTree = "<group>"; };
102+
7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCaptureDevice.m; sourceTree = "<group>"; };
103+
7FCEDD332D43C2B900EA1CA8 /* MockDeviceOrientationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockDeviceOrientationProvider.h; sourceTree = "<group>"; };
104+
7FCEDD342D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockDeviceOrientationProvider.m; sourceTree = "<group>"; };
87105
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
88106
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
89107
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -136,10 +154,7 @@
136154
03BB76692665316900CE5A93 /* RunnerTests */ = {
137155
isa = PBXGroup;
138156
children = (
139-
7F87E80B2D0325D700A3549C /* MockDeviceOrientationProvider.m */,
140-
7F87E80A2D0325B200A3549C /* MockDeviceOrientationProvider.h */,
141-
7F87E8032D02FF8C00A3549C /* MockCaptureDeviceController.h */,
142-
7F87E8012D01FD5600A3549C /* MockCaptureDeviceController.m */,
157+
7F29EB3F2D281C6D00740257 /* Mocks */,
143158
7D5FCCD32AEF9D0200FB7108 /* CameraSettingsTests.m */,
144159
03BB766A2665316900CE5A93 /* CameraFocusTests.m */,
145160
7FA99E582D22C75300582559 /* CameraExposureTests.m */,
@@ -173,6 +188,29 @@
173188
name = Frameworks;
174189
sourceTree = "<group>";
175190
};
191+
7F29EB3F2D281C6D00740257 /* Mocks */ = {
192+
isa = PBXGroup;
193+
children = (
194+
7F8FD22D2D4D0B73001AF2C1 /* MockFlutterBinaryMessenger.h */,
195+
7F8FD22E2D4D0B88001AF2C1 /* MockFlutterBinaryMessenger.m */,
196+
7F8FD22A2D4D07A6001AF2C1 /* MockFlutterTextureRegistry.h */,
197+
7F8FD22B2D4D07DD001AF2C1 /* MockFlutterTextureRegistry.m */,
198+
7F8FD2282D4BFABF001AF2C1 /* MockGlobalEventApi.m */,
199+
7F8FD2272D4BFA8D001AF2C1 /* MockGlobalEventApi.h */,
200+
7FCEDD312D43C2B900EA1CA8 /* MockCaptureDevice.h */,
201+
7FCEDD322D43C2B900EA1CA8 /* MockCaptureDevice.m */,
202+
7FCEDD332D43C2B900EA1CA8 /* MockDeviceOrientationProvider.h */,
203+
7FCEDD342D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m */,
204+
7F29EB282D26A59000740257 /* MockCameraDeviceDiscoverer.m */,
205+
7F29EB272D26A55300740257 /* MockCameraDeviceDiscoverer.h */,
206+
7F29EB202D269E4300740257 /* MockEventChannel.h */,
207+
7F29EB212D269ED500740257 /* MockEventChannel.m */,
208+
7F29EB3E2D281C5800740257 /* MockCaptureSession.h */,
209+
7F29EB402D281C7E00740257 /* MockCaptureSession.m */,
210+
);
211+
path = Mocks;
212+
sourceTree = "<group>";
213+
};
176214
9740EEB11CF90186004384FC /* Flutter */ = {
177215
isa = PBXGroup;
178216
children = (
@@ -463,21 +501,27 @@
463501
7F56D0382D1EDDCE005676A5 /* CameraPermissionTests.m in Sources */,
464502
E0F95E3D27A32AB900699390 /* CameraPropertiesTests.m in Sources */,
465503
03BB766B2665316900CE5A93 /* CameraFocusTests.m in Sources */,
466-
7F87E8022D01FD6F00A3549C /* MockCaptureDeviceController.m in Sources */,
467504
7D5FCCD42AEF9D0200FB7108 /* CameraSettingsTests.m in Sources */,
505+
7F8FD2292D4BFABF001AF2C1 /* MockGlobalEventApi.m in Sources */,
468506
7FA99E592D22C75300582559 /* CameraExposureTests.m in Sources */,
469507
E487C86026D686A10034AC92 /* CameraPreviewPauseTests.m in Sources */,
470-
7F87E80C2D0325D900A3549C /* MockDeviceOrientationProvider.m in Sources */,
471508
E071CF7427B31DE4006EF3BA /* FLTCamSampleBufferTests.m in Sources */,
509+
7F29EB222D269ED500740257 /* MockEventChannel.m in Sources */,
510+
7F8FD22F2D4D0B88001AF2C1 /* MockFlutterBinaryMessenger.m in Sources */,
472511
E04F108627A87CA600573D0C /* FLTSavePhotoDelegateTests.m in Sources */,
473512
43ED1537282570DE00EB00DE /* AvailableCamerasTest.m in Sources */,
474513
E0CDBAC227CD9729002561D9 /* CameraTestUtils.m in Sources */,
475514
334733EA2668111C00DCC49E /* CameraOrientationTests.m in Sources */,
476515
CEF6611A2B5E36A500D33FD4 /* CameraSessionPresetsTests.m in Sources */,
477516
E032F250279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m in Sources */,
517+
7F29EB292D26A59000740257 /* MockCameraDeviceDiscoverer.m in Sources */,
478518
788A065A27B0E02900533D74 /* StreamingTest.m in Sources */,
479519
E0C6E2022770F01A00EA6AA3 /* ThreadSafeEventChannelTests.m in Sources */,
520+
7F29EB412D281C7E00740257 /* MockCaptureSession.m in Sources */,
480521
E01EE4A82799F3A5008C1950 /* QueueUtilsTests.m in Sources */,
522+
7FCEDD352D43C2B900EA1CA8 /* MockDeviceOrientationProvider.m in Sources */,
523+
7FCEDD362D43C2B900EA1CA8 /* MockCaptureDevice.m in Sources */,
524+
7F8FD22C2D4D07DD001AF2C1 /* MockFlutterTextureRegistry.m in Sources */,
481525
);
482526
runOnlyForDeploymentPostprocessing = 0;
483527
};

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

Lines changed: 67 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,57 @@
88
#endif
99
@import XCTest;
1010
@import AVFoundation;
11-
#import <OCMock/OCMock.h>
11+
12+
#import "MockCameraDeviceDiscoverer.h"
13+
#import "MockCaptureDevice.h"
14+
#import "MockCaptureSession.h"
15+
#import "MockFlutterBinaryMessenger.h"
16+
#import "MockFlutterTextureRegistry.h"
17+
#import "MockGlobalEventApi.h"
1218

1319
@interface AvailableCamerasTest : XCTestCase
20+
1421
@end
1522

1623
@implementation AvailableCamerasTest
1724

25+
- (CameraPlugin *)createCameraPluginWithDeviceDiscoverer:
26+
(MockCameraDeviceDiscoverer *)deviceDiscoverer {
27+
return [[CameraPlugin alloc] initWithRegistry:[[MockFlutterTextureRegistry alloc] init]
28+
messenger:[[MockFlutterBinaryMessenger alloc] init]
29+
globalAPI:[[MockGlobalEventApi alloc] init]
30+
deviceDiscoverer:deviceDiscoverer
31+
deviceFactory:^NSObject<FLTCaptureDevice> *(NSString *name) {
32+
return [[MockCaptureDevice alloc] init];
33+
}
34+
captureSessionFactory:^NSObject<FLTCaptureSession> * {
35+
return [[MockCaptureSession alloc] init];
36+
}
37+
captureDeviceInputFactory:[[MockCaptureDeviceInputFactory alloc] init]];
38+
}
39+
1840
- (void)testAvailableCamerasShouldReturnAllCamerasOnMultiCameraIPhone {
19-
CameraPlugin *camera = [[CameraPlugin alloc] initWithRegistry:nil messenger:nil];
41+
MockCameraDeviceDiscoverer *mockDeviceDiscoverer = [[MockCameraDeviceDiscoverer alloc] init];
42+
CameraPlugin *cameraPlugin = [self createCameraPluginWithDeviceDiscoverer:mockDeviceDiscoverer];
43+
2044
XCTestExpectation *expectation = [self expectationWithDescription:@"Result finished"];
2145

2246
// iPhone 13 Cameras:
23-
AVCaptureDevice *wideAngleCamera = OCMClassMock([AVCaptureDevice class]);
24-
OCMStub([wideAngleCamera uniqueID]).andReturn(@"0");
25-
OCMStub([wideAngleCamera position]).andReturn(AVCaptureDevicePositionBack);
47+
MockCaptureDevice *wideAngleCamera = [[MockCaptureDevice alloc] init];
48+
wideAngleCamera.uniqueID = @"0";
49+
wideAngleCamera.position = AVCaptureDevicePositionBack;
2650

27-
AVCaptureDevice *frontFacingCamera = OCMClassMock([AVCaptureDevice class]);
28-
OCMStub([frontFacingCamera uniqueID]).andReturn(@"1");
29-
OCMStub([frontFacingCamera position]).andReturn(AVCaptureDevicePositionFront);
51+
MockCaptureDevice *frontFacingCamera = [[MockCaptureDevice alloc] init];
52+
frontFacingCamera.uniqueID = @"1";
53+
frontFacingCamera.position = AVCaptureDevicePositionFront;
3054

31-
AVCaptureDevice *ultraWideCamera = OCMClassMock([AVCaptureDevice class]);
32-
OCMStub([ultraWideCamera uniqueID]).andReturn(@"2");
33-
OCMStub([ultraWideCamera position]).andReturn(AVCaptureDevicePositionBack);
55+
MockCaptureDevice *ultraWideCamera = [[MockCaptureDevice alloc] init];
56+
ultraWideCamera.uniqueID = @"2";
57+
ultraWideCamera.position = AVCaptureDevicePositionBack;
3458

35-
AVCaptureDevice *telephotoCamera = OCMClassMock([AVCaptureDevice class]);
36-
OCMStub([telephotoCamera uniqueID]).andReturn(@"3");
37-
OCMStub([telephotoCamera position]).andReturn(AVCaptureDevicePositionBack);
59+
MockCaptureDevice *telephotoCamera = [[MockCaptureDevice alloc] init];
60+
telephotoCamera.uniqueID = @"3";
61+
telephotoCamera.position = AVCaptureDevicePositionBack;
3862

3963
NSMutableArray *requiredTypes =
4064
[@[ AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInTelephotoCamera ]
@@ -43,21 +67,23 @@ - (void)testAvailableCamerasShouldReturnAllCamerasOnMultiCameraIPhone {
4367
[requiredTypes addObject:AVCaptureDeviceTypeBuiltInUltraWideCamera];
4468
}
4569

46-
id discoverySessionMock = OCMClassMock([AVCaptureDeviceDiscoverySession class]);
47-
OCMStub([discoverySessionMock discoverySessionWithDeviceTypes:requiredTypes
48-
mediaType:AVMediaTypeVideo
49-
position:AVCaptureDevicePositionUnspecified])
50-
.andReturn(discoverySessionMock);
51-
5270
NSMutableArray *cameras = [NSMutableArray array];
5371
[cameras addObjectsFromArray:@[ wideAngleCamera, frontFacingCamera, telephotoCamera ]];
5472
if (@available(iOS 13.0, *)) {
5573
[cameras addObject:ultraWideCamera];
5674
}
57-
OCMStub([discoverySessionMock devices]).andReturn([NSArray arrayWithArray:cameras]);
75+
76+
mockDeviceDiscoverer.discoverySessionStub = ^NSArray<NSObject<FLTCaptureDevice> *> *_Nullable(
77+
NSArray<AVCaptureDeviceType> *_Nonnull deviceTypes, AVMediaType _Nonnull mediaType,
78+
AVCaptureDevicePosition position) {
79+
XCTAssertEqualObjects(deviceTypes, requiredTypes);
80+
XCTAssertEqual(mediaType, AVMediaTypeVideo);
81+
XCTAssertEqual(position, AVCaptureDevicePositionUnspecified);
82+
return cameras;
83+
};
5884

5985
__block NSArray<FCPPlatformCameraDescription *> *resultValue;
60-
[camera
86+
[cameraPlugin
6187
availableCamerasWithCompletion:^(NSArray<FCPPlatformCameraDescription *> *_Nullable result,
6288
FlutterError *_Nullable error) {
6389
XCTAssertNil(error);
@@ -74,17 +100,19 @@ - (void)testAvailableCamerasShouldReturnAllCamerasOnMultiCameraIPhone {
74100
}
75101
}
76102
- (void)testAvailableCamerasShouldReturnOneCameraOnSingleCameraIPhone {
77-
CameraPlugin *camera = [[CameraPlugin alloc] initWithRegistry:nil messenger:nil];
103+
MockCameraDeviceDiscoverer *mockDeviceDiscoverer = [[MockCameraDeviceDiscoverer alloc] init];
104+
CameraPlugin *cameraPlugin = [self createCameraPluginWithDeviceDiscoverer:mockDeviceDiscoverer];
105+
78106
XCTestExpectation *expectation = [self expectationWithDescription:@"Result finished"];
79107

80108
// iPhone 8 Cameras:
81-
AVCaptureDevice *wideAngleCamera = OCMClassMock([AVCaptureDevice class]);
82-
OCMStub([wideAngleCamera uniqueID]).andReturn(@"0");
83-
OCMStub([wideAngleCamera position]).andReturn(AVCaptureDevicePositionBack);
109+
MockCaptureDevice *wideAngleCamera = [[MockCaptureDevice alloc] init];
110+
wideAngleCamera.uniqueID = @"0";
111+
wideAngleCamera.position = AVCaptureDevicePositionBack;
84112

85-
AVCaptureDevice *frontFacingCamera = OCMClassMock([AVCaptureDevice class]);
86-
OCMStub([frontFacingCamera uniqueID]).andReturn(@"1");
87-
OCMStub([frontFacingCamera position]).andReturn(AVCaptureDevicePositionFront);
113+
MockCaptureDevice *frontFacingCamera = [[MockCaptureDevice alloc] init];
114+
frontFacingCamera.uniqueID = @"1";
115+
frontFacingCamera.position = AVCaptureDevicePositionFront;
88116

89117
NSMutableArray *requiredTypes =
90118
[@[ AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInTelephotoCamera ]
@@ -93,18 +121,20 @@ - (void)testAvailableCamerasShouldReturnOneCameraOnSingleCameraIPhone {
93121
[requiredTypes addObject:AVCaptureDeviceTypeBuiltInUltraWideCamera];
94122
}
95123

96-
id discoverySessionMock = OCMClassMock([AVCaptureDeviceDiscoverySession class]);
97-
OCMStub([discoverySessionMock discoverySessionWithDeviceTypes:requiredTypes
98-
mediaType:AVMediaTypeVideo
99-
position:AVCaptureDevicePositionUnspecified])
100-
.andReturn(discoverySessionMock);
101-
102124
NSMutableArray *cameras = [NSMutableArray array];
103125
[cameras addObjectsFromArray:@[ wideAngleCamera, frontFacingCamera ]];
104-
OCMStub([discoverySessionMock devices]).andReturn([NSArray arrayWithArray:cameras]);
126+
127+
mockDeviceDiscoverer.discoverySessionStub = ^NSArray<NSObject<FLTCaptureDevice> *> *_Nullable(
128+
NSArray<AVCaptureDeviceType> *_Nonnull deviceTypes, AVMediaType _Nonnull mediaType,
129+
AVCaptureDevicePosition position) {
130+
XCTAssertEqualObjects(deviceTypes, requiredTypes);
131+
XCTAssertEqual(mediaType, AVMediaTypeVideo);
132+
XCTAssertEqual(position, AVCaptureDevicePositionUnspecified);
133+
return cameras;
134+
};
105135

106136
__block NSArray<FCPPlatformCameraDescription *> *resultValue;
107-
[camera
137+
[cameraPlugin
108138
availableCamerasWithCompletion:^(NSArray<FCPPlatformCameraDescription *> *_Nullable result,
109139
FlutterError *_Nullable error) {
110140
XCTAssertNil(error);

0 commit comments

Comments
 (0)