macro_rules! build_model_harness {
(
$(#[$meta:meta])*
$vis:vis harness $harness:ident <$item:ident> {
component: $component_field:ident : $component_ty:ty,
$($sections:tt)*
}
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
rx ports: { $($rx_section:tt)* }, $($rest:tt)*
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
rx ports: { $($rx_section:tt)* }
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
tx ports: { $($tx_section:tt)* }, $($rest:tt)*
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
tx ports: { $($tx_section:tt)* }
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
rx port arrays: { $($rx_array_section:tt)* }, $($rest:tt)*
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
rx port arrays: { $($rx_array_section:tt)* }
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
tx port arrays: { $($tx_array_section:tt)* }, $($rest:tt)*
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
tx port arrays: { $($tx_array_section:tt)* }
) => { ... };
(
@normalize
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
[$($rx_ports:tt)*]
[$($tx_ports:tt)*]
[$($rx_arrays:tt)*]
[$($tx_arrays:tt)*]
) => { ... };
(
@impl
[$($meta:tt)*]
[$vis:vis]
[$harness:ident]
[$item:ident]
[$component_field:ident : $component_ty:ty]
rx ports: { $($rx_variant:ident <$rx_ty:ty> => $rx_field:ident),* $(,)? },
tx ports: { $($tx_variant:ident <$tx_ty:ty> => $tx_field:ident),* $(,)? },
rx port arrays: {
$($rx_array_variant:ident <$rx_array_ty:ty> => $rx_array_field:ident {
count: $rx_array_count:ident
}),* $(,)?
},
tx port arrays: {
$($tx_array_variant:ident <$tx_array_ty:ty> => $tx_array_field:ident {
count: $tx_array_count:ident
}),* $(,)?
} $(,)?
) => { ... };
}Expand description
Builds a simulation test harness for models that implement AccessMemory.
This macro uses the same harness DSL and generated API as
gwr_components::build_component_harness!, but requires AccessMemory and
checks TX expectations against MemoryTxn.
See the crate-level Testing documentation for the intended usage pattern, generated API, and examples.