Files
Steven Wroblewski 4eed8efed0 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>
2026-09-30 20:17:02 +02:00

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);
}