diff --git a/CHANGES.md b/CHANGES.md index 8436a4146..0b28539cb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,7 @@ Changes highlights for recent major versions. ## Version 9.0 -* 9.1.0: Add absolute difference macros: `assert_abs_diff*`. +* 9.2.0: Add absolute difference macros: `assert_abs_diff*`. * 9.0.0: Breaking change: many macros now return data upon success. diff --git a/Cargo.toml b/Cargo.toml index 85a3f8dda..490a6cd77 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "assertables" -version = "9.1.0" +version = "9.2.0" authors = ["Joel Parker Henderson "] edition = "2021" description = "Assertables: assert macros for better testing, debugging, quality assurance, and runtime reliability." diff --git a/LICENSE.md b/LICENSE.md index 03d907682..afbc6c2bc 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # License -MIT or Apache or GPL or or BSD or contact us for custom license choices. +License is any of these or contact us for custom license options. * [MIT](https://opensource.org/license/mit) ([SPDX: MIT](https://spdx.org/licenses/MIT.html)) diff --git a/README.md b/README.md index a65197703..27bd09778 100644 --- a/README.md +++ b/README.md @@ -14,165 +14,153 @@ The Assertables Rust crate provides many assert macros that can help you develop, test, and debug. * Test values with - [assert_lt](https://docs.rs/assertables/9.1.0/assertables/assert_lt), - [assert_gt](https://docs.rs/assertables/9.1.0/assertables/assert_gt), - [etc.](https://docs.rs/assertables/) -* Test strings with - [assert_starts_with](https://docs.rs/assertables/9.1.0/assertables/assert_starts_with), - [assert_ends_with](https://docs.rs/assertables/9.1.0/assertables/assert_ends_with), - [etc.](https://docs.rs/assertables/) + [assert_lt](https://docs.rs/assertables/9.2.0/assertables/assert_lt), + [assert_gt](https://docs.rs/assertables/9.2.0/assertables/assert_gt), + [more…](https://docs.rs/assertables/9.2.0/assertables/assert_approx) +* Test results with + [assert_ok](https://docs.rs/assertables/9.2.0/assertables/assert_ok), + [assert_err](https://docs.rs/assertables/9.2.0/assertables/assert_err), + [more…](https://docs.rs/assertables/9.2.0/assertables/assert_ok_eq_x) * Test groups with - [assert_all](https://docs.rs/assertables/9.1.0/assertables/assert_all), - [assert_any](https://docs.rs/assertables/9.1.0/assertables/assert_any), - [etc.](https://docs.rs/assertables/) - -There are many more for - [results](https://docs.rs/assertables/9.1.0/assertables/assert_result), - [options](https://docs.rs/assertables/9.1.0/assertables/assert_option), - [polls](https://docs.rs/assertables/9.1.0/assertables/assert_poll), - [matches](https://docs.rs/assertables/9.1.0/assertables/assert_matches), - [iterators](https://docs.rs/assertables/9.1.0/assertables/assert_iter), - [sets](https://docs.rs/assertables/9.1.0/assertables/assert_set), - [files](https://docs.rs/assertables/9.1.0/assertables/assert_fs_read_to_string), - [bytes](https://docs.rs/assertables/9.1.0/assertables/assert_io_read_to_string), - [commands](https://docs.rs/assertables/9.1.0/assertables/assert_command), - [etc.](https://docs.rs/assertables/) + [assert_all](https://docs.rs/assertables/9.2.0/assertables/assert_all), + [assert_any](https://docs.rs/assertables/9.2.0/assertables/assert_any), + [more…](https://docs.rs/assertables/9.2.0/assertables/assert_iter) +* Many more below. To use this crate, add it to your file `Cargo.toml`: ```toml -assertables = "9.1.0" +assertables = "9.2.0" ``` -Top benefits: +Benefits: -1. You can write better tests to improve reliability and maintainability. -2. You can handle more corner cases without needing to write custom code. -3. You can troubleshoot faster because error messages show specifics. +* You can write better tests to improve reliability and maintainability. +* You can handle more corner cases without needing to write custom code. +* You can troubleshoot faster because error messages show more detail. -Top features: +Features: -1. Easy to use: everything is well-documented with runnable examples. -2. Zero overhead: if you don't use a macro, then it's not compiled. -3. Multiple forms: for debugging, for results, and for success returns. +* Easy to use: everything is well-documented with runnable examples. +* Zero overhead: if you don't use a macro, then it's not compiled. +* Multiple forms: for panic, debug, result return, success return. -Help: +Learning: +[FAQ](https://github.com/SixArm/assertables-rust-crate/tree/main/help/faq), +[examples](https://github.com/SixArm/assertables-rust-crate/blob/main/tests/examples/), +[changes](https://github.com/SixArm/assertables-rust-crate/tree/main/CHANGES.md), +[upgrades](https://github.com/SixArm/assertables-rust-crate/tree/main/help/upgrades/upgrade-from-version-8-to-9), +[docs](https://docs.rs/assertables/). -* [Documentation](https://docs.rs/assertables/) -* [Frequently asked questions](https://github.com/SixArm/assertables-rust-crate/tree/main/help/faq) -* [Examples](https://github.com/SixArm/assertables-rust-crate/blob/main/tests/examples/) -* [Upgrade from version 8 to 9](https://github.com/SixArm/assertables-rust-crate/tree/main/help/upgrades/upgrade-from-version-8-to-9) -* [Comparisons to more_asserts, cool_asserts, assert2, claims, etc.](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons) +Comparisons: +[more_asserts](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/more_asserts), [cool_asserts](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/cool_asserts), +[assert2](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/assert2), +[claims](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/more_asserts), +[etc.](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons) ## Highlights Values: -* [`assert_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_eq) `// a == b` -* [`assert_ne!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_ne) `// a != b` -* [`assert_lt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_lt) `// a < b` -* [`assert_le!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_le) `// a <= b` -* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_gt) `// a > b` -* [`assert_ge!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_ge) `// a >= b` +* [`assert_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_eq) ≈ a = b +* [`assert_ne!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_ne) ≈ a ≠ b +* [`assert_lt!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_lt) ≈ a < b +* [`assert_le!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_le) ≈ a ≤ b +* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_gt) ≈ a > b +* [`assert_ge!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_ge) ≈ a ≥ b -Differences: +Approximations: -* [`assert_approx_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_approx/assert_approx_eq) `// |a-b| <= 1e-6` -* [`assert_abs_diff_eq!(a, b, delta)`](https://docs.rs/assertables/9.1.0/assertables/assert_abs_diff/assert_abs_diff_eq) `// |a-b| == Δ` -* [`assert_in_delta!(a, b, delta)`](https://docs.rs/assertables/9.1.0/assertables/assert_in/assert_in_delta) `// |a-b| <= Δ` -* [`assert_in_epsilon!(a, b, epsilon)`](https://docs.rs/assertables/9.1.0/assertables/assert_in/assert_in_epsilon) `// |a-b| <= ε min(a,b)` +* [`assert_approx_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_approx/assert_approx_eq) ≈ |a-b| ≤ 1e-6 +* [`assert_abs_diff_eq!(a, b, delta)`](https://docs.rs/assertables/9.2.0/assertables/assert_abs_diff/assert_abs_diff_eq) ≈ |a-b| = Δ +* [`assert_in_delta!(a, b, delta)`](https://docs.rs/assertables/9.2.0/assertables/assert_in/assert_in_delta) ≈ |a-b| ≤ Δ +* [`assert_in_epsilon!(a, b, epsilon)`](https://docs.rs/assertables/9.2.0/assertables/assert_in/assert_in_epsilon) ≈ |a-b| ≤ ε min(a,b) -Groups for iterators, chars, etc.: +Groups: -* [`assert_all!(group, predicate)`](https://docs.rs/assertables/9.1.0/assertables/assert_all) `// group.all(predicate)` -* [`assert_any!(group, predicate)`](https://docs.rs/assertables/9.1.0/assertables/assert_any) `// group.any(predicate)` - -Infix for order operators, logic operators, etc.: - -* [`assert_infix!(a == b)`](https://docs.rs/assertables/9.1.0/assertables/assert_infix) `// order: == != < <= > >=` -* [`assert_infix!(a && b)`](https://docs.rs/assertables/9.1.0/assertables/assert_infix) `// logic: && || ^ & |` - -Lengths and counts for strings, vectors, iterators, etc.: - -* [`assert_len_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_len/assert_len_eq) `// a.len() == b.len()` -* [`assert_count_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_count/assert_count_eq) `// a.count() == b.count()` -* [`assert_is_empty!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_is_empty/assert_is_empty) `// a.is_empty()` +* [`assert_all!(group, predicate)`](https://docs.rs/assertables/9.2.0/assertables/assert_all) ≈ group.all(predicate) +* [`assert_any!(group, predicate)`](https://docs.rs/assertables/9.2.0/assertables/assert_any) ≈ group.any(predicate) +* [`assert_is_empty!(group)`](https://docs.rs/assertables/9.2.0/assertables/assert_is_empty/assert_is_empty) ≈ a.is_empty() +* [`assert_len_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_len/assert_len_eq) ≈ a.len() = b.len() +* [`assert_count_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_count/assert_count_eq) ≈ a.count() = b.count() Matching: -* [`assert_starts_with!(whole, part)`](https://docs.rs/assertables/9.1.0/assertables/assert_starts_with) `// whole.starts_with(part)` -* [`assert_ends_with!(whole, part)`](https://docs.rs/assertables/9.1.0/assertables/assert_ends_with) `// whole.ends_with(part)` -* [`assert_contains!(container, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_contains) `// container.contains(x)` -* [`assert_matches!(expr, pattern)`](https://docs.rs/assertables/9.1.0/assertables/assert_matches) `// matches!(expr, pattern)` -* [`assert_is_match!(matcher, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_is_match) `// matcher.is_match(x)` +* [`assert_starts_with!(sequence, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_starts_with) ≈ sequence.starts_with(x) +* [`assert_ends_with!(sequence, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_ends_with) ≈ sequence.ends_with(x) +* [`assert_contains!(container, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_contains) ≈ container.contains(x) +* [`assert_is_match!(matcher, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_is_match) ≈ matcher.is_match(x) +* [`assert_matches!(expr, pattern)`](https://docs.rs/assertables/9.2.0/assertables/assert_matches) ≈ matches!(expr, pattern) Results: -* [`assert_ok!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_ok) `// a is Ok` -* [`assert_ok_eq_x!(a, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_ok/assert_ok_eq_x) `// a is Ok(x)` -* [`assert_err!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_err) `// a is Err` +* [`assert_ok!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_ok) ≈ a is Ok +* [`assert_err!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_err) ≈ a is Err +* [`assert_ok_eq_x!(a, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_ok/assert_ok_eq_x) ≈ (a is Ok ⇒ unwrap) = x Options: -* [`assert_some!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_some) `// a is Some` -* [`assert_some_eq_x!(a, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_some/assert_some_eq_x) `// a is Some(x)` -* [`assert_none!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_none) `// a is None` +* [`assert_some!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_some) ≈ a is Some +* [`assert_none!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_none) ≈ a is None +* [`assert_some_eq_x!(a, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_some/assert_some_eq_x) ≈ (a is Some ⇒ unwrap) = x Polls: -* [`assert_ready!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_ready) `// a is Ready` -* [`assert_ready_eq_x!(a, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_ready/assert_ready__eq_x) `// a is Ready(x)` -* [`assert_pending!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_pending) `// a is Pending` +* [`assert_ready!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_ready) ≈ a is Ready +* [`assert_pending!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_pending) ≈ a is Pending +* [`assert_ready_eq_x!(a, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_ready/assert_ready_eq_x) ≈ (a is Ready ⇒ unwrap) = x Readers: -* [`assert_fs_read_to_string_eq!(a_path, b_path)`](https://docs.rs/assertables/9.1.0/assertables/assert_fs_read_to_string_eq) `// read a_path == read b_path` -* [`assert_io_read_to_string_eq!(a_bytes, b_bytes)`](https://docs.rs/assertables/9.1.0/assertables/assert_io_read_to_string) `// read a_bytes == read b_bytes` +* [`assert_fs_read_to_string_eq!(a_path, b_path)`](https://docs.rs/assertables/9.2.0/assertables/assert_fs_read_to_string_eq) ≈ (a_path ⇒ string) = (b_path ⇒ string) +* [`assert_io_read_to_string_eq!(a_bytes, b_bytes)`](https://docs.rs/assertables/9.2.0/assertables/assert_io_read_to_string) ≈ (a_bytes ⇒ string) = (b_bytes ⇒ string) -Commands: +Collections: -* [`assert_command_stdout_eq!(a_command, b_command)`](https://docs.rs/assertables/9.1.0/assertables/assert_command) `// a_command stdout == b_command stdout` -* [`assert_program_args_stderr_eq!(a_program, a_args, b_program, b_args)`](https://docs.rs/assertables/9.1.0/assertables/assert_program_args) `// a_program a_args stderr == b_program b_args stderr` +* [`assert_iter_eq!(arr1, arr2)`](https://docs.rs/assertables/9.2.0/assertables/assert_iter) ≈ a into iter = b into iter +* [`assert_set_eq!(vec1, vec2)`](https://docs.rs/assertables/9.2.0/assertables/assert_set) ≈ a into set = b into set +* [`assert_bag_eq!(map1, map2)`](https://docs.rs/assertables/9.2.0/assertables/assert_bag) ≈ a into bag = b into bag -Collections: +Infix notation: -* [`assert_iter_eq!(arr1, arr2)`](https://docs.rs/assertables/9.1.0/assertables/assert_iter) `// a into iter == b into iter` -* [`assert_set_eq!(vec1, vec2)`](https://docs.rs/assertables/9.1.0/assertables/assert_set) `// a into set == b into set` -* [`assert_bag_eq!(map1, map2)`](https://docs.rs/assertables/9.1.0/assertables/assert_bag) `// a into bag == b into bag` +* [`assert_infix!(a == b)`](https://docs.rs/assertables/9.2.0/assertables/assert_infix) ≈ order operators == != < <= > >= +* [`assert_infix!(a && b)`](https://docs.rs/assertables/9.2.0/assertables/assert_infix) ≈ logic operators && || ^ & | -For a complete list of modules and macros, see the [docs](https://docs.rs/assertables/) +For a complete list of modules and macros, see the [docs](https://docs.rs/assertables/). ## Forms All the macros have forms for an optional message: -* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_gt.html) `// default message` -* [`assert_gt!(a, b, "your text")`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_gt.html) `// custom message` +* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_gt.html) ≈ default message +* [`assert_gt!(a, b, "your text")`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_gt.html) ≈ custom message All the macros have forms for different outcomes: -* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_gt.html) `// panic` -* [`assert_gt_as_result!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_gt_as_result.html) `// return Result, no panic` -* [`debug_assert_gt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.debug_assert_gt.html) `// special use in debug mode` +* [`assert_gt!(1, 2)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_gt.html) ≈ panic +* [`assert_gt_as_result!(1, 2)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_gt_as_result.html) ≈ Result Err +* [`debug_assert_gt!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/macro.debug_assert_gt.html) ≈ panic in debug mode -Many of the macros have a "solo" form for comparing one item to an expression, and a "pair" form for comparing two items to each other: +Many of the macros have a form "compare left item to right item" that compares +items of the same kind, and a form "compare left item to right expression" that +compares one item to any arbitrary expression: -* [`assert_ok_eq!(a, x)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_ok_eq.html) `// a.unwrap() == x` -* [`assert_ok_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_ok_eq.html) `// a.unwrap() == b.unwrap()` +* [`assert_len_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_ok_eq.html) ≈ a.len() = b.len() +* [`assert_len_eq_x!(a, x)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_ok_eq_x.html) ≈ a.len() = x Many of the macros has a "success return", which means the macro returns data that you can optionally use for more testing. -* [`let inner = assert_ok!(result)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_ok.html) -* [`let string = assert_fs_read_to_string_ne!("alfa.txt", "")`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_fs_read_to_string_ne.html) -* [`let stdout = assert_command_stdout_gt!("ls", vec![b' '])`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_command_stdout_gt.html) +* [`let inner = assert_ok!(result)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_ok.html) +* [`let string = assert_fs_read_to_string_ne!("alfa.txt", "")`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_fs_read_to_string_ne.html) +* [`let stdout = assert_command_stdout_gt!("ls", vec![b' '])`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_command_stdout_gt.html) ## Tracking * Package: assertables-rust-crate -* Version: 9.1.0 +* Version: 9.2.0 * Created: 2021-03-30T15:47:49Z -* Updated: 2024-10-29T20:21:37Z +* Updated: 2024-10-31T11:04:30Z * License: MIT or Apache-2.0 or GPL-2.0 or GPL-3.0 or contact us for more * Contact: Joel Parker Henderson (joel@joelparkerhenderson.com) diff --git a/bin/exit-with-arg b/bin/exit-with-arg new file mode 100755 index 000000000..33fbb86ee --- /dev/null +++ b/bin/exit-with-arg @@ -0,0 +1,2 @@ +#!/bin/sh +exit "$1" diff --git a/doc/lib/all.html b/doc/lib/all.html index 767a9e207..d466d15bd 100644 --- a/doc/lib/all.html +++ b/doc/lib/all.html @@ -1 +1 @@ -List of all items in this crate

List of all items

Macros

\ No newline at end of file +List of all items in this crate

List of all items

Macros

\ No newline at end of file diff --git a/doc/lib/assert_ends_with/assert_ends_with/index.html b/doc/lib/assert_ends_with/assert_ends_with/index.html index 6bdaacd15..1dc737a53 100644 --- a/doc/lib/assert_ends_with/assert_ends_with/index.html +++ b/doc/lib/assert_ends_with/assert_ends_with/index.html @@ -7,12 +7,12 @@

§Example

// String ends with substring? let whole: &str = "alfa"; let part: &str = "fa"; -assert_ends_with!(whole, part); +assert_ends_with!(sequence, x); // Vector ends with element? let whole = vec![1, 2, 3]; let part = [3]; -assert_ends_with!(whole, part); +assert_ends_with!(sequence, x);

§Module macros