# Expecting

[![Crates.io](https://img.shields.io/crates/v/expecting)](https://crates.io/crates/expecting)
[![Documentation](https://docs.rs/expecting/badge.svg)](https://docs.rs/expecting)
[![Crates.io](https://img.shields.io/crates/l/expecting)](LICENSE)

**Expecting** provides macros for testing conditions without panicking. The
`expect_*` family of macros cause an early return of `anyhow::Error` if the
expected condition is not met.

| Macro                                 | Description                                            |
|---------------------------------------|--------------------------------------------------------|
| `expect!(condition)`                  | Expects `condition` to be `true`                       |
| `expect_eq!(a, b)`                    | Expects `a == b`                                       |
| `expect_ne!(a, b)`                    | Expects `a != b`                                       |
| `expect_some(option)`                 | Expects `option` to be `Some(x)` and returns `x`       |
| `expect_some_eq(some_a, a)`           | Expects `some_a == Some(a)`                            |
| `expect_none(option)`                 | Expects `option` to be `None`                          |
| `expect_ok(result)`                   | Expects `result` to be `Ok(x)` and returns `x`         |
| `expect_err(result)`                  | Expects `result` to be `Err(e)` and returns `e`        |
| `expect_contains(string, substr)`     | Expects `string` to contain `substr`                   |
| `expect_contains(container, element)` | Expects `container` (e.g., `Vec`) to contain `element` |
| `expect_empty(container)`             | Expects `container` to have no elements.               |
| `expect_empty(string)`                | Expects `string` to have a length of zero.             |
| `expect_not_empty(container)`         | Expects `container` to have 1+ elements.               |
| `expect_not_empty(string)`            | Expects `string` to have non-zero length.              |

This crate is especially helpful in async integration tests that involve
provisioning and tearing down resources; rather than struggle to catch panics,
you can simply use `expect_*` instead of `assert_*` to return `Result`.

## Examples

```rust
use expecting::expect_eq;

#[test]
fn passing_test() -> Result<()> {
    expect_eq!(1, 1);
    Ok(())
}

#[test]
fn failing_test() -> Result<()> {
    expect_eq!(1, 2);  // returns early
    Ok(())  // won't be reached
}
```

The error message for a failed test includes the line number and detailed
description of what went wrong.

![expect_eq error](docs/expect_eq_error.png)

![expect_contains error](docs/expect_contains_error.png)

See [the docs](https://docs.rs/expecting) for usage examples and more info.
