rvtest 0.3.2

A Next Level Testing Library for Rust — BDD specs, property-based testing, parametrized tests, rich reporting, and code coverage. Just a library, not a framework.
Documentation
use std::panic::{catch_unwind, AssertUnwindSafe};
use std::sync::atomic::{AtomicU32, Ordering};
use std::time::Duration;

use rvtest::core::RunnerConfig;
use rvtest::spec::describe;

#[test]
fn timeout_test_passes_quickly() {
    describe("Quick")
        .it("fast", || {})
        .timeout(Duration::from_secs(1))
        .run()
        .assert_all_pass();
}

#[test]
fn tag_exclude_filters_correctly() {
    let suite = describe("Filtered")
        .tag("slow")
        .it("should be excluded", || {})
        .run_with_config(&RunnerConfig {
            exclude_tags: vec!["slow".into()],
            ..RunnerConfig::default()
        });
    assert_eq!(suite.tests.len(), 0, "slow test should be excluded");
}

#[test]
fn tag_include_filters_correctly() {
    let suite = describe("Filtered")
        .tag("smoke")
        .it("should be included", || {})
        .run_with_config(&RunnerConfig {
            include_tags: vec!["smoke".into()],
            ..RunnerConfig::default()
        });
    assert_eq!(suite.tests.len(), 1, "smoke test should be included");
}

#[test]
fn name_filter_excludes_correctly() {
    let suite = describe("Name filter")
        .it("keep_me", || {})
        .it("exclude_me", || {})
        .run_with_config(&RunnerConfig {
            filter: Some("keep".into()),
            ..RunnerConfig::default()
        });
    assert_eq!(suite.tests.len(), 1);
    assert_eq!(suite.tests[0].name, "Name filter :: keep_me");
}

#[test]
fn auto_retry_retries_failed_tests() {
    let counter = AtomicU32::new(0);
    let result = catch_unwind(AssertUnwindSafe(|| {
        describe("AutoRetry")
            .it("succeeds on retry", move || {
                let prev = counter.fetch_add(1, Ordering::SeqCst);
                if prev == 0 {
                    panic!("first attempt fails");
                }
            })
            .run_with_config(&RunnerConfig {
                auto_retry: true,
                ..RunnerConfig::default()
            })
            .assert_all_pass();
    }));
    assert!(result.is_ok(), "auto_retry should retry and pass");
}