slovo/compiler/tests/array_struct_elements_alpha.rs
2026-05-22 08:38:43 +02:00

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);
}