//! Workspace architecture law, expressed as source-level tests //! (`SMH-SPEC-SPEC0001`, acceptance: quality, architecture, documentation //! gates). //! //! Mirrors the manifest gate in xtask and adds what manifests cannot see: //! source dependency graphs and engine-ownership boundaries. use archunit::{assert_passes, project_files}; macro_rules! boundary { ($name:ident, $from:expr, $to:expr) => { #[test] fn $name() { let rule = project_files() .in_path(concat!($from, "/src/**")) .should_not() .depend_on_files() .in_path(concat!($to, "/src/**")); assert_passes!(rule); } }; } boundary!(smith_is_foundational, "smith", "smith-core"); boundary!(smith_never_ai, "smith", "smith-ai"); boundary!(smith_never_ui, "smith", "smith-ui"); boundary!(smith_never_tui, "smith", "smith-tui"); boundary!(smith_never_rpc, "smith", "smith-rpc"); boundary!(smith_never_harness, "smith", "smith-harness"); boundary!(smith_never_cli, "smith", "smith-cli"); boundary!(core_never_ai, "smith-core", "smith-ai"); boundary!(core_never_ui, "smith-core", "smith-ui"); boundary!(core_never_tui, "smith-core", "smith-tui"); boundary!(core_never_rpc, "smith-core", "smith-rpc"); boundary!(core_never_harness, "smith-core", "smith-harness"); boundary!(core_never_cli, "smith-core", "smith-cli"); boundary!(ai_never_core, "smith-ai", "smith-core"); boundary!(ai_never_ui, "smith-ai", "smith-ui"); boundary!(ai_never_tui, "smith-ai", "smith-tui"); boundary!(ai_never_rpc, "smith-ai", "smith-rpc"); boundary!(ai_never_harness, "smith-ai", "smith-harness"); boundary!(ai_never_cli, "smith-ai", "smith-cli"); boundary!(ui_never_core, "smith-ui", "smith-core"); boundary!(ui_never_ai, "smith-ui", "smith-ai"); boundary!(ui_never_tui, "smith-ui", "smith-tui"); boundary!(ui_never_rpc, "smith-ui", "smith-rpc"); boundary!(ui_never_harness, "smith-ui", "smith-harness"); boundary!(ui_never_cli, "smith-ui", "smith-cli"); boundary!(tui_never_core, "smith-tui", "smith-core"); boundary!(tui_never_ai, "smith-tui", "smith-ai"); boundary!(tui_never_rpc, "smith-tui", "smith-rpc"); boundary!(tui_never_harness, "smith-tui", "smith-harness"); boundary!(tui_never_cli, "smith-tui", "smith-cli"); boundary!(rpc_never_ai, "smith-rpc", "smith-ai"); boundary!(rpc_never_ui, "smith-rpc", "smith-ui"); boundary!(rpc_never_tui, "smith-rpc", "smith-tui"); boundary!(rpc_never_harness, "smith-rpc", "smith-harness"); boundary!(rpc_never_cli, "smith-rpc", "smith-cli"); #[test] fn wasmtime_lives_only_in_harness() { let rule = project_files() .in_path("smith-core/src/**") .should_not() .depend_on_external_modules() .matching("wasmtime"); assert_passes!(rule); }