#enums #variant #testing #traits #generate #tree #type

every_variant

Provides an EveryVariant trait that provides the every_variant method on types. Allows you to easily generate every combination of variants in structures that contains Enums, or in nested enum trees. This to allow for additional testing of codepaths

8 releases

0.4.5 Oct 27, 2023
0.4.4 Mar 24, 2022
0.4.3 Sep 14, 2021
0.2.1 Jan 12, 2021
0.2.0 Sep 30, 2020

#424 in Data structures

Download history 153/week @ 2023-11-20 228/week @ 2023-11-27 158/week @ 2023-12-04 91/week @ 2023-12-11 358/week @ 2023-12-18 57/week @ 2023-12-25 152/week @ 2024-01-01 661/week @ 2024-01-08 511/week @ 2024-01-15 363/week @ 2024-01-22 494/week @ 2024-01-29 590/week @ 2024-02-05 436/week @ 2024-02-12 848/week @ 2024-02-19 767/week @ 2024-02-26 586/week @ 2024-03-04

2,641 downloads per month

MIT license

18KB
381 lines

every_variant

Provides an EveryVariant trait that provides the every_variant() method on types. Allows you to easily generate every combination of variants in structures that contains Enums, or in nested enum trees. This to allow for additional testing of codepaths where nested enum trees are used.

The derive macro EveryVariant will provide the every_variant() method for you, with some preset values for the std types such as floats, integers and strings,

The generated data inside at the lowest level is currently fixed to specific values. If you have types that are dependend on strings with a specific format on the strings for example, I suggest that those be made into their own types and every_variant implemented manually for those.

Example:


use every_variant::EveryVariant;

/// Type of the message
#[derive(EveryVariant, Debug, Clone)]
enum MessageType {
    Codified,
    Markdown,
    Html,
}

/// This type should generate 4 different variant
#[derive(EveryVariant, Debug, Clone)]
struct FormattedMessage {
    /// Enum dictating how to render the string, None means its hidden
    rendermethod: Option<MessageType>,
    /// The optional content of the message
    text: String,
}

fn main() {
    let all_diferent_messages = FormattedMessage::every_variant();
    println!("{:#?}", all_diferent_messages);
}


the output will be:

[
    FormattedMessage {
        rendermethod: None,
        text: "example String",
    },
    FormattedMessage {
        rendermethod: Some(
            Codified,
        ),
        text: "example String",
    },
    FormattedMessage {
        rendermethod: Some(
            Markdown,
        ),
        text: "example String",
    },
    FormattedMessage {
        rendermethod: Some(
            Html,
        ),
        text: "example String",
    },
]

Dependencies

~1.1–1.6MB
~37K SLoC