use std::path::PathBuf;
#[must_use]
pub fn get_workspace_root_path() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.parent() .and_then(|p| p.parent()) .expect("Failed to get workspace root")
.to_path_buf()
}
#[must_use]
pub fn get_project_root_path() -> PathBuf {
get_workspace_root_path()
}
#[must_use]
pub fn get_tests_root_path() -> PathBuf {
get_project_root_path().join("tests")
}
#[must_use]
pub fn get_test_data_path() -> PathBuf {
if let Ok(test_data_root_path) = std::env::var("TEST_DATA_ROOT_PATH") {
get_project_root_path()
.join(test_data_root_path)
.join("test_data")
} else {
get_project_root_path().join("tests").join("test_data")
}
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
#[rstest]
fn test_workspace_root_contains_pyproject() {
let root = get_workspace_root_path();
assert!(
root.join("pyproject.toml").exists(),
"Workspace root should contain pyproject.toml, was: {root:?}"
);
}
#[rstest]
fn test_workspace_root_contains_crates_dir() {
let root = get_workspace_root_path();
assert!(
root.join("crates").is_dir(),
"Workspace root should contain crates/ directory, was: {root:?}"
);
}
#[rstest]
fn test_project_root_equals_workspace_root() {
assert_eq!(get_project_root_path(), get_workspace_root_path());
}
#[rstest]
fn test_tests_root_path() {
let tests_root = get_tests_root_path();
assert!(
tests_root.ends_with("tests"),
"Tests root should end with 'tests', was: {tests_root:?}"
);
}
}