xpct is an assertions library for Rust. It's designed to be ergonomic, batteries-included, and test framework agnostic.
xpct is extensible. In addition to allowing you to write custom matchers, it separates the logic of matchers from how they format their output, meaning you can:
Want to get started? Check out the tutorial.
How do you pronounce "xpct"?
However you choose to pronounce it is how it's pronounced! I pronounce it like "expect."
A simple equality assertion, like assert_eq
:
```rust,should_panic use xpct::{expect, equal};
expect!("disco").to(equal("Disco")); ```
text
[src/main.rs:4:5] = "disco"
Expected:
"disco"
to equal:
"Disco"
Asserting that every element in a vec is Some
and unwrapping it to a
Vec<&str>
:
```rust,shouldpanic use xpct::{besome, every, expect};
let items = vec![Some("foo"), Some("bar"), None];
let output: Vec<&str> = expect!(items) .to(every(besome)) .intoinner(); ```
```text [src/main.rs:6:29] = items Expected all of these to be OK: [0] OK
[1] OK
[2] FAILED
Expected this to be Some(_)
```
Asserting that the given string does not match any of the given matchers:
```rust,shouldpanic use xpct::{any, containsubstr, equal, expect, match_regex};
let location = String::from("Central Jamrock");
expect!(location).tonot(any(|ctx| {
ctx.borrow::
```text [src/main.rs:6:5] = location Expected all of these to be OK: [0] OK
[1] FAILED
Expected:
"Central Jamrock"
to not contain the substring:
"Jamrock"
[2] OK
```
Making assertions about individual fields of a struct:
```rust,shouldpanic use xpct::{ all, beempty, begt, beok, besome, betrue, expect, fields, haveprefix, matchfields, why, };
struct Person {
name: Option
fn getperson() -> anyhow::Result
expect!(getperson()) .to(beok()) .to(matchfields(fields!(Person { name: all(|ctx| ctx .to(besome())? .tonot(beempty()) ), age: begt(0), id: why(haveprefix("REV"), "all IDs must have this prefix"), issuperstar: betrue(), }))); ```
text
[src/main.rs:22:5] = get_person()
Expected all of these to be OK:
my_crate::main::Person {
name: FAILED
Expected this to be Some(_)
age: OK
id: FAILED
🛈 all IDs must have this prefix
Expected:
"12-62-05-JAM41"
to have the prefix:
"REV"
is_superstar: OK
}