use std::path::PathBuf;
use std::process::Command;
fn cargo_path() -> String {
std::env::var("CARGO").unwrap_or_else(|_| "cargo".to_string())
}
fn doc_dir() -> PathBuf {
let manifest = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
manifest.join("target").join("doc")
}
#[test]
#[ignore = "slow: runs cargo doc; covered by strict CI's doc gate"]
fn docs_build_succeeds_with_docs_rs_flags() {
let out = Command::new(cargo_path())
.args([
"doc",
"--no-deps",
"--all-features",
"--manifest-path",
"Cargo.toml",
])
.env("RUSTDOCFLAGS", "--cfg docsrs -D warnings")
.output()
.expect("failed to spawn cargo doc");
if !out.status.success() {
let stderr = String::from_utf8_lossy(&out.stderr);
panic!("cargo doc failed:\n{stderr}");
}
}
#[test]
#[ignore = "slow: requires running cargo doc first"]
fn docs_build_produces_expected_pages() {
let out = Command::new(cargo_path())
.args([
"doc",
"--no-deps",
"--all-features",
"--manifest-path",
"Cargo.toml",
"--quiet",
])
.env("RUSTDOCFLAGS", "--cfg docsrs -D warnings")
.output()
.expect("failed to spawn cargo doc");
assert!(out.status.success(), "cargo doc failed");
let doc = doc_dir();
let crate_dir = doc.join("bwipp");
assert!(
crate_dir.is_dir(),
"missing bwipp/ in {}: docs.rs build wouldn't ship anything",
doc.display(),
);
let must_exist = [
crate_dir.join("index.html"),
crate_dir.join("symbology").join("enum.Symbology.html"),
crate_dir.join("options").join("struct.Options.html"),
];
for path in must_exist {
assert!(path.is_file(), "missing docs page: {}", path.display(),);
}
}
#[test]
#[ignore = "slow: requires running cargo doc first"]
fn docs_symbology_page_lists_core_variants() {
let out = Command::new(cargo_path())
.args([
"doc",
"--no-deps",
"--all-features",
"--manifest-path",
"Cargo.toml",
"--quiet",
])
.env("RUSTDOCFLAGS", "--cfg docsrs -D warnings")
.output()
.expect("failed to spawn cargo doc");
assert!(out.status.success(), "cargo doc failed");
let page = doc_dir()
.join("bwipp")
.join("symbology")
.join("enum.Symbology.html");
let html = std::fs::read_to_string(&page)
.unwrap_or_else(|e| panic!("read {} failed: {e}", page.display()));
for variant in [
"Code128",
"QrCode",
"DataMatrix",
"Ean13",
"Pdf417",
"Ultracode",
] {
assert!(
html.contains(variant),
"Symbology page is missing the {variant:?} variant in its rendered HTML",
);
}
}