On Fri, Jul 04, 2025 at 01:26:58PM +0300, Manos Pitsidianakis wrote: > Date: Fri, 04 Jul 2025 13:26:58 +0300 > From: Manos Pitsidianakis <manos.pitsidiana...@linaro.org> > Subject: [PATCH 2/2] rust/qemu-api-macros: add unit tests > X-Mailer: b4 0.14.2 > > Add unit tests to check Derive macro output for expected error messages, > or for expected correct codegen output. > > Signed-off-by: Manos Pitsidianakis <manos.pitsidiana...@linaro.org> > --- > rust/qemu-api-macros/meson.build | 3 + > rust/qemu-api-macros/src/lib.rs | 3 + > rust/qemu-api-macros/src/tests.rs | 135 > ++++++++++++++++++++++++++++++++++++++ > rust/qemu-api-macros/src/utils.rs | 1 + > 4 files changed, 142 insertions(+) > > diff --git a/rust/qemu-api-macros/meson.build > b/rust/qemu-api-macros/meson.build > index > 8610ce1c8440c4b6e38a8462d4975bf76d72fb05..2152bcb99b30e4bdcc1c5b887b7903a37f6181c3 > 100644 > --- a/rust/qemu-api-macros/meson.build > +++ b/rust/qemu-api-macros/meson.build > @@ -17,3 +17,6 @@ _qemu_api_macros_rs = rust.proc_macro( > qemu_api_macros = declare_dependency( > link_with: _qemu_api_macros_rs, > ) > + > +rust.test('rust-qemu-api-macros-tests', _qemu_api_macros_rs, > + suite: ['unit', 'rust']) > diff --git a/rust/qemu-api-macros/src/lib.rs b/rust/qemu-api-macros/src/lib.rs > index > 4b30bea9eafc7924bf593113c3f42c5b1010c4b9..6c6e9b683f047f79cb377e6d30e23490f66bd711 > 100644 > --- a/rust/qemu-api-macros/src/lib.rs > +++ b/rust/qemu-api-macros/src/lib.rs > @@ -15,6 +15,9 @@ > mod bits; > use bits::BitsConstInternal; > > +#[cfg(test)] > +mod tests; > + > fn get_fields<'a>( > input: &'a DeriveInput, > msg: &str, > diff --git a/rust/qemu-api-macros/src/tests.rs > b/rust/qemu-api-macros/src/tests.rs > new file mode 100644 > index > 0000000000000000000000000000000000000000..dfca7d4838f141783472a4e728312aebeb9b5a8b > --- /dev/null > +++ b/rust/qemu-api-macros/src/tests.rs > @@ -0,0 +1,135 @@ > +// Copyright 2025, Linaro Limited > +// Author(s): Manos Pitsidianakis <manos.pitsidiana...@linaro.org> > +// SPDX-License-Identifier: GPL-2.0-or-later > + > +use super::*; > +use quote::quote; > + > +macro_rules! derive_compile_fail { > + ($derive_fn:ident, $input:expr, $error_msg:expr) => {{ > + let input: proc_macro2::TokenStream = $input; > + let error_msg: &str = $error_msg; > + let derive_fn: fn(input: syn::DeriveInput) -> > Result<proc_macro2::TokenStream, MacroError> = > + $derive_fn; > + > + let input: syn::DeriveInput = syn::parse2(input).unwrap(); > + let result = derive_fn(input); > + let MacroError::Message(err, _) = result.unwrap_err() else { > + panic!() > + }; > + assert_eq!(err, error_msg); > + }}; > +} > + > +macro_rules! derive_compile { > + ($derive_fn:ident, $input:expr, $($expected:tt)*) => {{ > + let input: proc_macro2::TokenStream = $input; > + let expected: proc_macro2::TokenStream = $($expected)*; > + let derive_fn: fn(input: syn::DeriveInput) -> > Result<proc_macro2::TokenStream, MacroError> = > + $derive_fn; > + > + let input: syn::DeriveInput = syn::parse2(input).unwrap(); > + let result = derive_fn(input).unwrap(); > + assert_eq!(result.to_string(), expected.to_string()); > + }}; > +}
Good examples to test macros. LGTM, Reviewed-by: Zhao Liu <zhao1....@intel.com>