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.3"
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, 2);
85//! assert_in_range!(i, 0..2);
86//! ```
87//!
88//! Examples with strings:
89//!
90//! ```rust
91//! # use assertables::*;
92//! # use regex::Regex;
93//! let s = "hello";
94//! assert_starts_with!(s, "h");
95//! assert_is_match!(Regex::new(r"e.*o").unwrap(), s);
96//! ```
97//!
98//! Examples with arrays:
99//!
100//! ```rust
101//! # use assertables::*;
102//! let a = [1, 2, 3];
103//! assert_contains!(a, &2);
104//! assert_all!(a.into_iter(), |i: i32| i < 4);
105//! ```
106//!
107//! ## Highlights
108//!
109//! Values:
110//!
111//! * [`assert_eq!(a, b)`](module@crate::assert_eq)
112//! * [`assert_ne!(a, b)`](module@crate::assert_ne)
113//! * [`assert_ge!(a, b)`](module@crate::assert_ge)
114//! * [`assert_gt!(a, b)`](module@crate::assert_gt)
115//! * [`assert_le!(a, b)`](module@crate::assert_le)
116//! * [`assert_lt!(a, b)`](module@crate::assert_lt)
117//!
118//! Floats:
119//!
120//! * [`assert_f32_eq!(a, b)`](module@crate::assert_f32::assert_f32_eq)
121//! * [`assert_f64_eq!(a, b)`](module@crate::assert_f64::assert_f64_eq)
122//!
123//! Nearness:
124//!
125//! * [`assert_approx_eq!(a, b)`](module@crate::assert_approx::assert_approx_eq)
126//! * [`assert_in_delta!(a, b, delta)`](module@crate::assert_in::assert_in_delta)
127//! * [`assert_in_epsilon!(a, b, epsilon)`](module@crate::assert_in::assert_in_epsilon)
128//! * [`assert_in_range!(a, range)`](module@crate::assert_in::assert_in_range)
129//! * [`assert_diff_eq_x!(a, b, x)`](module@crate::assert_diff::assert_diff_eq_x)
130//! * [`assert_abs_diff_eq_x!(a, b, x)`](module@crate::assert_abs_diff::assert_abs_diff_eq_x)
131//!
132//! Groups:
133//!
134//! * [`assert_all!(group, predicate)`](module@crate::assert_all)
135//! * [`assert_any!(group, predicate)`](module@crate::assert_any)
136//! * [`assert_is_empty!(group)`](module@crate::assert_is_empty::assert_is_empty)
137//! * [`assert_len_eq!(a, b)`](module@crate::assert_len::assert_len_eq)
138//! * [`assert_count_eq!(a, b)`](module@crate::assert_count::assert_count_eq)
139//!
140//! Matching:
141//!
142//! * [`assert_starts_with!(sequence, x)`](module@crate::assert_starts_with)
143//! * [`assert_ends_with!(sequence, x)`](module@crate::assert_ends_with)
144//! * [`assert_contains!(container, x)`](module@crate::assert_contains)
145//! * [`assert_is_match!(matcher, x)`](module@crate::assert_is_match)
146//! * [`assert_matches!(expr, pattern)`](module@crate::assert_matches)
147//! * [`assert_email_address!(string)`](module@crate::assert_email_address)
148//!
149//! Results:
150//!
151//! * [`assert_ok!(result)`](module@crate::assert_ok)
152//! * [`assert_ok_eq_x!(result, x)`](module@crate::assert_ok::assert_ok_eq_x)
153//! * [`assert_ok_ne_x!(result, x)`](module@crate::assert_ok::assert_ok_ne_x)
154//! * [`assert_err!(result)`](module@crate::assert_err)
155//!
156//! Options:
157//!
158//! * [`assert_some!(option)`](module@crate::assert_some)
159//! * [`assert_some_eq_x!(option, x)`](module@crate::assert_some::assert_some_eq_x)
160//! * [`assert_some_ne_x!(option, x)`](module@crate::assert_some::assert_some_ne_x)
161//! * [`assert_none!(option)`](module@crate::assert_none)
162//!
163//! Polls:
164//!
165//! * [`assert_ready!(poll)`](module@crate::assert_ready)
166//! * [`assert_ready_eq_x!(poll, x)`](module@crate::assert_ready::assert_ready_eq_x)
167//! * [`assert_ready_ne_x!(poll, x)`](module@crate::assert_ready::assert_ready_ne_x)
168//! * [`assert_pending!(poll)`](module@crate::assert_pending)
169//!
170//! Iterators:
171//!
172//! * [`assert_iter_eq!(a, b)`](module@crate::assert_iter::assert_iter_eq)
173//! * [`assert_iter_ne!(a, b)`](module@crate::assert_iter::assert_iter_ne)
174//! * [`assert_iter_ge!(a, b)`](module@crate::assert_iter::assert_iter_ge)
175//! * [`assert_iter_gt!(a, b)`](module@crate::assert_iter::assert_iter_gt)
176//! * [`assert_iter_le!(a, b)`](module@crate::assert_iter::assert_iter_le)
177//! * [`assert_iter_lt!(a, b)`](module@crate::assert_iter::assert_iter_lt)
178//!
179//! Sets:
180//!
181//! * [`assert_set_eq!(a, b)`](module@crate::assert_set::assert_set_eq)
182//! * [`assert_set_ne!(a, b)`](module@crate::assert_set::assert_set_ne)
183//! * [`assert_set_subset!(a, b)`](module@crate::assert_set::assert_set_subset)
184//! * [`assert_set_superset!(a, b)`](module@crate::assert_set::assert_set_superset)
185//!
186//! Bags:
187//!
188//! * [`assert_bag_eq!(a, b)`](module@crate::assert_bag::assert_bag_eq)
189//! * [`assert_bag_ne!(a, b)`](module@crate::assert_bag::assert_bag_ne)
190//! * [`assert_bag_subbag!(a, b)`](module@crate::assert_bag::assert_bag_subbag)
191//! * [`assert_bag_superbag!(a, b)`](module@crate::assert_bag::assert_bag_superbag)
192//!
193//! Readers:
194//!
195//! * [`assert_fs_read_to_string_eq_x!(path, x)`](module@crate::assert_fs_read_to_string)
196//! * [`assert_io_read_to_string_eq_x!(reader, x)`](module@crate::assert_io_read_to_string)
197//!
198//! Commands:
199//!
200//! * [`assert_command_stdout_eq_x!(command, x)`](module@crate::assert_command) `// command ⇒ stdout == x`
201//! * [`assert_program_args_stdout_eq_x!(program, args, x)`](module@crate::assert_program_args) `// program.args ⇒ stdout == x`
202//!
203//! Status:
204//!
205//! * [`assert_status_success!(a)`](module@crate::assert_status::assert_status_success)
206//! * [`assert_status_code_value_eq_x!(a, x)`](module@crate::assert_status::assert_status_code_value_eq_x)
207//! * [`assert_status_code_value_ne_x!(a, x)`](module@crate::assert_status::assert_status_code_value_ne_x)
208//! * [`assert_status_failure!(a)`](module@crate::assert_status::assert_status_failure)
209//!
210//! Infix values:
211//!
212//! * [`assert_infix!(a == b)`](module@crate::assert_infix)
213//! * [`assert_infix!(a != b)`](module@crate::assert_infix)
214//! * [`assert_infix!(a < b)`](module@crate::assert_infix)
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//!
219//! Infix logic:
220//!
221//! * [`assert_infix!(a & b)`](module@crate::assert_infix)
222//! * [`assert_infix!(a | b)`](module@crate::assert_infix)
223//! * [`assert_infix!(a ^ b)`](module@crate::assert_infix)
224//! * [`assert_infix!(a && b)`](module@crate::assert_infix)
225//! * [`assert_infix!(a || b)`](module@crate::assert_infix)
226//!
227//! For a complete list of modules and macros, see the
228//! [docs](https://docs.rs/assertables/).
229//!
230//! ## Forms
231//!
232//! The Assertables macros have a variety of forms to help you write the tests that matter most to you.
233//!
234//! All the macros have forms for an optional message:
235//!
236//! * [`assert_gt!(a, b)`](module@crate::assert_gt) `// default message`
237//! * [`assert_gt!(a, b, "your text")`](module@crate::assert_gt) `// custom message`
238//!
239//! All the macros have forms for different outcomes:
240//!
241//! * [`assert_gt!(1, 2)`](macro@crate::assert_gt) `// panic`
242//! * [`assert_gt_as_result!(1, 2)`](macro@crate::assert_gt_as_result) `// return Result`
243//! * [`debug_assert_gt!(1, 2)`](macro@crate::debug_assert_gt) `// panic in debug mode`
244//!
245//! Many of the macros have a form "compare left item to right item" that compares
246//! items of the same kind, and a form "compare left item to right expression" that
247//! compares one item to any arbitrary expression:
248//!
249//! * [`assert_len_eq!(a, b)`](module@crate::assert_ok::assert_ok_eq) `// a.len() = b.len()`
250//! * [`assert_len_eq_x!(a, x)`](module@crate::assert_ok::assert_ok_eq_x)) `// a.len() = x`
251//!
252//! Many of the macros has a "success return", which means the macro returns data that you can optionally use for more testing.
253//!
254//! * [`let inner = assert_ok!(result)`](module@crate::assert_ok::assert_ok)
255//! * [`let string = assert_fs_read_to_string_ne!("alfa.txt", "")`](module@crate::assert_fs_read_to_string::assert_fs_read_to_string_ne)
256//! * [`let stdout = assert_command_stdout_gt!("ls", vec![b' '])`](module@crate::assert_command::assert_command_stdout_gt)
257//!
258//! ## Tracking
259//!
260//! * Package: assertables-rust-crate
261//! * Version: 9.8.3
262//! * Created: 2021-03-30T15:47:49Z
263//! * Updated: 2025-12-16T04:16:24Z
264//! * License: MIT or Apache-2.0 or GPL-2.0 or GPL-3.0 or contact us for more
265//! * Contact: Joel Parker Henderson (joel@joelparkerhenderson.com)
266
267// Assert truth
268pub mod assert; // (in addition to what's provided by Rust `std`)
269
270// Assert value comparison
271pub mod assert_eq; // (in addition to what's provided by Rust `std`)
272pub mod assert_ge;
273pub mod assert_gt;
274pub mod assert_le;
275pub mod assert_lt;
276pub mod assert_ne; // (in addition to what's provided by Rust `std`)
277
278// Assert value comparison for floats
279pub mod assert_eq_f32;
280pub mod assert_eq_f64;
281pub mod assert_f32;
282pub mod assert_f64;
283
284// Assert difference
285pub mod assert_abs_diff;
286pub mod assert_approx;
287pub mod assert_diff;
288pub mod assert_in;
289
290// Assert all/any
291pub mod assert_all;
292pub mod assert_any;
293
294// Infix
295pub mod assert_infix;
296
297// Matching
298pub mod assert_contains;
299pub mod assert_count;
300pub mod assert_email_address;
301pub mod assert_ends_with;
302pub mod assert_is_empty;
303pub mod assert_is_match;
304pub mod assert_len;
305pub mod assert_matches;
306pub mod assert_starts_with;
307
308// For Result Ok & Err
309pub mod assert_err;
310pub mod assert_ok;
311pub mod assert_result; // Deprecated
312
313// For Option Some & None
314pub mod assert_none;
315pub mod assert_option;
316pub mod assert_some; // Deprecated
317
318// For Poll Ready & Pending
319pub mod assert_pending;
320pub mod assert_poll;
321pub mod assert_ready; // Deprecated
322
323// For collections
324pub mod assert_bag;
325pub mod assert_iter;
326pub mod assert_set;
327
328// For functions
329pub mod assert_fn;
330pub mod assert_fn_err;
331pub mod assert_fn_ok;
332
333// For reading
334pub mod assert_fs_read_to_string;
335pub mod assert_io_read_to_string;
336
337// For externals
338pub mod assert_command;
339pub mod assert_program_args;
340pub mod assert_status;
341
342// Misc
343pub mod assert_success;