From 11cdabaadd8c1f046573a790a358da9e908b32ad Mon Sep 17 00:00:00 2001 From: michele Date: Sat, 27 Nov 2021 12:01:57 +0100 Subject: [PATCH] #119: Implement the defined type for once --- src/render/fixture.rs | 6 +++- tests/fixture/mod.rs | 1 + tests/resources/fixture/once_defined_type.rs | 33 ++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 tests/resources/fixture/once_defined_type.rs diff --git a/src/render/fixture.rs b/src/render/fixture.rs index 30cae35..d369978 100644 --- a/src/render/fixture.rs +++ b/src/render/fixture.rs @@ -102,11 +102,15 @@ fn render_partial_impl( resolver: &impl Resolver, info: &FixtureInfo, ) -> TokenStream { - let output = info + let mut output = info .attributes .extract_partial_type(n) .unwrap_or_else(|| fixture.sig.output.clone()); + if info.attributes.is_once() { + output = wrap_return_type_as_static_ref(output); + } + let generics = generics_clean_up(&fixture.sig.generics, fn_args(fixture).take(n), &output); let where_clause = &generics.where_clause; let asyncness = &fixture.sig.asyncness; diff --git a/tests/fixture/mod.rs b/tests/fixture/mod.rs index 365fdf6..317e7bd 100644 --- a/tests/fixture/mod.rs +++ b/tests/fixture/mod.rs @@ -201,6 +201,7 @@ mod should { #[rstest] #[case("once.rs")] #[case::no_return("once_no_return.rs")] + #[case::no_return("once_defined_type.rs")] fn accept_once_attribute_and_call_fixture_just_once(#[case] fname: &str) { let project = prj(fname).with_nocapture(); diff --git a/tests/resources/fixture/once_defined_type.rs b/tests/resources/fixture/once_defined_type.rs new file mode 100644 index 0000000..1ac439c --- /dev/null +++ b/tests/resources/fixture/once_defined_type.rs @@ -0,0 +1,33 @@ +use rstest::{fixture, rstest}; + +#[fixture] +#[default(u32)] +#[partial_1(u32)] +#[once] +fn once_fixture(#[default(())] a: (), #[default(())] b: ()) -> u32 { + eprintln!("Exec fixture() just once"); + 42 +} + +#[rstest] +fn base(once_fixture: &u32) { + assert_eq!(&42, once_fixture); +} + +#[rstest] +fn base_partial(#[with(())] once_fixture: &u32) { + assert_eq!(&42, once_fixture); +} + +#[rstest] +fn base_complete(#[with((), ())] once_fixture: &u32) { + assert_eq!(&42, once_fixture); +} + +#[rstest] +#[case(2)] +#[case(3)] +#[case(7)] +fn cases(once_fixture: &u32, #[case] divisor: u32) { + assert_eq!(0, *once_fixture % divisor); +}