#parameterized #macro #parametrized #code-gen #test

macro test_gen

A comprehensive function-like macro, for concisely defining parameterized tests

5 releases

0.2.3 Jan 9, 2023
0.2.2 Dec 19, 2022
0.2.1 Dec 15, 2022
0.2.0 Dec 8, 2022
0.1.0 Nov 4, 2022

#458 in Testing

BSD-3-Clause

22KB
292 lines

test_gen

A comprehensive function-like macro, for concisely defining parameterized tests.

This crate provides the function-like macro of its namesake, test_gen, which enables the concise definition of batches of named tests, implementing a parameterized argument format to minimise the boilerplate otherwise required for specifying batches of similar tests.

Documentation can be found at Docs.rs.

Usage

Minimum Supported Rust Version: 1.63.0

test_gen can be added to a project, using the following command:

cargo add test_gen --dev

Or alternatively, by adding the following lines to its Cargo.toml file:

[dev-dependancies]
test_gen = "0.2.3"

Examples

Fruits:

use test_gen::*;

enum Fruit<T> {
    Apple,
    Pear,
    Other(T),
}

enum BrambleFruit {
    BlackBerry,
}

trait NameOf {
    fn name_of(&self) -> &str;
}

impl<T: NameOf> NameOf for Fruit<T> {
    fn name_of(&self) -> &str {
        use Fruit::*;

        match self {
            Apple => "apple",
            Pear => "pear",
            Other(fruit) => fruit.name_of(),
        }
    }
}

impl NameOf for BrambleFruit {
    fn name_of(&self) -> &str {
        use BrambleFruit::*;

        match self {
            BlackBerry => "blackberry",
        }
    }
}

// Helper function
fn assert_fruit<T: NameOf>(fruit: Fruit<T>, name: &str) {
    assert_eq!(fruit.name_of(), name);
}

// Test specification
test_gen! {
    // Normal turbofish syntax can be used,
    // when concrete type specification is required
    fn assert_fruit::<BrambleFruit> => {
        apple: {
            (Fruit::Apple, "apple")
        },
        // Applying case specific attributes
        pear: {
            #[ignore]
            (Fruit::Pear, "pear")
        },
        isnt_pear: {
            #[should_panic]
            (Fruit::Pear, "apple")
        },
        blackberry: {
            (Fruit::Other(BrambleFruit::BlackBerry), "blackberry")
        },
    }
}

License

test_gen is licensed under the BSD 3-Clause license.

See LICENSE for details.

Dependencies

~1.5MB
~35K SLoC