refpack/header/mode/
reference.rs

1////////////////////////////////////////////////////////////////////////////////
2// This Source Code Form is subject to the terms of the Mozilla Public         /
3// License, v. 2.0. If a copy of the MPL was not distributed with this         /
4// file, You can obtain one at https://mozilla.org/MPL/2.0/.                   /
5//                                                                             /
6////////////////////////////////////////////////////////////////////////////////
7
8use 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
16/// Earliest "Reference" implementation of header
17///
18/// ## Structure
19/// - Little Endian u32: decompressed length
20///
21/// Nothing else
22pub 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}