4eed8efed0
Writer und Reader für Befehle, Snapshots und Aufzeichnungen. Beschädigte Eingaben führen zu einem Fehler statt zu einem Absturz. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
79 lines
2.1 KiB
Rust
79 lines
2.1 KiB
Rust
use grovewright_core::codec::{DecodeError, Reader, Writer};
|
|
|
|
#[test]
|
|
fn every_kind_of_value_survives_a_round_trip() {
|
|
let mut w = Writer::new();
|
|
w.u8(0xAB);
|
|
w.u16(0xBEEF);
|
|
w.u32(0xDEAD_BEEF);
|
|
w.u64(0x0123_4567_89AB_CDEF);
|
|
w.i32(-42);
|
|
w.bool(true);
|
|
w.bool(false);
|
|
w.bytes(&[1, 2, 3]);
|
|
w.str("Grüner Hain");
|
|
w.raw(&[9, 9]);
|
|
let bytes = w.into_bytes();
|
|
|
|
let mut r = Reader::new(&bytes);
|
|
assert_eq!(r.u8(), Ok(0xAB));
|
|
assert_eq!(r.u16(), Ok(0xBEEF));
|
|
assert_eq!(r.u32(), Ok(0xDEAD_BEEF));
|
|
assert_eq!(r.u64(), Ok(0x0123_4567_89AB_CDEF));
|
|
assert_eq!(r.i32(), Ok(-42));
|
|
assert_eq!(r.bool(), Ok(true));
|
|
assert_eq!(r.bool(), Ok(false));
|
|
assert_eq!(r.bytes(), Ok(&[1u8, 2, 3][..]));
|
|
assert_eq!(r.string(), Ok("Grüner Hain".to_owned()));
|
|
assert_eq!(r.raw(2), Ok(&[9u8, 9][..]));
|
|
assert_eq!(r.finish(), Ok(()));
|
|
}
|
|
|
|
#[test]
|
|
fn integers_are_little_endian() {
|
|
let mut w = Writer::new();
|
|
w.u32(0x0102_0304);
|
|
assert_eq!(w.into_bytes(), vec![4, 3, 2, 1]);
|
|
}
|
|
|
|
#[test]
|
|
fn reading_past_the_end_fails() {
|
|
let mut r = Reader::new(&[1, 2]);
|
|
assert_eq!(r.u32(), Err(DecodeError::UnexpectedEnd));
|
|
}
|
|
|
|
#[test]
|
|
fn an_oversized_length_fails_without_panicking() {
|
|
let mut w = Writer::new();
|
|
w.u32(u32::MAX);
|
|
let bytes = w.into_bytes();
|
|
let mut r = Reader::new(&bytes);
|
|
assert_eq!(r.bytes(), Err(DecodeError::UnexpectedEnd));
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_bool_and_invalid_utf8_are_rejected() {
|
|
let mut r = Reader::new(&[2]);
|
|
assert_eq!(r.bool(), Err(DecodeError::InvalidValue("bool")));
|
|
|
|
let mut w = Writer::new();
|
|
w.bytes(&[0xFF, 0xFE]);
|
|
let bytes = w.into_bytes();
|
|
let mut r = Reader::new(&bytes);
|
|
assert_eq!(r.string(), Err(DecodeError::InvalidValue("utf-8 string")));
|
|
}
|
|
|
|
#[test]
|
|
fn finish_rejects_bytes_that_were_not_read() {
|
|
let r = Reader::new(&[0]);
|
|
assert_eq!(r.finish(), Err(DecodeError::TrailingBytes));
|
|
}
|
|
|
|
#[test]
|
|
fn remaining_counts_down_as_values_are_read() {
|
|
let mut r = Reader::new(&[1, 2, 3]);
|
|
assert_eq!(r.remaining(), 3);
|
|
r.u8().unwrap();
|
|
assert_eq!(r.remaining(), 2);
|
|
}
|