### High level overview of test case generation
#### An example
With this macro we generate the following code (1) from the given parameterized test definition (0):
**parameterized test definition:**
```rust
// 0
#[parameterized(a = {1, 2}, b = { "wanderlust", "wanderer" })]
fn my_test(a: i32, b: &str) {
assert!(a > 0 && b.starts_with("w"))
}
```
**generated test cases:**
```rust
// 1
#[cfg(test)]
mod my_test {
#[test]
fn case_0() {
let a: i32 = 1;
let b: &str = "wanderlust";
assert!(a > 0 && b.starts_with("w"))
}
#[test]
fn case_1() {
let a: i32 = 2;
let b: &str = "wanderer";
assert!(a > 0 && b.starts_with("w"))
}
}
```
More examples can be found in the `expand` crate, and the tests.
#### notes:
- The function name in (1) is the same as the module name in (0)
- Note that arguments are not limited to primitives; they can be any expression (assuming:)
- In a parameterized test case, the input arguments (which are expressions) specified in the attribute should evaluate
to the same type as their identically named companions in the function signature.
- Tests executed from the workspace crate should be run individually, e.g.
(`cargo test --package parameterized-macro --test tests individual_cases -- --exact`).
Otherwise, if just `cargo test` is used, some generated test cases will run in an incorrect context setting.