#![warn(missing_docs, missing_debug_implementations, clippy::all)]
use std::num::NonZeroU8;
use std::sync::OnceLock;
mod builder;
mod macros;
mod numbered_dir;
#[doc(hidden)]
pub mod private;
pub use builder::NumberedDirBuilder;
pub use numbered_dir::{NumberedDir, NumberedDirIter};
pub const ROOT_DEFAULT: &str = "testdir";
pub const KEEP_DEFAULT: Option<NonZeroU8> = NonZeroU8::new(8);
#[doc(hidden)]
pub static TESTDIR: OnceLock<NumberedDir> = OnceLock::new();
pub fn with_testdir<F, R>(func: F) -> R
where
F: FnOnce(&NumberedDir) -> R,
{
let test_dir = TESTDIR.get_or_init(|| {
let mut builder = NumberedDirBuilder::new(String::from("init_testdir-not-called"));
builder.reusefn(private::reuse_cargo);
let mut testdir = builder.create().expect("Failed to create testdir");
let mut count = 0;
while private::create_cargo_pid_file(testdir.path()).is_err() {
count += 1;
if count > 20 {
break;
}
testdir = builder.create().expect("Failed to create testdir");
}
testdir
});
func(test_dir)
}
#[cfg(test)]
mod test_rstests {
use rstest::rstest;
use super::*;
#[rstest]
#[case(1)]
#[case(2)]
fn test_1(#[case] _num: u8) {
let dir = testdir!();
println!("Created tmp_dir {}", dir.display());
let mut parts = dir.components();
match parts.next_back().map(|c| c.as_os_str().to_str().unwrap()) {
Some("case_1") | Some("case_2") => (),
_ => panic!("wrong case directory"),
}
match parts.next_back().map(|c| c.as_os_str().to_str().unwrap()) {
Some("test_1") => (),
_ => panic!("wrong test directory"),
}
}
#[rstest]
#[case(1)]
#[case(2)]
fn test_2(#[case] _num: u8) {
let dir = testdir!();
println!("Created tmp_dir {}", dir.display());
let mut parts = dir.components();
match parts.next_back().map(|c| c.as_os_str().to_str().unwrap()) {
Some("case_1") | Some("case_2") => (),
_ => panic!("wrong case directory"),
}
match parts.next_back().map(|c| c.as_os_str().to_str().unwrap()) {
Some("test_2") => (),
_ => panic!("wrong test directory"),
}
}
}