use std::process::Command;
fn ilo() -> Command {
Command::new(env!("CARGO_BIN_EXE_ilo"))
}
fn run(engine: &str, src: &str, entry: &str) -> String {
let out = ilo()
.args([src, engine, entry])
.output()
.expect("failed to run ilo");
assert!(
out.status.success(),
"ilo {engine} failed: stderr={}",
String::from_utf8_lossy(&out.stderr)
);
String::from_utf8_lossy(&out.stdout).into_owned()
}
#[cfg(feature = "cranelift")]
const ENGINES_ALL: &[&str] = &["--run-tree", "--run-vm", "--run-cranelift"];
#[cfg(not(feature = "cranelift"))]
const ENGINES_ALL: &[&str] = &["--run-tree", "--run-vm"];
const LOOP_TAIL: &str = r#"f>n;cs=["1"];@c cs{rn=num c;?rn{^_:99;~v:42}};5"#;
#[test]
fn match_in_loop_tail_cross_engine() {
for engine in ENGINES_ALL {
let out = run(engine, LOOP_TAIL, "f");
assert_eq!(out.trim(), "5", "{engine}: {out:?}");
}
}
const FN_TAIL: &str = r#"f>n;rn=num "1";?rn{^_:99;~v:42}"#;
#[test]
fn match_as_fn_tail_cross_engine() {
for engine in ENGINES_ALL {
let out = run(engine, FN_TAIL, "f");
assert_eq!(out.trim(), "42", "{engine}: {out:?}");
}
}
const LOOP_SIDE_EFFECTS: &str =
r#"f>n;n=0;cs=["1","x","2","y","3"];@c cs{rn=num c;?rn{^_:n;~v:n=+n 1}};n"#;
#[test]
fn match_side_effects_in_loop_cross_engine() {
for engine in ENGINES_ALL {
let out = run(engine, LOOP_SIDE_EFFECTS, "f");
assert_eq!(out.trim(), "3", "{engine}: {out:?}");
}
}
const BRK_IN_MATCH: &str =
r#"f>n;n=0;cs=["1","2","x","3"];@c cs{rn=num c;?rn{^_:1{brk}{n=n};~v:n=+n 1}};n"#;
#[test]
fn brk_in_match_in_loop_cross_engine() {
for engine in ENGINES_ALL {
let out = run(engine, BRK_IN_MATCH, "f");
assert_eq!(out.trim(), "2", "{engine}: {out:?}");
}
}
const WHILE_LOOP_TAIL: &str = r#"f>n;i=0;wh <i 3{i=+i 1;rn=num "1";?rn{^_:99;~v:42}};5"#;
#[test]
fn match_in_while_loop_tail_cross_engine() {
for engine in ENGINES_ALL {
let out = run(engine, WHILE_LOOP_TAIL, "f");
assert_eq!(out.trim(), "5", "{engine}: {out:?}");
}
}
const CNT_IN_MATCH: &str =
r#"f>n;n=0;cs=["1","x","2","y","3"];@c cs{rn=num c;?rn{^_:1{cnt}{n=n};~v:n=+n 1}};n"#;
#[test]
fn cnt_in_match_in_loop_cross_engine() {
for engine in ENGINES_ALL {
let out = run(engine, CNT_IN_MATCH, "f");
assert_eq!(out.trim(), "3", "{engine}: {out:?}");
}
}