const TX_BUF_BYTES: usize = 128;
use msrt::{
Engine,
core::{DataHeader, Flags, MessageId, Packet, PacketIndex},
engine::EnginePoll,
reliability::{FragmentRange, MessageFragment, MessageKey},
wire::{EnvelopeHeader, EnvelopeMagic, WireEnvelope},
};
#[test]
fn facade_exposes_core_packet_and_wire_envelope() {
let payload = [0x01, 0x02, 0x03];
let header = DataHeader::new(
Flags::ACK_ELICITING,
MessageId::new(7),
PacketIndex::new(0),
payload.len(),
0,
);
let packet = Packet::data_parts(header, &payload);
let envelope_header = EnvelopeHeader::new(packet.payload_len() as u8);
let envelope = WireEnvelope::new(envelope_header, packet.payload_bytes());
assert_eq!(EnvelopeMagic::MSRT.bytes(), [0xA5]);
assert_eq!(envelope.packet_bytes, &payload);
assert!(envelope.has_valid_len());
assert!(envelope.header.has_valid_header_crc());
assert_eq!(envelope.header.packet_len, 3);
}
#[test]
fn facade_exposes_reliability_fragment_view() {
let header = DataHeader::new(
Flags::ACK_ELICITING,
MessageId::new(9),
PacketIndex::new(0),
8,
2,
);
let fragment = MessageFragment::try_from_data_header(header, 4).unwrap();
assert_eq!(fragment.key, MessageKey::new(MessageId::new(9)));
assert_eq!(fragment.range, FragmentRange::new(2, 4));
}
#[test]
fn facade_exposes_concrete_engine_api() {
let mut engine = Engine::default();
let mut tx_buf = [0; TX_BUF_BYTES];
let message_id = engine.send(b"hello").unwrap();
assert_eq!(message_id, MessageId::ZERO);
let EnginePoll::Transmit { bytes, .. } = engine.poll(0, &mut tx_buf).unwrap() else {
panic!("engine should produce transmit bytes");
};
assert_eq!(
u16::from_le_bytes(
bytes[msrt::wire::WIRE_HEADER_LEN + 6..msrt::wire::WIRE_HEADER_LEN + 8]
.try_into()
.unwrap()
),
PacketIndex::ZERO.get()
);
assert!(!bytes.is_empty());
}