| 1 | import XCTest |
| 2 | @testable import RastrilloApple |
| 3 | |
| 4 | final class StreamLinesTests: XCTestCase { |
| 5 | func testUTF8AndAllSSELineEndings() throws { |
| 6 | var parser = NativeStreamLines() |
| 7 | let input = "\u{FEFF}event: update\r\ndata: café 👩🏽💻\r\r: ping\n\n" |
| 8 | let lines = try input.utf8.compactMap { try parser.append($0) } |
| 9 | XCTAssertEqual(lines, ["event: update", "data: café 👩🏽💻", "", ": ping", ""]) |
| 10 | } |
| 11 | |
| 12 | func testInvalidUTF8DoesNotReachConsumer() throws { |
| 13 | var parser = NativeStreamLines() |
| 14 | XCTAssertNil(try parser.append(0xff)) |
| 15 | XCTAssertThrowsError(try parser.append(10)) |
| 16 | } |
| 17 | |
| 18 | func testLineLimitRejectsBeforeUnboundedAllocation() throws { |
| 19 | var parser = NativeStreamLines(lineLimit: 4) |
| 20 | for byte in "data".utf8 { XCTAssertNil(try parser.append(byte)) } |
| 21 | XCTAssertThrowsError(try parser.append(58)) |
| 22 | } |
| 23 | |
| 24 | func testEventLimitSpansLinesAndResetsAtDelimiter() throws { |
| 25 | var parser = NativeStreamLines(lineLimit: 8, eventLimit: 8) |
| 26 | _ = try "1234\n5678\n".utf8.compactMap { try parser.append($0) } |
| 27 | XCTAssertThrowsError(try parser.append(57)) |
| 28 | XCTAssertEqual(try parser.append(10), "") |
| 29 | XCTAssertNil(try parser.append(57)) |
| 30 | } |
| 31 | |
| 32 | func testUnterminatedLineIsNotDelivered() throws { |
| 33 | var parser = NativeStreamLines() |
| 34 | XCTAssertEqual(try "event: update\ndata: partial".utf8.compactMap { try parser.append($0) }, ["event: update"]) |
| 35 | } |
| 36 | } |
| 37 | |