8d5f3029e5
Implement very basic monomorphization, by recording type variable instantiations when typechecking Call nodes and then using those in a new hir Visitor trait to copy the body of any generic decls for each possible set of instantiation of the type variables. Change-Id: Iab54030973e5d66e2b8bcd074b4cb6c001a90123 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2617 Reviewed-by: glittershark <grfn@gws.fyi> Tested-by: BuildkiteCI
74 lines
1.6 KiB
Rust
74 lines
1.6 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",
|
|
},
|
|
];
|
|
|
|
#[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");
|
|
}
|
|
}
|