1#[cfg(test)]
2mod tests {
3
4 use super::io::BDFWriter;
5 use crate::chunks::{DataEntry, HashEntry};
6 use crate::io::BDFReader;
7 use std::fs::{remove_file, File};
8 use std::io::Error;
9
10 const FOO: &str = "foo";
11 const BAR: &str = "bar";
12
13 #[test]
14 fn it_writes_uncompressed() -> Result<(), Error> {
15 let mut writer = new_writer("tmp1.bdf", 2, false)?;
16 writer.set_entries_per_chunk(24)?;
17
18 writer.add_lookup_entry(HashEntry::new(BAR.to_string(), 5))?;
19 writer.add_lookup_entry(HashEntry::new(FOO.to_string(), 4))?;
20
21 let mut entry_1 = DataEntry::new("lol".to_string());
22 entry_1.add_hash_value(FOO.to_string(), vec![0, 1, 0, 2]);
23 entry_1.add_hash_value(BAR.to_string(), vec![0, 2, 3, 4, 5]);
24 writer.add_data_entry(entry_1)?;
25
26 let mut entry_2 = DataEntry::new("lel".to_string());
27 entry_2.add_hash_value(BAR.to_string(), vec![0, 3, 2, 1, 5]);
28 entry_2.add_hash_value(FOO.to_string(), vec![4, 5, 2, 3]);
29 writer.add_data_entry(entry_2)?;
30
31 writer.finish()?;
32 remove_file("tmp1.bdf")?;
33
34 Ok(())
35 }
36
37 #[test]
38 fn it_writes_compressed() -> Result<(), Error> {
39 let mut writer = new_writer("tmp2.bdf", 4, true)?;
40 writer.set_compression_level(3);
41 writer.set_entries_per_chunk(3)?;
42
43 writer.add_lookup_entry(HashEntry::new(FOO.to_string(), 4))?;
44 writer.add_lookup_entry(HashEntry::new(BAR.to_string(), 5))?;
45
46 let mut entry_1 = DataEntry::new("lol".to_string());
47 entry_1.add_hash_value(FOO.to_string(), vec![2, 4, 0, 2]);
48 entry_1.add_hash_value(BAR.to_string(), vec![5, 2, 1, 4, 5]);
49 writer.add_data_entry(entry_1)?;
50
51 let mut entry_2 = DataEntry::new("lel".to_string());
52 entry_2.add_hash_value(BAR.to_string(), vec![0, 3, 2, 1, 5]);
53 entry_2.add_hash_value(FOO.to_string(), vec![4, 5, 2, 3]);
54 writer.add_data_entry(entry_2)?;
55
56 let mut entry_3 = DataEntry::new("lool".to_string());
57 entry_3.add_hash_value(BAR.to_string(), vec![1, 3, 2, 1, 5]);
58 entry_3.add_hash_value(FOO.to_string(), vec![5, 5, 2, 3]);
59 writer.add_data_entry(entry_3)?;
60
61 let mut entry_4 = DataEntry::new("lool".to_string());
62 entry_4.add_hash_value(BAR.to_string(), vec![1, 3, 2, 1, 5]);
63 entry_4.add_hash_value(FOO.to_string(), vec![5, 5, 2, 3]);
64 writer.add_data_entry(entry_4)?;
65
66 writer.finish()?;
67
68 remove_file("tmp2.bdf")?;
69
70 Ok(())
71 }
72
73 #[test]
74 fn it_reads() -> Result<(), Error> {
75 create_simple_file("tmp3.bdf", false)?;
76 let mut reader = new_reader("tmp3.bdf")?;
77 reader.read_start()?;
78 let lookup_table = &reader.lookup_table.clone().unwrap();
79 let mut next_chunk = reader.next_chunk()?;
80 let data_entries = next_chunk.data_entries(lookup_table)?;
81 assert_eq!(data_entries[0].plain, "lol".to_string());
82
83 remove_file("tmp3.bdf")?;
84
85 Ok(())
86 }
87
88 #[test]
89 fn it_reads_compressed() -> Result<(), Error> {
90 create_simple_file("tmp4.bdf", true)?;
91 let mut reader = new_reader("tmp4.bdf")?;
92 reader.read_metadata()?;
93 let lookup_table = &reader.read_lookup_table()?.clone();
94 let mut next_chunk = reader.next_chunk()?;
95 let data_entries = next_chunk.data_entries(lookup_table)?;
96 assert_eq!(data_entries[0].plain, "lol".to_string());
97
98 remove_file("tmp4.bdf")?;
99
100 Ok(())
101 }
102
103 fn create_simple_file(name: &str, compressed: bool) -> Result<(), Error> {
104 let mut writer = new_writer(name, 1, compressed)?;
105
106 writer.add_lookup_entry(HashEntry::new(FOO.to_string(), 4))?;
107 let mut entry_1 = DataEntry::new("lol".to_string());
108 entry_1.add_hash_value(FOO.to_string(), vec![2, 4, 0, 2]);
109 writer.add_data_entry(entry_1)?;
110
111 writer.finish()?;
112
113 Ok(())
114 }
115
116 fn new_reader(file_name: &str) -> Result<BDFReader, Error> {
117 let file = File::open(file_name)?;
118
119 Ok(BDFReader::new(file))
120 }
121
122 fn new_writer(file_name: &str, entries: u64, compress: bool) -> Result<BDFWriter, Error> {
123 let file = File::create(file_name)?;
124
125 Ok(BDFWriter::new(file, entries, compress))
126 }
127}
128
129pub mod chunks;
130pub mod io;