countio/progress/
stdlib.rs1use 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}