1mod 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}