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