From 9c919d4e79ea693dd9d950496ef752e0add3b619 Mon Sep 17 00:00:00 2001 From: Maxim Vezenov Date: Thu, 30 Oct 2025 16:06:26 +0000 Subject: [PATCH] add unit tests for source order --- .../src/tests/metaprogramming.rs | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/compiler/noirc_frontend/src/tests/metaprogramming.rs b/compiler/noirc_frontend/src/tests/metaprogramming.rs index 80d2d2d4087..66371c72ef3 100644 --- a/compiler/noirc_frontend/src/tests/metaprogramming.rs +++ b/compiler/noirc_frontend/src/tests/metaprogramming.rs @@ -586,3 +586,121 @@ fn cannot_generate_inner_attributes() { "#; check_errors(src); } + +#[test] +fn attributes_run_in_textual_order_within_module() { + let src = r#" + comptime mut global counter: Field = 0; + + #[assert_source_order(0)] + fn first() {} + + #[assert_source_order(1)] + fn second() {} + + #[assert_source_order(2)] + fn third() {} + + comptime fn assert_source_order(_: FunctionDefinition, expected: Field) { + assert(counter == expected); + counter += 1; + } + + fn main() { + let _ = first(); + let _ = second(); + let _ = third(); + } + "#; + assert_no_errors(src); +} + +#[test] +fn sibling_modules_run_in_textual_order() { + let src = r#" + comptime mut global counter: Field = 0; + + mod first_child { + #[crate::assert_source_order(0)] + pub fn first() {} + } + + mod second_child { + #[crate::assert_source_order(1)] + pub fn second() {} + } + + #[assert_source_order(2)] + fn parent() {} + + comptime fn assert_source_order(_: FunctionDefinition, expected: Field) { + assert(counter == expected); + counter += 1; + } + + fn main() { + let _ = first_child::first(); + let _ = second_child::second(); + let _ = parent(); + } + "#; + assert_no_errors(src); +} + +#[test] +fn child_module_attributes_run_before_parent() { + let src = r#" + comptime mut global counter: Field = 0; + + mod child { + #[crate::assert_source_order(0)] + pub fn child_fn() {} + } + + #[assert_source_order(1)] + fn parent_fn() {} + + comptime fn assert_source_order(_: FunctionDefinition, expected: Field) { + assert(counter == expected); + counter += 1; + } + + fn main() { + let _ = child::child_fn(); + let _ = parent_fn(); + } + "#; + assert_no_errors(src); +} + +#[test] +fn nested_child_modules_run_innermost_first() { + let src = r#" + comptime mut global counter: Field = 0; + + mod parent { + pub mod child { + #[crate::assert_source_order(0)] + pub fn innermost() {} + } + + #[crate::assert_source_order(1)] + pub fn middle() {} + } + + #[assert_source_order(2)] + fn outermost() {} + + comptime fn assert_source_order(_: FunctionDefinition, expected: Field) { + assert(counter == expected); + counter += 1; + } + + fn main() { + let _ = parent::child::innermost(); + let _ = parent::middle(); + let _ = outermost(); + } + "#; + assert_no_errors(src); +}