use std::{ ffi::OsStr, path::{Path, PathBuf}, process::{Command, Output}, }; #[test] fn enum_struct_fields_alpha_fixture_emits_nested_enum_fields_and_tests_pass() { let fixture = Path::new(env!("CARGO_MANIFEST_DIR")).join("../examples/enum-struct-fields.slo"); let compile = run_glagol([fixture.as_os_str()]); let stdout = String::from_utf8_lossy(&compile.stdout); let stderr = String::from_utf8_lossy(&compile.stderr); assert!( compile.status.success(), "compiler rejected enum struct field fixture\nstdout:\n{}\nstderr:\n{}", stdout, stderr ); assert!( stdout.contains("define { i32, { i32, i32 } } @make_tagged") && stdout.contains("extractvalue { i32, { i32, i32 } }") && stdout.contains("switch i32") && stdout.contains("and i1"), "LLVM output did not contain expected enum-in-struct aggregate shape\nstdout:\n{}", stdout ); let run = run_glagol([OsStr::new("--run-tests"), fixture.as_os_str()]); assert_success_stdout( run, concat!( "test \"enum struct field payloadless equality\" ... ok\n", "test \"enum struct field unary payload equality\" ... ok\n", "test \"enum struct field access return\" ... ok\n", "test \"enum struct field local param return call flow\" ... ok\n", "test \"enum struct field match missing\" ... ok\n", "test \"enum struct field status predicate\" ... ok\n", "6 test(s) passed\n", ), ); } #[test] fn enum_struct_fields_alpha_formatter_and_lowering_are_visible() { let fixture = Path::new(env!("CARGO_MANIFEST_DIR")).join("../tests/enum-struct-fields.slo"); let formatted = run_glagol([OsStr::new("--format"), fixture.as_os_str()]); assert_success_stdout( formatted, &std::fs::read_to_string(&fixture).expect("read enum struct field fixture"), ); let surface = run_glagol([ OsStr::new("--inspect-lowering=surface"), fixture.as_os_str(), ]); assert_success_stdout( surface, &std::fs::read_to_string( Path::new(env!("CARGO_MANIFEST_DIR")).join("../tests/enum-struct-fields.surface.lower"), ) .expect("read surface snapshot"), ); let checked = run_glagol([ OsStr::new("--inspect-lowering=checked"), fixture.as_os_str(), ]); assert_success_stdout( checked, &std::fs::read_to_string( Path::new(env!("CARGO_MANIFEST_DIR")).join("../tests/enum-struct-fields.checked.lower"), ) .expect("read checked snapshot"), ); } fn run_glagol(args: I) -> Output where I: IntoIterator, S: AsRef, { Command::new(glagol_bin()) .args(args) .output() .expect("run glagol") } fn glagol_bin() -> PathBuf { PathBuf::from(env!("CARGO_BIN_EXE_glagol")) } fn assert_success_stdout(output: Output, expected: &str) { let stdout = String::from_utf8_lossy(&output.stdout); let stderr = String::from_utf8_lossy(&output.stderr); assert!( output.status.success(), "command failed\nstdout:\n{}\nstderr:\n{}", stdout, stderr ); assert_eq!(stdout, expected); assert!(stderr.is_empty(), "stderr was not empty:\n{}", stderr); }