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}