97 lines
3.1 KiB
Swift
97 lines
3.1 KiB
Swift
import XCTest
|
|
import Foundation
|
|
#if canImport(FoundationNetworking)
|
|
import FoundationNetworking
|
|
#endif
|
|
import ForgeCamera
|
|
import ForgeGrade
|
|
import ForgeColor
|
|
import ForgeSim
|
|
@testable import ForgeCameraSony
|
|
|
|
final class SonyDriverTests: XCTestCase {
|
|
|
|
var sim: SonySimulator!
|
|
|
|
override func setUp() async throws {
|
|
sim = SonySimulator()
|
|
try await sim.start(port: 0)
|
|
}
|
|
|
|
override func tearDown() async throws {
|
|
try? await sim.stop()
|
|
sim = nil
|
|
}
|
|
|
|
func makeDriver() async -> SonyDriver {
|
|
let port = await sim.boundPort!
|
|
return SonyDriver(host: "127.0.0.1", port: port, pollInterval: .milliseconds(20))
|
|
}
|
|
|
|
// Venice 2: protocol closed (research) — no look-push capability claimed.
|
|
func testCapabilities() async {
|
|
let driver = await makeDriver()
|
|
XCTAssertEqual(driver.capabilities.vendor, .sony)
|
|
XCTAssertFalse(driver.capabilities.supportsNativeCDL)
|
|
XCTAssertTrue(driver.capabilities.lut3dSizes.isEmpty)
|
|
}
|
|
|
|
func testConnectEmitsConnected() async throws {
|
|
let driver = await makeDriver()
|
|
var iterator = driver.state.makeAsyncIterator()
|
|
try await driver.connect()
|
|
var connected = false
|
|
for _ in 0..<5 {
|
|
if let s = await iterator.next(), s.connection == .connected {
|
|
connected = true
|
|
break
|
|
}
|
|
}
|
|
XCTAssertTrue(connected)
|
|
await driver.disconnect()
|
|
}
|
|
|
|
func testRecStateAndMetadata() async throws {
|
|
let driver = await makeDriver()
|
|
var iterator = driver.state.makeAsyncIterator()
|
|
try await driver.connect()
|
|
|
|
await sim.setState(recording: true, clipName: "C0001", ei: 500, wb: 5500, tint: 1, fps: 24, timecode: "09:15:00:00")
|
|
var got = false
|
|
for _ in 0..<30 {
|
|
if let s = await iterator.next(), s.isRecording {
|
|
XCTAssertEqual(s.clipName, "C0001")
|
|
XCTAssertEqual(s.metadata?.exposureIndex, 500)
|
|
got = true
|
|
break
|
|
}
|
|
}
|
|
XCTAssertTrue(got)
|
|
await driver.disconnect()
|
|
}
|
|
|
|
// Any look push rejected: Venice look control unverified/closed (research).
|
|
// Metadata/rec-state monitoring is the only claimed capability.
|
|
func testAnyPushRejected() async throws {
|
|
let driver = await makeDriver()
|
|
try await driver.connect()
|
|
|
|
let lutOnly = FlattenedLook(cdl: nil, lut: Lut3D.identity(size: 33), latticeSize: 33)
|
|
do {
|
|
try await driver.push(look: lutOnly)
|
|
XCTFail("expected unsupportedLook")
|
|
} catch let e as CameraError {
|
|
guard case .unsupportedLook = e else { return XCTFail("wrong error") }
|
|
}
|
|
|
|
let cdl = CDL(slope: SIMD3(1.2, 1, 1), offset: .zero, power: .one, saturation: 1)
|
|
let withCDL = FlattenedLook(cdl: cdl, lut: nil, latticeSize: 33)
|
|
do {
|
|
try await driver.push(look: withCDL)
|
|
XCTFail("expected unsupportedLook")
|
|
} catch let e as CameraError {
|
|
guard case .unsupportedLook = e else { return XCTFail("wrong error") }
|
|
}
|
|
await driver.disconnect()
|
|
}
|
|
}
|