Skip to content

Instantly share code, notes, and snippets.

@banjun
Last active July 13, 2023 14:53
Show Gist options
  • Save banjun/7d921f12caac407b3176d6fc29960417 to your computer and use it in GitHub Desktop.
Save banjun/7d921f12caac407b3176d6fc29960417 to your computer and use it in GitHub Desktop.
mock AVCaptureDevice in Xcode 9
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