1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
mod reader;
mod writer;

pub use reader::{Reader, BasicReader};
pub use writer::{Writer, BasicWriter, CountWriter};

#[cfg(test)]
mod tests {
    use super::*;
    use std;
    use std::io::{Cursor, BufWriter};

    fn check(res: std::io::Result<()>) {
        match res {
            Ok(()) => {},
            Err(err) => {
                panic!(format!("unexpected error: {}", err))
            }
        }
    }

    #[test]
    fn count_u8_one_byte() {
        let mut cw = CountWriter::new();
        check(cw.write_u8(1));
        assert_eq!(cw.count(), 1)
    }

    #[test]
    fn count_u16_two_bytes() {
        let mut cw = CountWriter::new();
        check(cw.write_u16(3));
        assert_eq!(cw.count(), 2)
    }

    #[test]
    fn count_u32_four_bytes() {
        let mut cw = CountWriter::new();
        check(cw.write_u32(123));
        assert_eq!(cw.count(), 4)
    }

    #[test]
    fn count_u64_eight_bytes() {
        let mut cw = CountWriter::new();
        check(cw.write_u64(123));
        assert_eq!(cw.count(), 8)
    }

    #[test]
    fn count_bytes() {
        let mut cw = CountWriter::new();
        check(cw.write_bytes(&[1, 2, 3, 4]));
        assert_eq!(cw.count(), 4)
    }

    #[test]
    fn count_str() {
        let mut cw = CountWriter::new();
        check(cw.write_str("testing"));
        assert_eq!(cw.count(), 9)
    }

    #[test]
    fn count_string() {
        let mut cw = CountWriter::new();
        check(cw.write_string(&"testing".to_string()));
        assert_eq!(cw.count(), 9)
    }

    #[test]
    fn can_write_and_read() {
        let mut buf = [0 as u8; 64];
        {
            let mut write = BufWriter::new(&mut buf[..]);
            let mut writer = BasicWriter::new(&mut write);
            check(writer.write_u8(0xab));
            check(writer.write_u16(0xfedc));
            check(writer.write_u32(0xabcdef01));
            check(writer.write_u64(0xabcdef0102030405));
            check(writer.write_bytes(&[1, 2, 3, 4]));
            check(writer.write_string(&"Hello World".to_string()));
        }
        let mut cursor = Cursor::new(&mut buf[..]);
        let mut reader = BasicReader::new(&mut cursor);
        assert!(reader.read_u8().unwrap().unwrap() == 0xab);
        assert!(reader.read_u16().unwrap().unwrap() == 0xfedc);
        assert!(reader.read_u32().unwrap().unwrap() == 0xabcdef01);
        assert!(reader.read_u64().unwrap().unwrap() == 0xabcdef0102030405);

        let mut tmp = [0 as u8; 4];
        match reader.read_bytes(&mut tmp[..]) {
            Ok(4) => {
                assert!(tmp == [1, 2, 3, 4]);
            },
            Ok(n) => {
                assert!(false, format!("unexpected number of bytes read: {}", n));
            },
            Err(err) => {
                assert!(false, format!("read_bytes() failed unexpectedly: {}", err));
            }
        }

        match reader.read_string() {
            Ok(s) => {
                assert!(s.unwrap() == "Hello World".to_string());
            },
            Err(err) => panic!(format!("failed to read string: {}", err))
        }
    }
}