assertables/lib.rs
1//! # Assertables: assert macros for better testing
2//!
3//! Assertables is a Rust crate that provides many assert macros
4//! to improve your compile-time tests and run-time reliability.
5//!
6//! **[documentation](https://docs.rs/assertables/)**
7//! •
8//! **[source](https://github.com/sixarm/assertables-rust-crate/)**
9//! •
10//! **[llms.txt](https://raw.githubusercontent.com/sixarm/assertables-rust-crate/refs/heads/main/llms.txt)**
11//! •
12//! **[crate](https://crates.io/crates/assertables)**
13//! •
14//! **[email](mailto:joel@joelparkerhenderson.com)**
15//!
16//! ## Introduction
17//!
18//! The Assertables Rust crate provides many assert macros
19//! that can help you develop, test, and debug.
20//!
21//! * Test values with
22//! [assert_lt](module@crate::assert_lt),
23//! [assert_gt](module@crate::assert_gt),
24//! [assert_in](module@crate::assert_in),
25//! […](https://docs.rs/assertables)
26//! * Test groups with
27//! [assert_all](module@crate::assert_all),
28//! [assert_any](module@crate::assert_any),
29//! [assert_iter](module@crate::assert_iter),
30//! […](https://docs.rs/assertables)
31//! * Test wrappers with
32//! [assert_ok](module@crate::assert_ok),
33//! [assert_some](module@crate::assert_some),
34//! [assert_ready](module@crate::assert_ready),
35//! […](https://docs.rs/assertables)
36//! * Test matching with
37//! [assert_matches](module@crate::assert_matches),
38//! [assert_is_match](module@crate::assert_is_match),
39//! […](https://docs.rs/assertables)
40//! * Test nearness with
41//! [assert_approx](module@crate::assert_approx),
42//! [assert_abs_diff](module@crate::assert_abs_diff),
43//! […](https://docs.rs/assertables/)
44//! * Test programs with
45//! [assert_command](module@crate::assert_command),
46//! [assert_status](module@crate::assert_status),
47//! […](https://docs.rs/assertables)
48//! * Many more below.
49//!
50//! To use this crate, add it to your file `Cargo.toml`:
51//!
52//! ```toml
53//! assertables = "9.8.0"
54//! ```
55//!
56//! Benefits:
57//!
58//! * You will write better tests to improve reliability and maintainability.
59//! * You will handle more corner cases without needing to write custom code.
60//! * You will troubleshoot faster because error messages show more detail.
61//!
62//! Learning:
63//! [FAQ](https://github.com/SixArm/assertables-rust-crate/tree/main/help/faq),
64//! [docs](https://docs.rs/assertables/),
65//! [examples](https://github.com/SixArm/assertables-rust-crate/blob/main/tests/examples/),
66//! [changes](https://github.com/SixArm/assertables-rust-crate/tree/main/CHANGES.md),
67//! [upgrades](https://github.com/SixArm/assertables-rust-crate/tree/main/help/upgrades/upgrade-from-version-8-to-9),
68//! [developing](https://github.com/SixArm/assertables-rust-crate/tree/main/help/developing/).
69//!
70//! Comparisons:
71//! [more_asserts](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/more_asserts),
72//! [cool_asserts](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/cool_asserts),
73//! [assert2](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/assert2),
74//! [claims](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/claims),
75//! [etc.](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons)
76//!
77//! ## Examples
78//!
79//! Examples with numbers:
80//!
81//! ```rust
82//! # use assertables::*;
83//! let i = 1;
84//! assert_lt!(i, 5);
85//! assert_diff_eq_x!(i, 5, 4);
86//! assert_in_range!(i, 1..5);
87//! ```
88//!
89//! Examples with strings:
90//!
91//! ```rust
92//! # use assertables::*;
93//! # use regex::Regex;
94//! let s = "hello";
95//! assert_starts_with!(s, "h");
96//! assert_contains!(s, "e");
97//! assert_is_match!(Regex::new(r"h.*o").unwrap(), s);
98//! ```
99//!
100//! Examples with arrays:
101//!
102//! ```rust
103//! # use assertables::*;
104//! let a = [1, 2, 3];
105//! assert_not_empty!(a);
106//! assert_len_eq_x!(a, 3);
107//! assert_all!(a.into_iter(), |i: i32| i < 4);
108//! ```
109//!
110//! ## Highlights
111//!
112//! Values:
113//!
114//! * [`assert_eq!(a, b)`](module@crate::assert_eq)
115//! * [`assert_ne!(a, b)`](module@crate::assert_ne)
116//! * [`assert_ge!(a, b)`](module@crate::assert_ge)
117//! * [`assert_gt!(a, b)`](module@crate::assert_gt)
118//! * [`assert_le!(a, b)`](module@crate::assert_le)
119//! * [`assert_lt!(a, b)`](module@crate::assert_lt)
120//!
121//! Floats:
122//!
123//! * [`assert_f32_eq!(a, b)`](module@crate::assert_f32::assert_f32_eq)
124//! * [`assert_f64_eq!(a, b)`](module@crate::assert_f64::assert_f64_eq)
125//!
126//! Nearness:
127//!
128//! * [`assert_approx_eq!(a, b)`](module@crate::assert_approx::assert_approx_eq)
129//! * [`assert_in_delta!(a, b, delta)`](module@crate::assert_in::assert_in_delta)
130//! * [`assert_in_epsilon!(a, b, epsilon)`](module@crate::assert_in::assert_in_epsilon)
131//! * [`assert_in_range!(a, range)`](module@crate::assert_in::assert_in_range)
132//! * [`assert_diff_eq_x!(a, b, x)`](module@crate::assert_diff::assert_diff_eq_x)
133//! * [`assert_abs_diff_eq_x!(a, b, x)`](module@crate::assert_abs_diff::assert_abs_diff_eq_x)
134//!
135//! Groups:
136//!
137//! * [`assert_all!(group, predicate)`](module@crate::assert_all)
138//! * [`assert_any!(group, predicate)`](module@crate::assert_any)
139//! * [`assert_is_empty!(group)`](module@crate::assert_is_empty::assert_is_empty)
140//! * [`assert_len_eq!(a, b)`](module@crate::assert_len::assert_len_eq)
141//! * [`assert_count_eq!(a, b)`](module@crate::assert_count::assert_count_eq)
142//!
143//! Matching:
144//!
145//! * [`assert_starts_with!(sequence, x)`](module@crate::assert_starts_with)
146//! * [`assert_ends_with!(sequence, x)`](module@crate::assert_ends_with)
147//! * [`assert_contains!(container, x)`](module@crate::assert_contains)
148//! * [`assert_is_match!(matcher, x)`](module@crate::assert_is_match)
149//! * [`assert_matches!(expr, pattern)`](module@crate::assert_matches)
150//! * [`assert_email_address!(string)`](module@crate::assert_email_address)
151//!
152//! Results:
153//!
154//! * [`assert_ok!(result)`](module@crate::assert_ok)
155//! * [`assert_ok_eq_x!(result, x)`](module@crate::assert_ok::assert_ok_eq_x)
156//! * [`assert_ok_ne_x!(result, x)`](module@crate::assert_ok::assert_ok_ne_x)
157//! * [`assert_err!(result)`](module@crate::assert_err)
158//!
159//! Options:
160//!
161//! * [`assert_some!(option)`](module@crate::assert_some)
162//! * [`assert_some_eq_x!(option, x)`](module@crate::assert_some::assert_some_eq_x)
163//! * [`assert_some_ne_x!(option, x)`](module@crate::assert_some::assert_some_ne_x)
164//! * [`assert_none!(option)`](module@crate::assert_none)
165//!
166//! Polls:
167//!
168//! * [`assert_ready!(poll)`](module@crate::assert_ready)
169//! * [`assert_ready_eq_x!(poll, x)`](module@crate::assert_ready::assert_ready_eq_x)
170//! * [`assert_ready_ne_x!(poll, x)`](module@crate::assert_ready::assert_ready_ne_x)
171//! * [`assert_pending!(poll)`](module@crate::assert_pending)
172//!
173//! Iterators:
174//!
175//! * [`assert_iter_eq!(a, b)`](module@crate::assert_iter::assert_iter_eq)
176//! * [`assert_iter_ne!(a, b)`](module@crate::assert_iter::assert_iter_ne)
177//! * [`assert_iter_ge!(a, b)`](module@crate::assert_iter::assert_iter_ge)
178//! * [`assert_iter_gt!(a, b)`](module@crate::assert_iter::assert_iter_gt)
179//! * [`assert_iter_le!(a, b)`](module@crate::assert_iter::assert_iter_le)
180//! * [`assert_iter_lt!(a, b)`](module@crate::assert_iter::assert_iter_lt)
181//!
182//! Sets:
183//!
184//! * [`assert_set_eq!(a, b)`](module@crate::assert_set::assert_set_eq)
185//! * [`assert_set_ne!(a, b)`](module@crate::assert_set::assert_set_ne)
186//! * [`assert_set_subset!(a, b)`](module@crate::assert_set::assert_set_subset)
187//! * [`assert_set_superset!(a, b)`](module@crate::assert_set::assert_set_superset)
188//!
189//! Bags:
190//!
191//! * [`assert_bag_eq!(a, b)`](module@crate::assert_bag::assert_bag_eq)
192//! * [`assert_bag_ne!(a, b)`](module@crate::assert_bag::assert_bag_ne)
193//! * [`assert_bag_subbag!(a, b)`](module@crate::assert_bag::assert_bag_subbag)
194//! * [`assert_bag_superbag!(a, b)`](module@crate::assert_bag::assert_bag_superbag)
195//!
196//! Readers:
197//!
198//! * [`assert_fs_read_to_string_eq_x!(path, x)`](module@crate::assert_fs_read_to_string)
199//! * [`assert_io_read_to_string_eq_x!(reader, x)`](module@crate::assert_io_read_to_string)
200//!
201//! Commands:
202//!
203//! * [`assert_command_stdout_eq_x!(command, x)`](module@crate::assert_command) `// command ⇒ stdout == x`
204//! * [`assert_program_args_stdout_eq_x!(program, args, x)`](module@crate::assert_program_args) `// program.args ⇒ stdout == x`
205//!
206//! Status:
207//!
208//! * [`assert_status_success!(a)`](module@crate::assert_status::assert_status_success)
209//! * [`assert_status_code_value_eq_x!(a, x)`](module@crate::assert_status::assert_status_code_value_eq_x)
210//! * [`assert_status_code_value_ne_x!(a, x)`](module@crate::assert_status::assert_status_code_value_ne_x)
211//! * [`assert_status_failure!(a)`](module@crate::assert_status::assert_status_failure)
212//!
213//! Infix values:
214//!
215//! * [`assert_infix!(a == b)`](module@crate::assert_infix)
216//! * [`assert_infix!(a != b)`](module@crate::assert_infix)
217//! * [`assert_infix!(a < b)`](module@crate::assert_infix)
218//! * [`assert_infix!(a <= b)`](module@crate::assert_infix)
219//! * [`assert_infix!(a > b)`](module@crate::assert_infix)
220//! * [`assert_infix!(a >= b)`](module@crate::assert_infix)
221//!
222//! Infix logic:
223//!
224//! * [`assert_infix!(a & b)`](module@crate::assert_infix)
225//! * [`assert_infix!(a | b)`](module@crate::assert_infix)
226//! * [`assert_infix!(a ^ b)`](module@crate::assert_infix)
227//! * [`assert_infix!(a && b)`](module@crate::assert_infix)
228//! * [`assert_infix!(a || b)`](module@crate::assert_infix)
229//!
230//! For a complete list of modules and macros, see the
231//! [docs](https://docs.rs/assertables/).
232//!
233//! ## Forms
234//!
235//! The Assertables macros have a variety of forms to help you write the tests that matter most to you.
236//!
237//! All the macros have forms for an optional message:
238//!
239//! * [`assert_gt!(a, b)`](module@crate::assert_gt) `// default message`
240//! * [`assert_gt!(a, b, "your text")`](module@crate::assert_gt) `// custom message`
241//!
242//! All the macros have forms for different outcomes:
243//!
244//! * [`assert_gt!(1, 2)`](macro@crate::assert_gt) `// panic`
245//! * [`assert_gt_as_result!(1, 2)`](macro@crate::assert_gt_as_result) `// return Result`
246//! * [`debug_assert_gt!(1, 2)`](macro@crate::debug_assert_gt) `// panic in debug mode`
247//!
248//! Many of the macros have a form "compare left item to right item" that compares
249//! items of the same kind, and a form "compare left item to right expression" that
250//! compares one item to any arbitrary expression:
251//!
252//! * [`assert_len_eq!(a, b)`](module@crate::assert_ok::assert_ok_eq) `// a.len() = b.len()`
253//! * [`assert_len_eq_x!(a, x)`](module@crate::assert_ok::assert_ok_eq_x)) `// a.len() = x`
254//!
255//! Many of the macros has a "success return", which means the macro returns data that you can optionally use for more testing.
256//!
257//! * [`let inner = assert_ok!(result)`](module@crate::assert_ok::assert_ok)
258//! * [`let string = assert_fs_read_to_string_ne!("alfa.txt", "")`](module@crate::assert_fs_read_to_string::assert_fs_read_to_string_ne)
259//! * [`let stdout = assert_command_stdout_gt!("ls", vec![b' '])`](module@crate::assert_command::assert_command_stdout_gt)
260//!
261//! ## Tracking
262//!
263//! * Package: assertables-rust-crate
264//! * Version: 9.8.0
265//! * Created: 2021-03-30T15:47:49Z
266//! * Updated: 2025-06-21T22:20:00Z
267//! * License: MIT or Apache-2.0 or GPL-2.0 or GPL-3.0 or contact us for more
268//! * Contact: Joel Parker Henderson (joel@joelparkerhenderson.com)
269
270// Assert truth
271pub mod assert; // (in addition to what's provided by Rust `std`)
272
273// Assert value comparison
274pub mod assert_eq; // (in addition to what's provided by Rust `std`)
275pub mod assert_ge;
276pub mod assert_gt;
277pub mod assert_le;
278pub mod assert_lt;
279pub mod assert_ne; // (in addition to what's provided by Rust `std`)
280
281// Assert value comparison for floats
282pub mod assert_eq_f32;
283pub mod assert_eq_f64;
284pub mod assert_f32;
285pub mod assert_f64;
286
287// Assert difference
288pub mod assert_abs_diff;
289pub mod assert_approx;
290pub mod assert_diff;
291pub mod assert_in;
292
293// Assert all/any
294pub mod assert_all;
295pub mod assert_any;
296
297// Infix
298pub mod assert_infix;
299
300// Matching
301pub mod assert_contains;
302pub mod assert_count;
303pub mod assert_email_address;
304pub mod assert_ends_with;
305pub mod assert_is_empty;
306pub mod assert_is_match;
307pub mod assert_len;
308pub mod assert_matches;
309pub mod assert_starts_with;
310
311// For Result Ok & Err
312pub mod assert_err;
313pub mod assert_ok;
314pub mod assert_result; // Deprecated
315
316// For Option Some & None
317pub mod assert_none;
318pub mod assert_option;
319pub mod assert_some; // Deprecated
320
321// For Poll Ready & Pending
322pub mod assert_pending;
323pub mod assert_poll;
324pub mod assert_ready; // Deprecated
325
326// For collections
327pub mod assert_bag;
328pub mod assert_iter;
329pub mod assert_set;
330
331// For functions
332pub mod assert_fn;
333pub mod assert_fn_err;
334pub mod assert_fn_ok;
335
336// For reading
337pub mod assert_fs_read_to_string;
338pub mod assert_io_read_to_string;
339
340// For externals
341pub mod assert_command;
342pub mod assert_program_args;
343pub mod assert_status;
344
345// Misc
346pub mod assert_success;