use std::process::Command;
fn run(args: &[&str]) -> (i32, String, String) {
let out = Command::new(env!("CARGO_BIN_EXE_docling-rs"))
.args(args)
.output()
.expect("run docling-rs");
(
out.status.code().unwrap_or(-1),
String::from_utf8_lossy(&out.stdout).into_owned(),
String::from_utf8_lossy(&out.stderr).into_owned(),
)
}
#[test]
fn version_flag_reports_the_crate_version() {
for flag in ["--version", "-V"] {
let (code, stdout, stderr) = run(&[flag]);
assert_eq!(code, 0, "{flag}: stderr: {stderr}");
assert!(
stdout.starts_with(&format!("docling-rs {}", env!("CARGO_PKG_VERSION"))),
"{flag}: {stdout:?}"
);
assert!(stderr.is_empty(), "{flag}: stderr: {stderr:?}");
}
}
#[test]
fn version_lists_compiled_features() {
let (_, stdout, _) = run(&["--version"]);
#[cfg(feature = "chunking")]
assert!(stdout.contains("chunking"), "{stdout:?}");
#[cfg(not(feature = "chunking"))]
assert!(!stdout.contains('('), "{stdout:?}");
}
#[test]
fn help_flag_prints_the_flag_list() {
for flag in ["--help", "-h"] {
let (code, stdout, stderr) = run(&[flag]);
assert_eq!(code, 0, "{flag}: stderr: {stderr}");
assert!(stdout.contains("usage: docling-rs"), "{flag}: {stdout:?}");
for expected in ["--to md|json", "--pages A-B", "--pipeline standard|vlm"] {
assert!(stdout.contains(expected), "{flag}: missing {expected}");
}
assert!(stderr.is_empty(), "{flag}: stderr: {stderr:?}");
}
}
#[test]
fn no_arguments_is_a_usage_error() {
let (code, stdout, stderr) = run(&[]);
assert_eq!(code, 2);
assert!(stdout.is_empty(), "{stdout:?}");
assert!(stderr.contains("no input file"), "{stderr:?}");
assert!(stderr.contains("--help"), "{stderr:?}");
}
#[test]
fn unknown_flag_points_at_help() {
let (code, _, stderr) = run(&["--no-such-flag"]);
assert_eq!(code, 2);
assert!(stderr.contains("--no-such-flag"), "{stderr:?}");
assert!(stderr.contains("--help"), "{stderr:?}");
}
#[test]
fn help_is_recognized_in_any_position() {
let (code, stdout, _) = run(&["--strict", "--to", "json", "--help"]);
assert_eq!(code, 0);
assert!(stdout.contains("usage: docling-rs"), "{stdout:?}");
}