import XCTest @testable import Receiver final class SignalingMessageTests: XCTestCase { func testOfferRoundtrip() { let offer = SignalingMessage.offer(sessionId: "s-1", codec: "h264", width: 0, height: 0, frameRateNum: 30, frameRateDen: 1, rtpAddress: "10.0.0.5", rtpPort: 1234) let line = SignalingMessage.serialize(offer).trimmingCharacters(in: .newlines) let parsed = SignalingMessage.parse(line) guard case let .offer(sid, codec, w, h, num, den, addr, port) = parsed else { return XCTFail() } XCTAssertEqual(sid, "s-1") XCTAssertEqual(codec, "h264") XCTAssertEqual(w, 0) XCTAssertEqual(h, 0) XCTAssertEqual(num, 30) XCTAssertEqual(den, 1) XCTAssertEqual(addr, "10.0.0.5") XCTAssertEqual(port, 1234) } func testAnswerRoundtrip() { let answer = SignalingMessage.answer(sessionId: "s-2", rtpAddress: "", rtpPort: 5004, displayWidth: 1179, displayHeight: 2556) let line = SignalingMessage.serialize(answer).trimmingCharacters(in: .newlines) let parsed = SignalingMessage.parse(line) guard case let .answer(sid, addr, port, dw, dh) = parsed else { return XCTFail() } XCTAssertEqual(sid, "s-2") XCTAssertEqual(addr, "") XCTAssertEqual(port, 5004) XCTAssertEqual(dw, 1179) XCTAssertEqual(dh, 2556) } func testPliRoundtrip() { let pli = SignalingMessage.pli(sessionId: "s-3") let line = SignalingMessage.serialize(pli).trimmingCharacters(in: .newlines) let parsed = SignalingMessage.parse(line) guard case let .pli(sid) = parsed else { return XCTFail() } XCTAssertEqual(sid, "s-3") } func testRejectsUnknownType() { XCTAssertNil(SignalingMessage.parse("{\"type\":\"bogus\"}")) } func testRejectsInvalidJson() { XCTAssertNil(SignalingMessage.parse("not json")) } func testRejectsOversizedLine() { let big = String(repeating: "a", count: SignalingMessage.maxMessageBytes + 1) XCTAssertNil(SignalingMessage.parse(big)) } }