8e13b1303a
Add support for a zero-sized Unit type. This requires some special at the codegen level because LLVM (unsurprisingly) only allows Void types in function return position - to make that a little easier to handle there's a new pass that strips any unit-only expressions and pulls unit-only function arguments up to new `let` bindings, so we never have to actually pass around unit values. Change-Id: I0fc18a516821f2d69172c42a6a5d246b23471e38 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2695 Reviewed-by: glittershark <grfn@gws.fyi> Tested-by: BuildkiteCI
79 lines
1.7 KiB
Rust
79 lines
1.7 KiB
Rust
use std::process::Command;
|
|
|
|
use crate_root::root;
|
|
|
|
struct Fixture {
|
|
name: &'static str,
|
|
exit_code: i32,
|
|
expected_output: &'static str,
|
|
}
|
|
|
|
const FIXTURES: &[Fixture] = &[
|
|
Fixture {
|
|
name: "simple",
|
|
exit_code: 5,
|
|
expected_output: "",
|
|
},
|
|
Fixture {
|
|
name: "functions",
|
|
exit_code: 9,
|
|
expected_output: "",
|
|
},
|
|
Fixture {
|
|
name: "externs",
|
|
exit_code: 0,
|
|
expected_output: "foobar\n",
|
|
},
|
|
Fixture {
|
|
name: "units",
|
|
exit_code: 0,
|
|
expected_output: "hi\n",
|
|
},
|
|
];
|
|
|
|
#[test]
|
|
fn compile_and_run_files() {
|
|
let ach = root().unwrap().join("ach");
|
|
|
|
println!("Running: `make clean`");
|
|
assert!(
|
|
Command::new("make")
|
|
.arg("clean")
|
|
.current_dir(&ach)
|
|
.spawn()
|
|
.unwrap()
|
|
.wait()
|
|
.unwrap()
|
|
.success(),
|
|
"make clean failed"
|
|
);
|
|
|
|
for Fixture {
|
|
name,
|
|
exit_code,
|
|
expected_output,
|
|
} in FIXTURES
|
|
{
|
|
println!(">>> Testing: {}", name);
|
|
|
|
println!(" Running: `make {}`", name);
|
|
assert!(
|
|
Command::new("make")
|
|
.arg(name)
|
|
.current_dir(&ach)
|
|
.spawn()
|
|
.unwrap()
|
|
.wait()
|
|
.unwrap()
|
|
.success(),
|
|
"make failed"
|
|
);
|
|
|
|
let out_path = ach.join(name);
|
|
println!(" Running: `{}`", out_path.to_str().unwrap());
|
|
let output = Command::new(out_path).output().unwrap();
|
|
assert_eq!(output.status.code().unwrap(), *exit_code,);
|
|
assert_eq!(output.stdout, expected_output.as_bytes());
|
|
println!(" OK");
|
|
}
|
|
}
|