use std::process::Command;
fn ilo() -> Command {
Command::new(env!("CARGO_BIN_EXE_ilo"))
}
fn verify_src(src: &str) -> (String, bool) {
let out = ilo().arg(src).output().expect("ilo binary not found");
let stdout = String::from_utf8_lossy(&out.stdout).trim().to_string();
let stderr = String::from_utf8_lossy(&out.stderr).trim().to_string();
let combined = if stderr.is_empty() {
stdout
} else if stdout.is_empty() {
stderr
} else {
format!("{stdout}\n{stderr}")
};
(combined, out.status.success())
}
#[test]
fn world_no_net_returns_world_with_net_false() {
let (out, ok) = verify_src("main>W;world-no-net");
assert!(ok, "world-no-net should succeed: {out}");
assert!(out.contains("net: false"), "net should be false: {out}");
assert!(out.contains("read: true"), "read should be true: {out}");
assert!(out.contains("write: true"), "write should be true: {out}");
assert!(out.contains("run: true"), "run should be true: {out}");
}
#[test]
fn world_no_net_field_net_is_false() {
let (out, ok) = verify_src("main>b;wn=world-no-net;wn.net");
assert!(ok, "wn.net should succeed: {out}");
assert!(out.contains("false"), "wn.net should be false: {out}");
}
#[test]
fn world_no_net_type_is_world() {
let src = "use-w w:W>b;w.net\nmain>b;use-w world-no-net";
let (out, ok) = verify_src(src);
assert!(ok, "world-no-net should be accepted as W: {out}");
assert!(out.contains("false"), "expected false: {out}");
}
#[test]
fn get_with_world_no_net_in_scope_is_rejected() {
let src = "f url:t>R t t;wn=world-no-net;get url";
let (out, ok) = verify_src(src);
assert!(!ok, "should be rejected: {out}");
assert!(out.contains("ILO-T044"), "expected ILO-T044: {out}");
assert!(out.contains("wn"), "should mention the variable: {out}");
assert!(out.contains("net=false"), "should mention net=false: {out}");
}
#[test]
fn pst_with_world_no_net_in_scope_is_rejected() {
let src = "f url:t>R t t;wn=world-no-net;pst url \"body\"";
let (out, ok) = verify_src(src);
assert!(!ok, "should be rejected: {out}");
assert!(out.contains("ILO-T044"), "expected ILO-T044: {out}");
}
#[test]
fn put_with_world_no_net_in_scope_is_rejected() {
let src = "f url:t>R t t;wn=world-no-net;put url \"body\"";
let (out, ok) = verify_src(src);
assert!(!ok, "should be rejected: {out}");
assert!(out.contains("ILO-T044"), "expected ILO-T044: {out}");
}
#[test]
fn del_with_world_no_net_in_scope_is_rejected() {
let src = "f url:t>R t t;wn=world-no-net;del url";
let (out, ok) = verify_src(src);
assert!(!ok, "should be rejected: {out}");
assert!(out.contains("ILO-T044"), "expected ILO-T044: {out}");
}
#[test]
fn hed_with_world_no_net_in_scope_is_rejected() {
let src = "f url:t>R t t;wn=world-no-net;hed url";
let (out, ok) = verify_src(src);
assert!(!ok, "should be rejected: {out}");
assert!(out.contains("ILO-T044"), "expected ILO-T044: {out}");
}
#[test]
fn get_without_world_no_net_is_accepted() {
let src = "f url:t>R t t;get url";
let (out, ok) = verify_src(src);
assert!(
ok || !out.contains("ILO-T044"),
"should not emit ILO-T044: {out}"
);
}
#[test]
fn get_with_dynamic_world_in_scope_is_not_rejected() {
let src = "f url:t>R t t;w=world;get url";
let (out, ok) = verify_src(src);
assert!(
ok || !out.contains("ILO-T044"),
"dynamic world should not trigger ILO-T044: {out}"
);
}
#[test]
fn world_no_net_without_net_call_is_accepted() {
let src = "main>b;wn=world-no-net;wn.read";
let (out, ok) = verify_src(src);
assert!(ok, "no net call → should be accepted: {out}");
}
#[test]
fn world_param_with_net_call_is_not_rejected() {
let src = "fetch w:W url:t>R t t;get url";
let (out, ok) = verify_src(src);
assert!(
ok || !out.contains("ILO-T044"),
"W param should not trigger ILO-T044: {out}"
);
}