import Foundation import Testing import MusubiCore @testable import Remote @Suite struct FramingTests { let show = RemoteMessage.show(VideoAssignment(screen: ScreenRef(name: "Field Monitor", index: 1), source: Source(ndiName: "PGM (pgm)"))) @Test func roundTripsMessages() throws { var framer = MessageFramer() let data = try MessageFramer.encode(.hello(name: "MacBook", role: .control, version: 1)) + MessageFramer.encode(show) #expect(try framer.append(data) == [.hello(name: "MacBook", role: .control, version: 1), show]) } @Test func reassemblesSplitData() throws { var framer = MessageFramer() let data = try MessageFramer.encode(show) var received: [RemoteMessage] = [] for byte in data { received += try framer.append(Data([byte])) } #expect(received == [show]) } @Test func skipsMalformedBody() throws { var framer = MessageFramer() var bad = Data([0, 0, 0, 3]) + Data("{x}".utf8) bad += try MessageFramer.encode(.stop(ScreenRef(name: "A", index: 0))) #expect(try framer.append(bad) == [.stop(ScreenRef(name: "A", index: 0))]) } @Test func rejectsHugeLength() { var framer = MessageFramer() #expect(throws: MessageFramer.FramingError.self) { try framer.append(Data([0xFF, 0xFF, 0xFF, 0xFF])) } } @Test func statusRoundTrips() throws { let status = NodeStatus( screens: [ScreenStatus(screen: ScreenRef(name: "Field Monitor", index: 1), width: 1920, height: 1080, refreshRate: 50, output: OutputStatus(source: Source(ndiName: "PGM (pgm)"), state: .live, width: 1920, height: 1080, frameRate: 50, lostFrames: 3, lossRate: 0.0001))], config: MachineConfig(video: [VideoAssignment(screen: ScreenRef(name: "Field Monitor", index: 1), source: Source(ndiName: "PGM (pgm)"))]), cpuPercent: 51.2, sleepBlocked: true) var framer = MessageFramer() #expect(try framer.append(MessageFramer.encode(.status(status))) == [.status(status)]) } }