use tracing::subscriber::with_default; use tracing_attributes::instrument; use tracing_mock::*; #[test] fn destructure_tuples() { #[instrument] fn my_fn((arg1, arg2): (usize, usize)) {} let span = span::mock().named("my_fn"); let (subscriber, handle) = subscriber::mock() .new_span( span.clone().with_field( field::mock("arg1") .with_value(&format_args!("1")) .and(field::mock("arg2").with_value(&format_args!("2"))) .only(), ), ) .enter(span.clone()) .exit(span.clone()) .drop_span(span) .done() .run_with_handle(); with_default(subscriber, || { my_fn((1, 2)); }); handle.assert_finished(); } #[test] fn destructure_nested_tuples() { #[instrument] fn my_fn(((arg1, arg2), (arg3, arg4)): ((usize, usize), (usize, usize))) {} let span = span::mock().named("my_fn"); let (subscriber, handle) = subscriber::mock() .new_span( span.clone().with_field( field::mock("arg1") .with_value(&format_args!("1")) .and(field::mock("arg2").with_value(&format_args!("2"))) .and(field::mock("arg3").with_value(&format_args!("3"))) .and(field::mock("arg4").with_value(&format_args!("4"))) .only(), ), ) .enter(span.clone()) .exit(span.clone()) .drop_span(span) .done() .run_with_handle(); with_default(subscriber, || { my_fn(((1, 2), (3, 4))); }); handle.assert_finished(); } #[test] fn destructure_refs() { #[instrument] fn my_fn(&arg1: &usize) {} let span = span::mock().named("my_fn"); let (subscriber, handle) = subscriber::mock() .new_span( span.clone() .with_field(field::mock("arg1").with_value(&1usize).only()), ) .enter(span.clone()) .exit(span.clone()) .drop_span(span) .done() .run_with_handle(); with_default(subscriber, || { my_fn(&1); }); handle.assert_finished(); } #[test] fn destructure_tuple_structs() { struct Foo(usize, usize); #[instrument] fn my_fn(Foo(arg1, arg2): Foo) {} let span = span::mock().named("my_fn"); let (subscriber, handle) = subscriber::mock() .new_span( span.clone().with_field( field::mock("arg1") .with_value(&format_args!("1")) .and(field::mock("arg2").with_value(&format_args!("2"))) .only(), ), ) .enter(span.clone()) .exit(span.clone()) .drop_span(span) .done() .run_with_handle(); with_default(subscriber, || { my_fn(Foo(1, 2)); }); handle.assert_finished(); } #[test] fn destructure_structs() { struct Foo { bar: usize, baz: usize, } #[instrument] fn my_fn( Foo { bar: arg1, baz: arg2, }: Foo, ) { let _ = (arg1, arg2); } let span = span::mock().named("my_fn"); let (subscriber, handle) = subscriber::mock() .new_span( span.clone().with_field( field::mock("arg1") .with_value(&format_args!("1")) .and(field::mock("arg2").with_value(&format_args!("2"))) .only(), ), ) .enter(span.clone()) .exit(span.clone()) .drop_span(span) .done() .run_with_handle(); with_default(subscriber, || { my_fn(Foo { bar: 1, baz: 2 }); }); handle.assert_finished(); } #[test] fn destructure_everything() { struct Foo { bar: Bar, baz: (usize, usize), qux: NoDebug, } struct Bar((usize, usize)); struct NoDebug; #[instrument] fn my_fn( &Foo { bar: Bar((arg1, arg2)), baz: (arg3, arg4), .. }: &Foo, ) { let _ = (arg1, arg2, arg3, arg4); } let span = span::mock().named("my_fn"); let (subscriber, handle) = subscriber::mock() .new_span( span.clone().with_field( field::mock("arg1") .with_value(&format_args!("1")) .and(field::mock("arg2").with_value(&format_args!("2"))) .and(field::mock("arg3").with_value(&format_args!("3"))) .and(field::mock("arg4").with_value(&format_args!("4"))) .only(), ), ) .enter(span.clone()) .exit(span.clone()) .drop_span(span) .done() .run_with_handle(); with_default(subscriber, || { let foo = Foo { bar: Bar((1, 2)), baz: (3, 4), qux: NoDebug, }; let _ = foo.qux; // to eliminate unused field warning my_fn(&foo); }); handle.assert_finished(); }