jetstream 16.0.0

Jetstream is a RPC framework for Rust, based on the 9P protocol and QUIC.
Documentation
// JetStream WireFormat — Optional Tests
// Copyright (c) 2024, Sevki <s@sevki.io>
// SPDX-License-Identifier: BSD-3-Clause

import XCTest
@testable import JetStreamWireFormat

final class OptionalTests: XCTestCase {

    // r[verify jetstream.wireformat.swift.optional]
    // r[verify jetstream.wireformat.option]
    func testNoneRoundTrip() throws {
        let value: UInt32? = nil
        var writer = BinaryWriter()
        try value.encode(writer: &writer)
        var reader = BinaryReader(data: writer.data)
        let decoded: UInt32? = try Optional<UInt32>.decode(reader: &reader)
        XCTAssertNil(decoded)
    }

    func testSomeRoundTrip() throws {
        let value: UInt32? = 42
        var writer = BinaryWriter()
        try value.encode(writer: &writer)
        var reader = BinaryReader(data: writer.data)
        let decoded: UInt32? = try Optional<UInt32>.decode(reader: &reader)
        XCTAssertEqual(decoded, 42)
    }

    func testNoneEncoding() throws {
        let value: UInt32? = nil
        var writer = BinaryWriter()
        try value.encode(writer: &writer)
        XCTAssertEqual(writer.data, Data([0x00]))
    }

    func testSomeEncoding() throws {
        let value: UInt8? = 0xFF
        var writer = BinaryWriter()
        try value.encode(writer: &writer)
        XCTAssertEqual(writer.data, Data([0x01, 0xFF]))
    }

    func testNoneByteSize() {
        let value: UInt32? = nil
        XCTAssertEqual(value.byteSize(), 1)
    }

    func testSomeByteSize() {
        let value: UInt32? = 42
        XCTAssertEqual(value.byteSize(), 5) // 1 + 4
    }

    func testOptionalString() throws {
        let value: String? = "hello"
        var writer = BinaryWriter()
        try value.encode(writer: &writer)
        var reader = BinaryReader(data: writer.data)
        let decoded: String? = try Optional<String>.decode(reader: &reader)
        XCTAssertEqual(decoded, "hello")
    }

    func testOptionalStringNil() throws {
        let value: String? = nil
        var writer = BinaryWriter()
        try value.encode(writer: &writer)
        var reader = BinaryReader(data: writer.data)
        let decoded: String? = try Optional<String>.decode(reader: &reader)
        XCTAssertNil(decoded)
    }

    // r[verify jetstream.wireformat.swift.test-error]
    func testInvalidOptionalTag() throws {
        var reader = BinaryReader(data: Data([0x02]))
        XCTAssertThrowsError(try Optional<UInt32>.decode(reader: &reader)) { error in
            XCTAssertEqual(error as? WireFormatError, WireFormatError.invalidOptionalTag(2))
        }
    }
}