From 9d8a867e5fd1e9072837528b02f6fb6e57b4ad05 Mon Sep 17 00:00:00 2001 From: Devin Bidwell Date: Tue, 30 Dec 2025 11:53:02 -0700 Subject: [PATCH] Add new macro variant 'check' to ensure there are no errors AND the compiled output matches --- .github/copilot-instructions.md | 11 ++++++++--- rust_compiler/libs/compiler/src/test/mod.rs | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index cb9d715..0cd82d6 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -83,7 +83,7 @@ cargo test --package compiler --lib -- test::tuple_literals::test::test_tuple_li ```bash cd rust_compiler # Compile Slang code to IC10 using current compiler changes -echo 'let x = 5;' | cargo run --bin slang - +echo 'let x = 5;' | cargo run --bin slang -- # Or from file cargo run --bin slang -- input.slang -o output.ic10 # Optimize the output with -z flag @@ -99,8 +99,13 @@ Tests follow a macro pattern in [libs/compiler/src/test/mod.rs](rust_compiler/li ```rust #[test] fn test_name() -> Result<()> { - let output = compile!("slang code here"); - assert_eq!(expected_ic10, output); + let output = compile!(debug "slang code here"); + assert_eq!( + output, + indoc! { + "Expected IC10 output here" + } + ); Ok(()) } ``` diff --git a/rust_compiler/libs/compiler/src/test/mod.rs b/rust_compiler/libs/compiler/src/test/mod.rs index 5a0ac55..e5b58b8 100644 --- a/rust_compiler/libs/compiler/src/test/mod.rs +++ b/rust_compiler/libs/compiler/src/test/mod.rs @@ -6,6 +6,12 @@ macro_rules! output { }; } +/// Represents both compilation errors and compiled output +pub struct CompilationCheckResult { + pub errors: Vec>, + pub output: String, +} + #[cfg_attr(test, macro_export)] macro_rules! compile { ($source:expr) => {{ @@ -37,6 +43,21 @@ macro_rules! compile { res.instructions.write(&mut writer)?; output!(writer) }}; + + (check $source:expr) => {{ + let mut writer = std::io::BufWriter::new(Vec::new()); + let compiler = crate::Compiler::new( + parser::Parser::new(tokenizer::Tokenizer::from($source)), + Some(crate::CompilerConfig { debug: true }), + ); + let res = compiler.compile(); + res.instructions.write(&mut writer)?; + let output = output!(writer); + crate::test::CompilationCheckResult { + errors: res.errors, + output, + } + }}; } mod binary_expression; mod branching;