Last active
July 13, 2023 14:53
-
-
Save banjun/7d921f12caac407b3176d6fc29960417 to your computer and use it in GitHub Desktop.
mock AVCaptureDevice in Xcode 9
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension AVCaptureDevice { | |
class func swizzle() { | |
[(#selector(AVCaptureDevice.defaultDevice(withMediaType:)), #selector(AVCaptureDevice.mockDefaultDevice(withMediaType:)))].forEach { | |
let original = class_getClassMethod(self, $0) | |
let mock = class_getClassMethod(self, $1) | |
method_exchangeImplementations(original, mock) | |
} | |
[(#selector(AVCaptureDevice.hasMediaType(_:)), #selector(AVCaptureDevice.mockHasMediaType(_:))), | |
(#selector(AVCaptureDevice.supportsAVCaptureSessionPreset(_:)), #selector(AVCaptureDevice.mockSupportsAVCaptureSessionPreset)), | |
(#selector(AVCaptureDevice.isTorchModeSupported(_:)), #selector(AVCaptureDevice.mockIsTorchModeSupported)), | |
(#selector(getter: AVCaptureDevice.torchMode), #selector(getter: AVCaptureDevice.mockTorchMode)), | |
(#selector(setter: AVCaptureDevice.torchMode), #selector(setter: AVCaptureDevice.mockTorchMode))].forEach { | |
let original = class_getInstanceMethod(self, $0) | |
let mock = class_getInstanceMethod(self, $1) | |
method_exchangeImplementations(original, mock) | |
} | |
[(#selector(AVCaptureDevice.init(mock:)), #selector(NSObject.init))].forEach { | |
let original = class_getInstanceMethod(self, $0) | |
let mock = class_getInstanceMethod(self, $1) | |
method_setImplementation(original, method_getImplementation(mock)) | |
} | |
} | |
@objc convenience init(mock: String) { | |
fatalError("should never be called because this is fake method replaced by original init") | |
} | |
class func mockDefaultDevice(withMediaType type: String) -> AVCaptureDevice? { | |
return AVCaptureDevice(mock: "") | |
} | |
func mockHasMediaType(_ mediaType: String!) -> Bool { | |
return true | |
} | |
func mockSupportsAVCaptureSessionPreset(_ preset: String!) -> Bool { | |
return true | |
} | |
func mockIsTorchModeSupported(_ torchMode: AVCaptureTorchMode) -> Bool { | |
return UI_USER_INTERFACE_IDIOM() != .pad | |
} | |
var mockTorchMode: AVCaptureTorchMode { | |
get {return .off} | |
set {} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment