refpack/header/mode/
reference.rs1use std::io::{Read, Seek, Write};
9
10use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
11
12use crate::RefPackResult;
13use crate::header::Header;
14use crate::header::mode::Mode;
15
16pub enum Reference {}
23
24impl Mode for Reference {
25 fn length(_decompressed_size: usize) -> usize {
26 4
27 }
28
29 fn read<R: Read + Seek>(reader: &mut R) -> RefPackResult<Header> {
30 let decompressed_length = reader.read_u32::<LittleEndian>()?;
31 Ok(Header {
32 decompressed_length,
33 compressed_length: None,
34 })
35 }
36
37 fn write<W: Write + Seek>(header: Header, writer: &mut W) -> RefPackResult<()> {
38 writer.write_u32::<LittleEndian>(header.decompressed_length)?;
39 Ok(())
40 }
41}
42
43#[cfg(test)]
44mod test {
45 use std::io::Cursor;
46
47 use proptest::prop_assert_eq;
48 use test_strategy::proptest;
49
50 use super::*;
51 use crate::header::Header;
52
53 #[proptest]
54 fn symmetrical_read_write(header: Header) {
55 let expected = Header {
56 decompressed_length: header.decompressed_length,
57 compressed_length: None,
58 };
59
60 let mut write_buf = vec![];
61 let mut write_cur = Cursor::new(&mut write_buf);
62 header.write::<Reference>(&mut write_cur).unwrap();
63 let mut read_cur = Cursor::new(&mut write_buf);
64 let got = Header::read::<Reference>(&mut read_cur).unwrap();
65
66 prop_assert_eq!(expected, got);
67 }
68
69 #[test]
70 fn reads_correctly() {
71 let mut buf = vec![255u8, 0x00, 0x00, 0x00];
72 let mut cur = Cursor::new(&mut buf);
73 let header = Header::read::<Reference>(&mut cur).unwrap();
74 assert_eq!(header.decompressed_length, 255);
75 }
76
77 #[test]
78 fn writes_correctly() {
79 let header = Header {
80 decompressed_length: 255,
81 compressed_length: None,
82 };
83 let mut buf = vec![];
84 let mut cur = Cursor::new(&mut buf);
85 header.write::<Reference>(&mut cur).unwrap();
86 assert_eq!(buf, vec![255u8, 0x00, 0x00, 0x00]);
87 }
88}