use std::fs;
fn read_project_file(path: &str) -> String {
fs::read_to_string(path).unwrap_or_else(|err| panic!("failed to read {path}: {err}"))
}
fn package_version() -> String {
read_project_file("Cargo.toml")
.lines()
.find_map(|line| line.trim().strip_prefix("version = \""))
.and_then(|value| value.strip_suffix('"'))
.expect("Cargo.toml should declare package version")
.to_owned()
}
#[test]
fn test_readmes_use_current_crate_version() {
let version = package_version();
let minor_version = minor_series(&version).expect("package version should have major.minor");
let dependency = format!("qubit-tokio-executor = \"{minor_version}\"");
let readme_en = read_project_file("README.md");
let readme_zh = read_project_file("README.zh_CN.md");
assert!(readme_en.contains(&dependency));
assert!(readme_zh.contains(&dependency));
}
fn minor_series(version: &str) -> Option<String> {
let mut parts = version.split('.');
let major = parts.next()?;
let minor = parts.next()?;
Some(format!("{major}.{minor}"))
}
#[test]
fn test_readmes_do_not_reference_removed_api_names() {
let readme_en = read_project_file("README.md");
let readme_zh = read_project_file("README.zh_CN.md");
for readme in [&readme_en, &readme_zh] {
assert!(!readme.contains("RejectedExecution"));
assert!(!readme.contains("TokioExecution"));
}
}
#[test]
fn test_readmes_limit_await_termination_to_blocking_service() {
let readme_en = read_project_file("README.md");
let readme_zh = read_project_file("README.zh_CN.md");
for readme in [&readme_en, &readme_zh] {
assert_eq!(1, readme.matches("service.await_termination().await").count());
}
}