96 lines
3.3 KiB
Rust
96 lines
3.3 KiB
Rust
use std::{
|
|
fs,
|
|
path::Path,
|
|
process::{Command, Output},
|
|
};
|
|
|
|
#[test]
|
|
fn array_struct_elements_fixture_emits_struct_array_llvm_shapes() {
|
|
let output = run_glagol(["../examples/array-struct-elements.slo"]);
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
|
|
assert!(
|
|
output.status.success(),
|
|
"compiler rejected array-struct-elements fixture\nstdout:\n{}\nstderr:\n{}",
|
|
stdout,
|
|
stderr
|
|
);
|
|
assert!(
|
|
stdout.contains("define [3 x { i32, ptr, i32 }] @make_pixels(ptr %head)")
|
|
&& stdout
|
|
.contains("define { i32, ptr, i32 } @at([3 x { i32, ptr, i32 }] %pixels, i32 %i)")
|
|
&& stdout.contains("extractvalue { i32, ptr, i32 }")
|
|
&& stdout.contains("call void @__glagol_array_bounds_trap()"),
|
|
"LLVM output did not contain expected struct-array shapes\nstdout:\n{}",
|
|
stdout
|
|
);
|
|
assert!(stderr.is_empty(), "compiler wrote stderr:\n{}", stderr);
|
|
}
|
|
|
|
#[test]
|
|
fn array_struct_elements_fixture_runs_tests_and_formats_stably() {
|
|
let run = run_glagol(["--run-tests", "../examples/array-struct-elements.slo"]);
|
|
assert_success_stdout(
|
|
run,
|
|
concat!(
|
|
"test \"struct array string field access\" ... ok\n",
|
|
"test \"struct array nested enum field access\" ... ok\n",
|
|
"test \"struct array local param return call flow\" ... ok\n",
|
|
"3 test(s) passed\n",
|
|
),
|
|
"array-struct-elements test runner output",
|
|
);
|
|
|
|
let expected = fs::read_to_string("../tests/array-struct-elements.slo").expect("read fixture");
|
|
let format = run_glagol(["--format", "../tests/array-struct-elements.slo"]);
|
|
assert_success_stdout(format, &expected, "array-struct-elements formatter output");
|
|
}
|
|
|
|
#[test]
|
|
fn array_struct_elements_fixture_lowering_snapshots_are_stable() {
|
|
let surface = run_glagol([
|
|
"--inspect-lowering=surface",
|
|
"../tests/array-struct-elements.slo",
|
|
]);
|
|
assert_success_stdout(
|
|
surface,
|
|
&fs::read_to_string("../tests/array-struct-elements.surface.lower")
|
|
.expect("read surface snapshot"),
|
|
"array-struct-elements surface lowering output",
|
|
);
|
|
|
|
let checked = run_glagol([
|
|
"--inspect-lowering=checked",
|
|
"../tests/array-struct-elements.slo",
|
|
]);
|
|
assert_success_stdout(
|
|
checked,
|
|
&fs::read_to_string("../tests/array-struct-elements.checked.lower")
|
|
.expect("read checked snapshot"),
|
|
"array-struct-elements checked lowering output",
|
|
);
|
|
}
|
|
|
|
fn run_glagol<const N: usize>(args: [&str; N]) -> Output {
|
|
Command::new(env!("CARGO_BIN_EXE_glagol"))
|
|
.args(args)
|
|
.current_dir(Path::new(env!("CARGO_MANIFEST_DIR")))
|
|
.output()
|
|
.expect("run glagol")
|
|
}
|
|
|
|
fn assert_success_stdout(output: Output, expected: &str, context: &str) {
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
assert!(
|
|
output.status.success(),
|
|
"{} failed\nstdout:\n{}\nstderr:\n{}",
|
|
context,
|
|
stdout,
|
|
stderr
|
|
);
|
|
assert_eq!(stdout, expected, "{} drifted", context);
|
|
assert!(stderr.is_empty(), "{} wrote stderr:\n{}", context, stderr);
|
|
}
|