noodles_bgzf/
io.rs

1//! BGZF I/O.
2
3mod block;
4mod buf_read;
5pub mod indexed_reader;
6mod multithreaded_reader;
7pub mod multithreaded_writer;
8mod read;
9pub mod reader;
10mod seek;
11pub mod writer;
12
13pub(crate) use self::block::Block;
14pub use self::{
15    buf_read::BufRead, indexed_reader::IndexedReader, multithreaded_reader::MultithreadedReader,
16    multithreaded_writer::MultithreadedWriter, read::Read, reader::Reader, seek::Seek,
17    writer::Writer,
18};
19
20#[cfg(test)]
21mod tests {
22    use std::io::{self, BufRead, Cursor, Read, Write};
23
24    use super::*;
25    use crate::VirtualPosition;
26
27    #[test]
28    fn test_self() -> io::Result<()> {
29        let mut writer = Writer::new(Vec::new());
30
31        writer.write_all(b"noodles")?;
32        writer.flush()?;
33        writer.write_all(b"-")?;
34        writer.flush()?;
35        writer.write_all(b"bgzf")?;
36
37        let data = writer.finish()?;
38        let mut reader = Reader::new(&data[..]);
39
40        let mut buf = Vec::new();
41        reader.read_to_end(&mut buf)?;
42
43        assert_eq!(buf, b"noodles-bgzf");
44
45        Ok(())
46    }
47
48    #[test]
49    fn test_self_buffered() -> io::Result<()> {
50        let mut writer = Writer::new(Vec::new());
51
52        writer.write_all(b"noodles\n-\nbgzf\nbuffered")?;
53
54        let data = writer.finish()?;
55        let mut reader = Reader::new(&data[..]);
56
57        let mut lines = Vec::new();
58        let mut virtual_positions = Vec::new();
59
60        loop {
61            virtual_positions.push(reader.virtual_position());
62
63            let mut line = String::new();
64            match reader.read_line(&mut line) {
65                Ok(0) => {
66                    virtual_positions.pop();
67                    break;
68                }
69                Err(e) => return Err(e),
70                _ => (),
71            }
72
73            lines.push(line);
74        }
75
76        let expected_lines = vec!["noodles\n", "-\n", "bgzf\n", "buffered"];
77        assert_eq!(lines, expected_lines);
78
79        let expected_upos = [0, 8, 10, 15];
80        let expected_virtual_positions: Vec<VirtualPosition> = expected_upos
81            .iter()
82            .map(|x| VirtualPosition::try_from((0, *x)).unwrap())
83            .collect();
84        assert_eq!(virtual_positions, expected_virtual_positions);
85
86        Ok(())
87    }
88
89    #[test]
90    fn test_self_multithreaded() -> io::Result<()> {
91        let mut writer = MultithreadedWriter::new(Vec::new());
92
93        writer.write_all(b"noodles")?;
94        writer.flush()?;
95        writer.write_all(b"-")?;
96        writer.flush()?;
97        writer.write_all(b"bgzf")?;
98
99        let data = writer.finish().map(Cursor::new)?;
100        let mut reader = MultithreadedReader::new(data);
101
102        let mut buf = Vec::new();
103        reader.read_to_end(&mut buf)?;
104
105        assert_eq!(buf, b"noodles-bgzf");
106
107        Ok(())
108    }
109}