#codegen #proc-macro #file-path #glob-pattern #test

macro test-each-codegen

Internal proc-macro crate for test-each

3 unstable releases

0.2.1 Jun 1, 2023
0.2.0 Jun 1, 2023
0.1.0 May 30, 2023

#37 in #glob-pattern

Download history 13/week @ 2024-01-01 23/week @ 2024-01-15 4/week @ 2024-01-29 24/week @ 2024-02-05 161/week @ 2024-02-12 54/week @ 2024-02-19 62/week @ 2024-02-26 87/week @ 2024-03-04 493/week @ 2024-03-11 409/week @ 2024-03-18 152/week @ 2024-03-25 134/week @ 2024-04-01 193/week @ 2024-04-08 112/week @ 2024-04-15

600 downloads per month
Used in 2 crates (via test-each)

Custom license

8KB
152 lines

test-each

Generate tests at compile-time based on files and directories.

Usage

This crate contains three attributes that all generate tests based on a file glob pattern. Each attribute generates tests with different argument types. The generated tests will be named after sanitized versions of the file names.

Text files

Receive file contents as &'static str with test_each::file. This ignores any matched directories.

#[test_each::file(glob = "data/*.txt")]
fn test_file(content: &str) {
    // check contents
}

If data contains the files foo.txt and bar.txt, the following code will be generated:

#[test]
fn test_file_foo() {
    test_file(include_str("data/foo.txt"))
}

#[test]
fn test_file_bar() {
    test_file(include_str("data/bar.txt"))
}

Binary files

Receive file contents as &'static [u8] with test_each::blob. This ignores any matched directories.

#[test_each::blob(glob = "data/*.bin")]
fn test_bytes(content: &[u8]) {
    // check contents
}

Declare a second parameter in order to additionally receive the path of file.

#[test_each::blob(glob = "data/*.bin")]
fn test_bytes(content: &[u8], path: PathBuf) {
    // check contents and path
}

Paths to files and directories

Receive file path as PathBuf with test_each::path. This includes any matched directories.

#[test_each::path(glob = "data/*")]
fn test_bytes(path: PathBuf) {
    // check path
}

Customizing the function name

By default the name of the generated test will consist of the escaped file name without extension. Use the name attribute to change how the function names are formatted.

Use name(segments = <n>) to add n amount of path segments (from right to left) to the name.

Use name(index) to add a unique index to the end of the test name. This will prevent name collisions.

Use name(extension) to include the file extension the end of the test name.

/// The generated function name will be `test_file_bar_baz_data_txt_0`
#[test_each::file(glob = "foo/bar/baz/data.txt", name(segments = 3, index, extension))]
fn test_file(_: &str) {}

Notes

Any change to an already included file will correctly trigger a recompilation, but creating a new file that matches the glob might not cause a recompilation. To fix this issue add a build file that emits cargo-rerun-if-changed={<glob directories>}.

Dependencies

~0.4–0.8MB
~20K SLoC