countio/progress/
stdlib.rs

1use std::io::{BufRead, Read, Result, Seek, SeekFrom, Write};
2
3use crate::Progress;
4
5impl<R: Read> Read for Progress<R> {
6    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
7        self.counter.read(buf)
8    }
9}
10
11impl<R: BufRead> BufRead for Progress<R> {
12    fn fill_buf(&mut self) -> Result<&[u8]> {
13        self.counter.fill_buf()
14    }
15
16    fn consume(&mut self, amt: usize) {
17        self.counter.consume(amt);
18    }
19}
20
21impl<W: Write> Write for Progress<W> {
22    fn write(&mut self, buf: &[u8]) -> Result<usize> {
23        self.counter.write(buf)
24    }
25
26    fn flush(&mut self) -> Result<()> {
27        self.counter.flush()
28    }
29}
30
31impl<D: Seek> Seek for Progress<D> {
32    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
33        self.counter.seek(pos)
34    }
35}
36
37#[cfg(test)]
38mod test {
39    use std::io::{BufReader, BufWriter, Cursor};
40
41    use super::*;
42
43    #[test]
44    fn test_reader() -> Result<()> {
45        let mut reader = Progress::new(&b"Hello World!"[..]);
46
47        let mut buf = Vec::new();
48        let len = reader.read_to_end(&mut buf)?;
49
50        assert_eq!(len, reader.reader_bytes());
51        assert_eq!(len as u128, reader.total_bytes());
52
53        Ok(())
54    }
55
56    #[test]
57    fn test_buf_reader() -> Result<()> {
58        let reader = BufReader::new(&b"Hello World!"[..]);
59        let mut reader = Progress::new(reader);
60
61        let mut buf = String::new();
62        let len = reader.read_line(&mut buf)?;
63
64        assert_eq!(len, reader.reader_bytes());
65        assert_eq!(len as u128, reader.total_bytes());
66
67        Ok(())
68    }
69
70    #[test]
71    fn test_writer() -> Result<()> {
72        let writer = BufWriter::new(Vec::new());
73        let mut writer = Progress::new(writer);
74
75        let len = writer.write(b"Hello World!")?;
76        writer.flush()?;
77
78        assert_eq!(len, writer.writer_bytes());
79        assert_eq!(len as u128, writer.total_bytes());
80
81        Ok(())
82    }
83
84    #[test]
85    fn test_seek() -> Result<()> {
86        let data = b"Hello, World!".to_vec();
87        let cursor = Cursor::new(data);
88        let mut progress = Progress::with_expected_reader_bytes(cursor, 13);
89
90        let pos = progress.seek(SeekFrom::Start(0))?;
91        assert_eq!(pos, 0);
92
93        let pos = progress.seek(SeekFrom::End(0))?;
94        assert_eq!(pos, 13);
95
96        let pos = progress.seek(SeekFrom::Current(-5))?;
97        assert_eq!(pos, 8);
98
99        assert_eq!(progress.reader_bytes(), 0);
100        assert_eq!(progress.writer_bytes(), 0);
101        assert_eq!(progress.total_bytes(), 0);
102
103        Ok(())
104    }
105
106    #[test]
107    fn test_progress_with_known_total() -> Result<()> {
108        let mut progress = Progress::with_expected_writer_bytes(Vec::new(), 100);
109        progress.write_all(b"Hello")?;
110
111        assert_eq!(progress.writer_percentage(), Some(0.05));
112        assert_eq!(progress.writer_bytes(), 5);
113        assert_eq!(progress.total_bytes(), 5);
114
115        Ok(())
116    }
117
118    #[test]
119    fn test_progress_edge_cases() -> Result<()> {
120        let zero_progress = Progress::with_expected_writer_bytes(Vec::<u8>::new(), 0);
121        assert_eq!(zero_progress.writer_percentage(), Some(1.0));
122
123        let mut progress = Progress::with_expected_writer_bytes(Vec::new(), 100);
124        let len = progress.write(&[])?;
125        assert_eq!(len, 0);
126        assert_eq!(progress.writer_bytes(), 0);
127        assert_eq!(progress.writer_percentage(), Some(0.0));
128
129        Ok(())
130    }
131
132    #[test]
133    fn test_zero_byte_ops() -> Result<()> {
134        let mut progress = Progress::with_expected_writer_bytes(Vec::new(), 100);
135        let len = progress.write(&[])?;
136        assert_eq!(len, 0);
137        assert_eq!(progress.writer_bytes(), 0);
138        assert_eq!(progress.total_bytes(), 0);
139
140        let mut reader = Progress::new(&b""[..]);
141        let mut buf = [0u8; 10];
142        let len = reader.read(&mut buf)?;
143        assert_eq!(len, 0);
144        assert_eq!(reader.reader_bytes(), 0);
145        assert_eq!(reader.total_bytes(), 0);
146
147        Ok(())
148    }
149}