Skip to content

Commit ee3448c

Browse files
committed
test: smoke-test the README in-house contract demo end-to-end (Move #4)
1 parent 7871574 commit ee3448c

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

tests/frontdoor_demo.rs

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
//! Proves the README's in-house contract demo actually runs end-to-end on the
2+
//! bundled single-contig fixture: index → sort → plan → variants --enforce → verify.
3+
4+
use std::path::PathBuf;
5+
use std::process::Command;
6+
use std::sync::atomic::{AtomicU64, Ordering};
7+
8+
fn bin() -> &'static str {
9+
env!("CARGO_BIN_EXE_rosalind")
10+
}
11+
12+
fn unique_dir() -> PathBuf {
13+
static C: AtomicU64 = AtomicU64::new(0);
14+
let n = C.fetch_add(1, Ordering::Relaxed);
15+
let nanos = std::time::SystemTime::now()
16+
.duration_since(std::time::UNIX_EPOCH)
17+
.unwrap()
18+
.as_nanos();
19+
let d = std::env::temp_dir().join(format!("rosalind-frontdoor-{nanos}-{n}"));
20+
std::fs::create_dir_all(&d).unwrap();
21+
d
22+
}
23+
24+
fn run(args: &[&str]) -> std::process::Output {
25+
Command::new(bin())
26+
.args(args)
27+
.output()
28+
.expect("spawn rosalind")
29+
}
30+
31+
#[test]
32+
fn readme_inhouse_contract_demo_runs_end_to_end() {
33+
// CARGO_MANIFEST_DIR points at the crate root; the fixture is bundled there.
34+
let root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
35+
let fa = root.join("examples/data/illumina_toy/reference.fa");
36+
let bam = root.join("examples/data/illumina_toy/alignments.bam");
37+
assert!(fa.exists(), "bundled reference missing: {}", fa.display());
38+
assert!(bam.exists(), "bundled alignments missing: {}", bam.display());
39+
40+
let dir = unique_dir();
41+
let idx = dir.join("toy.idx");
42+
let sorted = dir.join("toy.sorted.bam");
43+
let vcf = dir.join("toy.vcf");
44+
let manifest = dir.join("toy.vcf.manifest.json");
45+
46+
let out = run(&[
47+
"index",
48+
"--reference",
49+
fa.to_str().unwrap(),
50+
"--output",
51+
idx.to_str().unwrap(),
52+
]);
53+
assert!(out.status.success(), "index: {}", String::from_utf8_lossy(&out.stderr));
54+
55+
let out = run(&[
56+
"sort",
57+
"--input",
58+
bam.to_str().unwrap(),
59+
"--output",
60+
sorted.to_str().unwrap(),
61+
]);
62+
assert!(out.status.success(), "sort: {}", String::from_utf8_lossy(&out.stderr));
63+
64+
let out = run(&["plan", "--index", idx.to_str().unwrap(), "--budget-mb", "512"]);
65+
assert!(out.status.success(), "plan: {}", String::from_utf8_lossy(&out.stderr));
66+
assert!(String::from_utf8_lossy(&out.stdout).contains("predicted peak"));
67+
68+
let out = run(&[
69+
"variants",
70+
"--index",
71+
idx.to_str().unwrap(),
72+
"--alignments",
73+
sorted.to_str().unwrap(),
74+
"--memory-budget-mb",
75+
"512",
76+
"--enforce",
77+
"-o",
78+
vcf.to_str().unwrap(),
79+
]);
80+
assert!(
81+
out.status.success(),
82+
"variants --enforce: {}",
83+
String::from_utf8_lossy(&out.stderr)
84+
);
85+
assert!(manifest.exists(), "receipt sidecar must be written");
86+
87+
let out = run(&["verify", "--manifest", manifest.to_str().unwrap()]);
88+
assert!(out.status.success(), "verify: {}", String::from_utf8_lossy(&out.stderr));
89+
assert!(String::from_utf8_lossy(&out.stdout).contains("verify: OK"));
90+
91+
std::fs::remove_dir_all(&dir).ok();
92+
}

0 commit comments

Comments
 (0)