//! Embedding-ABI M1 coherent-stop proof (spec ยง"Testing strategy" 5 //! + Acceptance criteria): build `examples/embed_backtest_step.ail` //! as a staticlib, link the C host against `libembed_backtest_step.a` //! + `libailang_rt.a`, run it, assert the `s == 25` assertion holds //! (exit 0). This is the whole-milestone existence proof. use ailang_test_support::workspace_root; use std::path::PathBuf; use std::process::Command; fn ail_bin() -> &'static str { env!("CARGO_BIN_EXE_ail") } fn manifest() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")) } #[test] fn c_host_calls_exported_scalar_kernel() { let fixture = workspace_root().join("examples").join("embed_backtest_step.ail"); let host_c = manifest().join("tests").join("embed").join("host.c"); let outdir = std::env::temp_dir() .join(format!("ail-embed-e2e-{}", std::process::id())); std::fs::create_dir_all(&outdir).unwrap(); let build = Command::new(ail_bin()) .args(["build", fixture.to_str().unwrap(), "--emit=staticlib", "-o", outdir.to_str().unwrap()]) .output().expect("ail build --emit=staticlib"); assert!(build.status.success(), "staticlib build failed: {}", String::from_utf8_lossy(&build.stderr)); let host_bin = outdir.join("host"); let cc = Command::new("cc") .arg(&host_c) .arg(outdir.join("libembed_backtest_step.a")) .arg(outdir.join("libailang_rt.a")) .arg("-o").arg(&host_bin) .output().expect("cc host link"); assert!(cc.status.success(), "cc link failed: {}", String::from_utf8_lossy(&cc.stderr)); let run = Command::new(&host_bin).output().expect("run host"); assert!(run.status.success(), "host assertion `s == 25` failed (exit {:?}); stderr={}", run.status.code(), String::from_utf8_lossy(&run.stderr)); }