delayed_assert/
lib.rs

1//! [![ci-badge][]][ci] [![docs-badge][]][docs] [![crate-version]][crate-link]
2//!
3//! # delayed-assert
4//!
5//! A simple library for delaying asserts.
6//!
7//! ## Sample Usage
8//! ```rust
9//! # use delayed_assert::DelayedAssert;
10//! let mut da = DelayedAssert::new();
11//! da.expect("something truthy");
12//! da.expect_equal(42, 42);
13//! da.assert_expectations();
14//! ```
15//!
16//! [ci]: https://github.com/Elinvynia/delayed-assert/actions?query=workflow%3ARust
17//! [ci-badge]: https://img.shields.io/github/workflow/status/Elinvynia/delayed-assert/Rust/master?style=flat-square
18//! [docs]: https://docs.rs/delayed-assert
19//! [docs-badge]: https://img.shields.io/badge/docs-online-5023dd.svg?style=flat-square
20//! [crate-link]: https://crates.io/crates/delayed-assert
21//! [crate-version]: https://img.shields.io/crates/v/delayed-assert.svg?style=flat-square
22
23#![warn(missing_debug_implementations)]
24#![warn(missing_docs)]
25
26use std::fmt::Debug;
27use truthy::Truthy;
28
29/// A struct for keeping state of delayed asserts.
30#[derive(Debug, Default)]
31pub struct DelayedAssert {
32    asserts: u32,
33    messages: Vec<String>,
34}
35
36impl DelayedAssert {
37    /// Creates a new holder for delayed asserts.
38    pub fn new() -> Self {
39        DelayedAssert {
40            asserts: 0,
41            messages: vec![],
42        }
43    }
44
45    /// Use just like the `assert!` macro, adds it to the queue.
46    pub fn expect<T: Truthy + Debug>(&mut self, value: T) {
47        self.asserts += 1;
48        if !value.truthy() {
49            self.messages
50                .push(format!("{}. Assertion Failed! {:?}", self.asserts, value));
51        }
52    }
53
54    /// Use just like the `assert_eq!` macro, adds it to the queue.
55    pub fn expect_equal<T: PartialEq + Debug>(&mut self, left: T, right: T) {
56        self.asserts += 1;
57        if !(left == right) {
58            self.messages.push(format!(
59                "{}. Assertion Failed! Values are not equal!\nLeft: {:?}\nRight: {:?}",
60                self.asserts, left, right
61            ));
62        }
63    }
64
65    /// Run the asserts.
66    pub fn assert_expectations(self) {
67        let length = self.messages.len();
68
69        for message in self.messages {
70            println!("{}", message)
71        }
72
73        println!("In total {}/{} asserts failed.", length, self.asserts);
74        if length > 0 {
75            panic!("Some asserts failed!")
76        }
77    }
78}