use std::{ops::ControlFlow, path::PathBuf, sync::OnceLock};
use orphanage::{
fs::{TestFileContents, make_test_file},
iox::BlockReader
};
struct TestSetup {
tmpdir: PathBuf
}
static SETUP: OnceLock<TestSetup> = OnceLock::new();
fn initialize_test_files() -> TestSetup {
let tmpdir = env!("CARGO_TARGET_TMPDIR");
let tmpdir = PathBuf::from(tmpdir);
let tfc = TestFileContents::U8Count;
let fname = tmpdir.join("8bytes.data");
make_test_file(fname, &tfc, 8).unwrap();
let fname = tmpdir.join("10bytes.data");
make_test_file(fname, &tfc, 10).unwrap();
let fname = tmpdir.join("12bytes.data");
make_test_file(fname, &tfc, 12).unwrap();
TestSetup { tmpdir }
}
fn setup() -> &'static TestSetup {
SETUP.get_or_init(initialize_test_files)
}
#[test]
#[should_panic(expected = "block_size must be greater than zero")]
fn bad_blocksize() {
let setup_data = setup();
let fname = setup_data.tmpdir.join("8bytes.data");
BlockReader::new(fname, 0);
}
#[test]
fn aligned() {
let setup_data = setup();
let mut idx = 0;
let fname = setup_data.tmpdir.join("8bytes.data");
BlockReader::new(fname, 4)
.proc(|buf| {
match idx {
0 => assert_eq!(buf, [0, 1, 2, 3]),
1 => assert_eq!(buf, [4, 5, 6, 7]),
_ => {
panic!("Unepxected block")
}
}
idx += 1;
ControlFlow::<std::io::Error>::Continue(())
})
.unwrap();
}
#[test]
fn unaligned() {
let setup_data = setup();
let mut idx = 0;
let fname = setup_data.tmpdir.join("10bytes.data");
BlockReader::new(fname, 4)
.proc(|buf| {
match idx {
0 => assert_eq!(buf, [0, 1, 2, 3]),
1 => assert_eq!(buf, [4, 5, 6, 7]),
2 => assert_eq!(buf, [8, 9]),
_ => {
panic!("Unepxected block")
}
}
idx += 1;
ControlFlow::<std::io::Error>::Continue(())
})
.unwrap();
}
#[test]
fn thrd_aligned() {
let setup_data = setup();
let mut idx = 0;
let fname = setup_data.tmpdir.join("8bytes.data");
BlockReader::new(fname, 4)
.proc_thrd(|buf| {
match idx {
0 => assert_eq!(buf, [0, 1, 2, 3]),
1 => assert_eq!(buf, [4, 5, 6, 7]),
_ => {
panic!("Unepxected block")
}
}
idx += 1;
ControlFlow::<std::io::Error>::Continue(())
})
.unwrap();
}
#[test]
fn thrd_unaligned() {
let setup_data = setup();
let mut idx = 0;
let fname = setup_data.tmpdir.join("10bytes.data");
BlockReader::new(fname, 4)
.proc_thrd(|buf| {
match idx {
0 => assert_eq!(buf, [0, 1, 2, 3]),
1 => assert_eq!(buf, [4, 5, 6, 7]),
2 => assert_eq!(buf, [8, 9]),
_ => {
panic!("Unepxected block")
}
}
idx += 1;
ControlFlow::<std::io::Error>::Continue(())
})
.unwrap();
}
#[test]
fn iter_aligned() {
let setup_data = setup();
let fname = setup_data.tmpdir.join("8bytes.data");
let mut it = BlockReader::new(fname, 4).try_iter().unwrap();
let Some(Ok(buf)) = it.next() else {
panic!("Unexpectedly not Some(Ok())");
};
assert_eq!(buf, [0, 1, 2, 3]);
let Some(Ok(buf)) = it.next() else {
panic!("Unexpectedly not Some(Ok())");
};
assert_eq!(buf, [4, 5, 6, 7]);
let None = it.next() else {
panic!("Unexpectedly not None");
};
}
#[test]
fn iter_unaligned() {
let setup_data = setup();
let fname = setup_data.tmpdir.join("10bytes.data");
let mut it = BlockReader::new(fname, 4).try_iter().unwrap();
let Some(Ok(buf)) = it.next() else {
panic!("Unexpectedly not Some(Ok())");
};
assert_eq!(buf, [0, 1, 2, 3]);
let Some(Ok(buf)) = it.next() else {
panic!("Unexpectedly not Some(Ok())");
};
assert_eq!(buf, [4, 5, 6, 7]);
let Some(Ok(buf)) = it.next() else {
panic!("Unexpectedly not Some(Ok())");
};
assert_eq!(buf, [8, 9]);
let None = it.next() else {
panic!("Unexpectedly not None");
};
}