Binäre Kodierung für den Kern
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>
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user