Skip to main content

cases

Macro cases 

Source
macro_rules! cases {
    ($ty:ty, $s:ident => $($rest:tt)*) => { ... };
    (@parse ($ty:ty) ($s:ident) [$($out:expr),*] $name:ident (depends_on = [$($dep:ident),+ $(,)?]) => $body:block $(, $($rest:tt)*)?) => { ... };
    (@parse ($ty:ty) ($s:ident) [$($out:expr),*] $name:ident => $body:block $(, $($rest:tt)*)?) => { ... };
    (@parse ($ty:ty) ($s:ident) [$($out:expr),*] ,) => { ... };
    (@parse ($ty:ty) ($s:ident) [$($out:expr),*]) => { ... };
}
Expand description

Build a &'static [Case<S>] from case names and inline blocks.

§Declaration

cases! {
    $ty:ty, $s:ident => $($name:ident => $body:block),* $(,)?
}

With dependencies:

cases! {
    $ty:ty, $s:ident =>
        $name:ident => $body:block,
        $name:ident (depends_on = [$($dep:ident),+]) => $body:block,
}

§Description

The type and binding $s are written once; each $body is a block that runs as the case body. Closures must not capture the environment so they coerce to fn(&mut S).

§Example

use suitecase::{cases, run, Case, HookFns, RunConfig};

#[derive(Default)]
struct MySuite {
    n: i32,
}

let cases: &[Case<MySuite>] = cases![MySuite, s =>
    one => { s.n = 1; },
    two => { assert_eq!(s.n, 1); },
];
let mut suite = MySuite::default();
run(&mut suite, cases, RunConfig::all(), &HookFns::default());

§Example with dependencies

use suitecase::{cases, run, Case, HookFns, RunConfig};

#[derive(Default)]
struct MySuite {
    n: i32,
}

let cases: &[Case<MySuite>] = cases![MySuite, s =>
    setup => { s.n = 1; },
    verify(depends_on = [setup]) => { assert_eq!(s.n, 1); },
];
let mut suite = MySuite::default();
run(&mut suite, cases, RunConfig::filter("verify"), &HookFns::default());
assert_eq!(suite.n, 1);