net-wire 0.1.0

Allocation-free no_std wire views and codecs for network protocols.
Documentation
use net_wire::kcp::{
    KCP_SEGMENT_HEADER_LEN, KcpCommand, KcpConversationId, KcpFragment, KcpKnownCommand,
    KcpSequenceNumber, KcpTimestamp, KcpUnacknowledged,
};

#[test]
fn canonical_namespace_and_scalars_preserve_wire_values() {
    let _: net_wire::kcp::KcpConversationId = KcpConversationId::new(1);
    assert_eq!(KCP_SEGMENT_HEADER_LEN, 24);

    assert_eq!(KcpConversationId::new(u32::MAX).raw(), u32::MAX);
    assert_eq!(KcpFragment::new(u8::MAX).raw(), u8::MAX);
    assert!(!KcpFragment::new(u8::MAX).is_final());
    assert!(KcpFragment::new(0).is_final());
    assert_eq!(KcpTimestamp::new(u32::MAX).raw(), u32::MAX);
    assert_eq!(KcpSequenceNumber::new(u32::MAX).raw(), u32::MAX);
    assert_eq!(KcpUnacknowledged::new(u32::MAX).raw(), u32::MAX);
    assert_eq!(
        KcpUnacknowledged::new(u32::MAX).into_sequence_number(),
        KcpSequenceNumber::new(u32::MAX)
    );

    for (known, command) in [
        (KcpKnownCommand::Push, KcpCommand::PUSH),
        (KcpKnownCommand::Ack, KcpCommand::ACK),
        (KcpKnownCommand::Wask, KcpCommand::WASK),
        (KcpKnownCommand::Wins, KcpCommand::WINS),
    ] {
        assert_eq!(known.raw(), command.raw());
        assert_eq!(known.command(), command);
        assert_eq!(KcpKnownCommand::from_raw(command.raw()), Some(known));
        assert_eq!(command.known(), Some(known));
    }
    let unknown = KcpCommand::new(0xff);
    assert_eq!(unknown.raw(), 0xff);
    assert_eq!(unknown.known(), None);
    assert_eq!(KcpKnownCommand::from_raw(0xff), None);
}

#[test]
fn timestamp_and_sequence_use_signed_wrapping_order() {
    let timestamp = KcpTimestamp::new(0);
    let timestamp_previous = KcpTimestamp::new(u32::MAX);
    assert_eq!(timestamp.distance_from(timestamp_previous), 1);
    assert!(timestamp.is_after(timestamp_previous));
    assert!(timestamp_previous.is_before(timestamp));
    let timestamp_half = KcpTimestamp::new(0x8000_0000);
    assert_eq!(timestamp_half.distance_from(KcpTimestamp::new(0)), i32::MIN);
    assert!(timestamp_half.is_before(KcpTimestamp::new(0)));

    let sequence = KcpSequenceNumber::new(0);
    let sequence_previous = KcpSequenceNumber::new(u32::MAX);
    assert_eq!(sequence.distance_from(sequence_previous), 1);
    assert!(sequence.is_after(sequence_previous));
    assert!(sequence_previous.is_before(sequence));
    let sequence_half = KcpSequenceNumber::new(0x8000_0000);
    assert_eq!(
        sequence_half.distance_from(KcpSequenceNumber::new(0)),
        i32::MIN
    );
    assert!(sequence_half.is_before(KcpSequenceNumber::new(0)));
}