import XCTest @testable import SharedCore final class WatchPayloadValidationTests: XCTestCase { private struct MockPayload: Codable, Equatable { let name: String let count: Int } func testValidateRejectsEmptyPayload() { let error = WatchPayloadValidation.validate(Data()) XCTAssertEqual(error, .emptyPayload) } func testValidateRejectsOversizedPayload() { let payload = Data(repeating: 0, count: 9) let error = WatchPayloadValidation.validate(payload, maxBytes: 8) XCTAssertEqual(error, .payloadTooLarge(actualBytes: 9, maxBytes: 8)) } func testDecodeAcceptsValidPayload() throws { let payload = try JSONEncoder().encode(MockPayload(name: "set", count: 12)) let decoded = try WatchPayloadValidation.decode(MockPayload.self, from: payload) XCTAssertEqual(decoded, MockPayload(name: "set", count: 12)) } func testDecodeRejectsInvalidJSON() throws { let invalid = Data("not-json".utf8) XCTAssertThrowsError(try WatchPayloadValidation.decode(MockPayload.self, from: invalid)) { error in XCTAssertEqual(error as? WatchPayloadValidationError, .decodeFailure) } } func testDecodeRejectsOversizedPayloadBeforeDecoding() { let payload = Data(repeating: 1, count: 32) XCTAssertThrowsError( try WatchPayloadValidation.decode(MockPayload.self, from: payload, maxBytes: 16) ) { error in XCTAssertEqual( error as? WatchPayloadValidationError, .payloadTooLarge(actualBytes: 32, maxBytes: 16) ) } } }