55 lines
1.1 KiB
Markdown
55 lines
1.1 KiB
Markdown
# Always-Equal
|
|
|
|
Always-Equal lets you wrap `PartialEq` implementations around
|
|
things that cannot be compared, like a `File`.
|
|
|
|
To use Always-Equal, put these two conditional `use`
|
|
statements in your module:
|
|
|
|
```rust
|
|
#[cfg (test)]
|
|
use always_equal::test::AlwaysEqual;
|
|
|
|
#[cfg (not (test))]
|
|
use always_equal::prod::AlwaysEqual;
|
|
```
|
|
|
|
Then wrap `AlwaysEqual` around anything that needs
|
|
PartialEq but can't possibly implement it:
|
|
|
|
```rust
|
|
use std::fs::File;
|
|
use always_equal::test::AlwaysEqual;
|
|
|
|
#[derive (Debug, PartialEq)]
|
|
pub struct MyStruct {
|
|
pub b: bool,
|
|
pub i: i64,
|
|
pub file: AlwaysEqual <File>,
|
|
}
|
|
|
|
// In test code, you can create an empty wrapper using
|
|
// `testing_blank`, which is equal to any other wrapper:
|
|
|
|
let expected = MyStruct {
|
|
b: true,
|
|
i: 0,
|
|
file: AlwaysEqual::testing_blank (),
|
|
};
|
|
|
|
# let my_file = File::open ("Cargo.toml").unwrap ();
|
|
let actual = MyStruct {
|
|
b: true,
|
|
i: 0,
|
|
file: my_file.into (),
|
|
};
|
|
|
|
assert_eq! (expected, actual);
|
|
```
|
|
|
|
This is implemented with `Option` in test mode.
|
|
In production mode, wrappers are never equal to any other
|
|
wrapper, and the `Option` is removed so that
|
|
`sizeof::<AlwaysEqual <T>> () == sizeof::<T>`
|
|
_should_ be true.
|