test-each

Crates.iotest-each
lib.rstest-each
version0.3.1
sourcesrc
created_at2023-05-30 17:49:35.738316
updated_at2024-10-03 10:49:10.630687
descriptionGenerate tests at compile-time based on file resources
homepagehttps://github.com/remkop22/test-each
repositoryhttps://github.com/remkop22/test-each
max_upload_size
id878150
size9,954
Remo (remkop22)

documentation

https://docs.rs/test-each

README

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: &Path) {
    // check contents and path
}

Paths to files and directories

Receive file path as a reference to Path with test_each::path. This includes any matched directories.

#[test_each::path(glob = "data/*")]
fn test_bytes(path: &Path) {
    // 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>}.

Commit count: 7

cargo fmt