rtest_util/
lib.rs

1/// TestArguments specifies every possible setting a test can have. This can be
2/// used to specify a responsible, set groups, or similar for a test
3#[derive(Debug, Default)]
4#[cfg_attr(feature = "derive", derive(darling::FromMeta))]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub struct TestArguments {
7    /// specifies the module your test lives in
8    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
9    pub module:      Option<String>,
10    /// only relevant for displaying, tests in one group will be displayed
11    /// together
12    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
13    pub group:       Option<String>,
14    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
15    pub cost:        Option<u32>,
16    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
17    pub responsible: Option<String>,
18    /// test is not necessary to be executed, but still might be executed.
19    /// Missing execution does not cause a Failure. If it runs but then fails,
20    /// it still counts as an failure
21    #[cfg_attr(feature = "derive", darling(default))]
22    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "std::ops::Not::not"))]
23    pub optional:    bool,
24}
25
26#[cfg(feature = "derive")]
27impl quote::ToTokens for TestArguments {
28    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
29        use quote::quote;
30
31        let module = match self.module.clone() {
32            Some(val) => quote!(Some( #val.to_string() )),
33            None => quote!(None),
34        };
35        let group = match self.group.clone() {
36            Some(val) => quote!(Some( #val.to_string() )),
37            None => quote!(None),
38        };
39        let cost = match self.cost {
40            Some(val) => quote!(Some( #val )),
41            None => quote!(None),
42        };
43        let responsible = match self.responsible.clone() {
44            Some(val) => quote!(Some( #val.to_string() )),
45            None => quote!(None),
46        };
47        let optional = self.optional;
48        let optional = quote!( #optional );
49
50        tokens.extend(quote!(TestArguments{
51            module: #module,
52            group: #group,
53            cost: #cost,
54            responsible: #responsible,
55            optional: #optional,
56        }));
57    }
58}