macrotest
Similar to [trybuild], but allows you to write tests on how macros are expanded.
A minimal macrotest
setup looks like this:
In project's Cargo.toml:
toml
[dev-dependencies]
macrotest = "0.1"
Under project's tests/
directory create tests.rs
:
```rust
pub fn pass() { macrotest::expand("tests/expand/*.rs"); } ```
The test can be run with cargo test
. This test will invoke cargo expand
command on each of
the source files matches the glob pattern and will compare expansion result with
corresponding *.expanded.rs
file.
If *.expanded.rs
file doesn't exists, it will create a new one
(this is how you update your tests).
Possible test outcomes are:
- Pass: expansion succeeded and a result is the same as in *.expanded.rs
file
- Fail: expansion is different from the *.expanded.rs
file content. This will print a diff
- Refresh: *.expanded.rs
didn't exist and has been created
NB: following code is removed from the expansion result:
```rust
use std::prelude::v1::*;
extern crate std; ```
First of all, a cargo-expand
tool must be present.
You can install it with cargo
:
bash
cargo install cargo-expand
A nightly compiler is required for this tool to operate, so it must be installed as well.
cargo-expand
uses rustfmt
to format expanded code.
It's advised to install it, since examples in test-project and
test-procmacro-project are using formatted version of expanded code to compare with.
Inside your crate that provides procedural or declarative macros, create a test case
under tests
directory.
Under the tests
directory create an expand
directory and populate it with
different expansion test cases as Rust source files.
Then, under the tests
directory, create tests.rs
file that will run the tests:
```rust
pub fn pass() { macrotest::expand("tests/expand/*.rs"); } ```
And then you can run cargo test
to
*.expanded.rs
files for each of the test cases under
the expand
directory*.expanded.rs
files*.expanded.rs
Just remove the *.expanded.rs
files and re-run the tests. Files will be created
automatically; hand-writing them is not recommended.