use std::process::Command;
fn ilo() -> Command {
Command::new(env!("CARGO_BIN_EXE_ilo"))
}
fn run(engine: &str, src: &str, entry: &str, arg: &str) -> String {
let mut cmd = ilo();
if arg.is_empty() {
cmd.args([src, engine, entry]);
} else {
cmd.args([src, engine, entry, arg]);
}
let out = cmd.output().expect("failed to run ilo");
if out.status.success() {
String::from_utf8_lossy(&out.stdout).trim().to_string()
} else {
let stderr = String::from_utf8_lossy(&out.stderr).trim().to_string();
if stderr.starts_with('^') {
stderr
} else {
panic!(
"ilo {engine} failed for `{src}`: stderr={}",
String::from_utf8_lossy(&out.stderr)
);
}
}
}
const WILDCARD_DISCARD: &str = "pn s:t>n;r=num s;?r{~v:v;^_:0}\n";
#[test]
fn wildcard_discard_ok_tree() {
assert_eq!(run("--vm", WILDCARD_DISCARD, "pn", "3.14"), "3.14");
}
#[test]
fn wildcard_discard_ok_vm() {
assert_eq!(run("--vm", WILDCARD_DISCARD, "pn", "3.14"), "3.14");
}
#[test]
#[cfg(feature = "cranelift")]
fn wildcard_discard_ok_cranelift() {
assert_eq!(run("--jit", WILDCARD_DISCARD, "pn", "3.14"), "3.14");
}
#[test]
fn wildcard_discard_err_tree() {
assert_eq!(run("--vm", WILDCARD_DISCARD, "pn", "oops"), "0");
}
#[test]
fn wildcard_discard_err_vm() {
assert_eq!(run("--vm", WILDCARD_DISCARD, "pn", "oops"), "0");
}
#[test]
#[cfg(feature = "cranelift")]
fn wildcard_discard_err_cranelift() {
assert_eq!(run("--jit", WILDCARD_DISCARD, "pn", "oops"), "0");
}
const REWRAP_UNCHANGED: &str = "f s:t>R n t;r=num s;?r{~_:~_;^_:^\"e\"}\n";
#[test]
fn rewrap_unchanged_ok_tree() {
assert_eq!(run("--vm", REWRAP_UNCHANGED, "f", "3.14"), "3.14");
}
#[test]
fn rewrap_unchanged_ok_vm() {
assert_eq!(run("--vm", REWRAP_UNCHANGED, "f", "3.14"), "3.14");
}
#[test]
#[cfg(feature = "cranelift")]
fn rewrap_unchanged_ok_cranelift() {
assert_eq!(run("--jit", REWRAP_UNCHANGED, "f", "3.14"), "3.14");
}
#[test]
fn rewrap_unchanged_err_tree() {
assert_eq!(run("--vm", REWRAP_UNCHANGED, "f", "oops"), "^e");
}
#[test]
fn rewrap_unchanged_err_vm() {
assert_eq!(run("--vm", REWRAP_UNCHANGED, "f", "oops"), "^e");
}
#[test]
#[cfg(feature = "cranelift")]
fn rewrap_unchanged_err_cranelift() {
assert_eq!(run("--jit", REWRAP_UNCHANGED, "f", "oops"), "^e");
}
const ERR_DEBUG_FMT: &str = "f s:t>t;r=num s;?r{~v:str v;^_:fmt \"err: {}\" _}\n";
#[test]
fn err_debug_fmt_tree() {
assert_eq!(run("--vm", ERR_DEBUG_FMT, "f", "abc"), "err: abc");
}
#[test]
fn err_debug_fmt_vm() {
assert_eq!(run("--vm", ERR_DEBUG_FMT, "f", "abc"), "err: abc");
}
#[test]
#[cfg(feature = "cranelift")]
fn err_debug_fmt_cranelift() {
assert_eq!(run("--jit", ERR_DEBUG_FMT, "f", "abc"), "err: abc");
}
const PLAIN_WILDCARD_BIND: &str = "f x:n>n;?x{1:10;_:_}\n";
#[test]
fn plain_wildcard_bind_subject_tree() {
assert_eq!(run("--vm", PLAIN_WILDCARD_BIND, "f", "42"), "42");
}
#[test]
fn plain_wildcard_bind_subject_vm() {
assert_eq!(run("--vm", PLAIN_WILDCARD_BIND, "f", "42"), "42");
}
#[test]
#[cfg(feature = "cranelift")]
fn plain_wildcard_bind_subject_cranelift() {
assert_eq!(run("--jit", PLAIN_WILDCARD_BIND, "f", "42"), "42");
}
#[test]
fn plain_wildcard_bind_literal_tree() {
assert_eq!(run("--vm", PLAIN_WILDCARD_BIND, "f", "1"), "10");
}
#[test]
fn plain_wildcard_bind_literal_vm() {
assert_eq!(run("--vm", PLAIN_WILDCARD_BIND, "f", "1"), "10");
}
#[test]
#[cfg(feature = "cranelift")]
fn plain_wildcard_bind_literal_cranelift() {
assert_eq!(run("--jit", PLAIN_WILDCARD_BIND, "f", "1"), "10");
}
const TYPEIS_WILDCARD_BIND: &str = "f x:n>n;?x{n _:+_ 1;_:0}\n";
#[test]
fn typeis_wildcard_bind_tree() {
assert_eq!(run("--vm", TYPEIS_WILDCARD_BIND, "f", "5"), "6");
}
#[test]
fn typeis_wildcard_bind_vm() {
assert_eq!(run("--vm", TYPEIS_WILDCARD_BIND, "f", "5"), "6");
}
#[test]
#[cfg(feature = "cranelift")]
fn typeis_wildcard_bind_cranelift() {
assert_eq!(run("--jit", TYPEIS_WILDCARD_BIND, "f", "5"), "6");
}
const NAMED_BINDINGS: &str = "f s:t>t;r=num s;?r{~v:str v;^er:+\"err: \" er}\n";
#[test]
fn named_bindings_ok_tree() {
assert_eq!(run("--vm", NAMED_BINDINGS, "f", "3.14"), "3.14");
}
#[test]
fn named_bindings_ok_vm() {
assert_eq!(run("--vm", NAMED_BINDINGS, "f", "3.14"), "3.14");
}
#[test]
#[cfg(feature = "cranelift")]
fn named_bindings_ok_cranelift() {
assert_eq!(run("--jit", NAMED_BINDINGS, "f", "3.14"), "3.14");
}
#[test]
fn named_bindings_err_tree() {
assert_eq!(run("--vm", NAMED_BINDINGS, "f", "abc"), "err: abc");
}
#[test]
fn named_bindings_err_vm() {
assert_eq!(run("--vm", NAMED_BINDINGS, "f", "abc"), "err: abc");
}
#[test]
#[cfg(feature = "cranelift")]
fn named_bindings_err_cranelift() {
assert_eq!(run("--jit", NAMED_BINDINGS, "f", "abc"), "err: abc");
}