macro_rules! make_tests {
($setup:ident) => {
#[test]
fn no_content() {
let mut archive = setup_archive_with_bsize(FULL as u32);
let mut entry = $setup(&mut archive).build().unwrap();
entry.write_all(&[]).unwrap();
let id = lookup(&mut archive, 0).unwrap().clone();
assert!(lookup(&mut archive, 1).is_none());
let mut reader = archive.pager.read_buf(&id).unwrap();
let entry = reader.read::<Inner>().unwrap();
assert_eq!(entry.name, "foo");
assert_eq!(entry.size, 0);
}
#[test]
fn half_block() {
let mut archive = setup_archive_with_bsize(FULL as u32);
let mut entry = $setup(&mut archive).build().unwrap();
entry.write_all(&(0..HALF).collect::<Vec<u8>>()).unwrap();
let id0 = lookup(&mut archive, 0).unwrap().clone();
let id1 = lookup(&mut archive, 1).unwrap().clone();
assert!(lookup(&mut archive, 2).is_none());
let mut reader = archive.pager.read_buf(&id0).unwrap();
let entry = reader.read::<Inner>().unwrap();
assert_eq!(entry.name, "foo");
assert_eq!(entry.size, HALF as u64);
let buf = archive.pager.read_buf_raw(&id1).unwrap();
assert_eq!(buf[..HALF as usize], (0..HALF).collect::<Vec<u8>>());
assert_eq!(buf[HALF as usize..], [0; HALF as usize]);
}
#[test]
fn one_block() {
let mut archive = setup_archive_with_bsize(FULL as u32);
let mut entry = $setup(&mut archive).build().unwrap();
entry.write_all(&(0..FULL).collect::<Vec<u8>>()).unwrap();
let id0 = lookup(&mut archive, 0).unwrap().clone();
let id1 = lookup(&mut archive, 1).unwrap().clone();
assert!(lookup(&mut archive, 2).is_none());
let mut reader = archive.pager.read_buf(&id0).unwrap();
let entry = reader.read::<Inner>().unwrap();
assert_eq!(entry.name, "foo");
assert_eq!(entry.size, FULL as u64);
let buf = archive.pager.read_buf_raw(&id1).unwrap();
assert_eq!(buf, (0..FULL).collect::<Vec<u8>>());
}
#[test]
fn one_half_blocks() {
let mut archive = setup_archive_with_bsize(FULL as u32);
let mut entry = $setup(&mut archive).build().unwrap();
entry
.write_all(&(0..FULL + HALF).collect::<Vec<u8>>())
.unwrap();
let id0 = lookup(&mut archive, 0).unwrap().clone();
let id1 = lookup(&mut archive, 1).unwrap().clone();
let id2 = lookup(&mut archive, 2).unwrap().clone();
assert!(lookup(&mut archive, 3).is_none());
let mut reader = archive.pager.read_buf(&id0).unwrap();
let entry = reader.read::<Inner>().unwrap();
assert_eq!(entry.name, "foo");
assert_eq!(entry.size, FULL as u64 + HALF as u64);
let buf = archive.pager.read_buf_raw(&id1).unwrap();
assert_eq!(buf, (0..FULL).collect::<Vec<u8>>());
let buf = archive.pager.read_buf_raw(&id2).unwrap();
assert_eq!(
buf[..HALF as usize],
(FULL..FULL + HALF).collect::<Vec<u8>>()
);
assert_eq!(buf[HALF as usize..], [0; HALF as usize]);
}
#[test]
fn two_blocks() {
let mut archive = setup_archive_with_bsize(FULL as u32);
let mut entry = $setup(&mut archive).build().unwrap();
entry
.write_all(&(0..2 * FULL).collect::<Vec<u8>>())
.unwrap();
let id0 = lookup(&mut archive, 0).unwrap().clone();
let id1 = lookup(&mut archive, 1).unwrap().clone();
let id2 = lookup(&mut archive, 2).unwrap().clone();
assert!(lookup(&mut archive, 3).is_none());
let mut reader = archive.pager.read_buf(&id0).unwrap();
let entry = reader.read::<Inner>().unwrap();
assert_eq!(entry.name, "foo");
assert_eq!(entry.size, 2 * FULL as u64);
let buf = archive.pager.read_buf_raw(&id1).unwrap();
assert_eq!(buf, (0..FULL).collect::<Vec<u8>>());
let buf = archive.pager.read_buf_raw(&id2).unwrap();
assert_eq!(buf, (FULL..2 * FULL).collect::<Vec<u8>>());
}
};
}
mod inner {
use crate::entry::r#mut::tests::{lookup, setup_inner_builder};
use crate::entry::Inner;
use crate::entry::{FULL, HALF};
use crate::tests::setup_archive_with_bsize;
make_tests!(setup_inner_builder);
}
mod file {
use crate::entry::r#mut::tests::{lookup, setup_file_builder};
use crate::entry::Inner;
use crate::entry::{FULL, HALF};
use crate::tests::setup_archive_with_bsize;
make_tests!(setup_file_builder);
}