1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//! [`assert!(...)`](macro.assert.html) and [`check!(...)`](macro.check.html) macros inspired by Catch2.
//!
//! This crate is currently a work in progress.
//! It relies on a nightly compiler with the `proc_macro_hygiene`, `proc_macro_span` and `specialization` features.
//! As a user of the crate, you also need to enable the `proc_macro_hygiene` feature.
//!
//! Unlike the asserts in standard library, there is no difference between `assert`, `assert_eq` or others.
//! Instead, you write all checks with the same [`assert!(...)`](macro.assert.html) or [`check!(...)`](macro.check.html) macros.
//! The macros recognize what kind of expression you wrote and will provide a useful error message with colored output when the check fails.
//!
//! Also unlike the standard `std::assert`, the macros from this crate show both the original expression and the value of the expression.
//! The standard library asserts only show the value of the expression.
//!
//! Finally, in addition to boolean expressions, you can test if a value matches a pattern by putting a `let` expression in the macro.
//! A quick example:
//!
//! ```
//! # #![feature(proc_macro_hygiene)]
//! # use assert2::check;
//! # use std::fs::File;
//! check!(6 == 2 * 3);
//! check!(true || false);
//! check!(let Err(_) = File::open("/non/existing/file"));
//! ```
//!
//! # Sample output
//!
//! ```should_panic
//! # #![feature(proc_macro_hygiene)]
//! # use assert2::check;
//! check!(6 + 1 <= 2 * 3);
//! ```
//!
//! 
//!
//! ```should_panic
//! # #![feature(proc_macro_hygiene)]
//! # use assert2::check;
//! check!(true && false);
//! ```
//!
//! 
//!
//! ```should_panic
//! # #![feature(proc_macro_hygiene)]
//! # use assert2::check;
//! # use std::fs::File;
//! check!(let Ok(_) = File::open("/non/existing/file"));
//! ```
//!
//! 
//!
//! # `assert` vs `check`
//! The crate provides two macros: `check!(...)` and `assert!(...)`.
//! The main difference is that check doesn't immediately panic.
//! Instead, it will print the assertion error and fail the test.
//! This allows you to run multiple checks, and can help to paint a clearer picture why a test failed.
//!
//! Currently, `check` uses a scope guard to delay the panic until the current scope ends.
//! Ideally, `check` should not panic until the whole test body has finished.
//! Even better would be if `check` doesn't panic at all, but simply marks the test as failed.
//! If this becomes possible in the future, the `check` macro will change, so *you should not rely on `check` to panic*.
//!
//! # Controlling colors.
//!
//! You can force colored output on or off by setting the `CLICOLOR` environment variable.
//! Set `CLICOLOR=1` to forcibly enable colors, or `CLICOLORS=0` to disable them.
//! If the environment variable is unset or set to `auto`, output will be colored if it is going to a terminal.
pub use assert;
pub use check;
/// Scope guard to panic when a check!() fails.
///
/// The panic is done by a lambda passed to the guard,
/// so that the line information points to the check!() invocation.
;