Skip to content

Commit

Permalink
fix: append #[::core::prelude::v1::test] only if it does not exist
Browse files Browse the repository at this point in the history
This way if preceding test macros add `#[::core::prelude::v1::test]` by
appending, then we can avoid duplicated test runs.

See also frondeus/test-case#101, frondeus/test-case#143

Closes d-e-s-o#35.
  • Loading branch information
kezhuw committed Apr 19, 2024
1 parent bc1a8c0 commit da8927c
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 7 deletions.
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,7 @@ tracing = {version = "0.1.20"}
#
# Probably fixed by https://github.com/rust-lang-nursery/lazy-static.rs/pull/107.
_lazy_static_unused = { package = "lazy_static", version = "1.0.2" }

[patch.crates-io]
test-case = { git = "https://github.com/kezhuw/test-case.git", branch = "test-proc-macros-cooperation" }
tokio = { git = "https://github.com/kezhuw/tokio.git", branch = "test-proc-macros-cooperation" }
24 changes: 17 additions & 7 deletions macros/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use quote::quote;

use syn::parse::Parse;
use syn::parse_macro_input;
use syn::parse_quote;
use syn::Attribute;
use syn::Expr;
use syn::ItemFn;
Expand Down Expand Up @@ -44,12 +45,6 @@ fn parse_attrs(attrs: Vec<Attribute>) -> syn::Result<(AttributeArgs, Vec<Attribu
}

fn try_test(attr: TokenStream, input: ItemFn) -> syn::Result<Tokens> {
let inner_test = if attr.is_empty() {
quote! { ::core::prelude::v1::test }
} else {
attr.into()
};

let ItemFn {
attrs,
vis,
Expand All @@ -61,9 +56,24 @@ fn try_test(attr: TokenStream, input: ItemFn) -> syn::Result<Tokens> {
let logging_init = expand_logging_init(&attribute_args);
let tracing_init = expand_tracing_init(&attribute_args);

let (inner_test, generated_test) = if attr.is_empty() {
let test_attr: syn::Attribute = parse_quote! { #[::core::prelude::v1::test] };
let has_test = ignored_attrs.iter().any(|attr| *attr == test_attr);
let generated_test = if has_test {
quote! {}
} else {
quote! { #test_attr }
};
(quote! {}, generated_test)
} else {
let attr: Tokens = attr.into();
(quote! { #[#attr] }, quote! {})
};

let result = quote! {
#[#inner_test]
#inner_test
#(#ignored_attrs)*
#generated_test
#vis #sig {
// We put all initialization code into a separate module here in
// order to prevent potential ambiguities that could result in
Expand Down
30 changes: 30 additions & 0 deletions tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,36 @@ fn with_inner_test_attribute_and_test_args_and_panic(x: i8, _y: i8) {
assert_eq!(x, 0);
}

#[tokio::test]
#[test_log::test]
async fn with_append_test_attribute_and_async() {
assert_eq!(async { 42 }.await, 42)
}

#[test_case::test_case(-2, -4)]
#[test_case::test_case(-2, -5)]
#[test_log::test]
fn with_append_test_attribute_and_test_args(x: i8, _y: i8) {
assert_eq!(x, -2);
}

#[should_panic]
#[test_case::test_case(-2, -4)]
#[test_case::test_case(-3, -4)]
#[test_log::test]
fn with_append_test_attribute_and_test_args_and_panic(x: i8, _y: i8) {
assert_eq!(x, 0);
}

#[should_panic]
#[test_case::test_case(-2, -4)]
#[test_case::test_case(-3, -4)]
#[tokio::test]
#[test_log::test]
async fn with_append_test_attribute_and_test_args_and_panic_async(x: i8, _y: i8) {
assert_eq!(x, 0);
}

#[instrument]
async fn instrumented(input: usize) -> usize {
info!("input = {}", input);
Expand Down

0 comments on commit da8927c

Please sign in to comment.