From f1f35727607168d3c9ca16cd108bd14ccd310f8a Mon Sep 17 00:00:00 2001 From: haraldmaida Date: Sun, 9 Nov 2025 02:23:44 +0100 Subject: [PATCH] doc: add example on how to use a helper function to assert a custom struct --- Cargo.toml | 5 ++ examples/assertion_function.png | Bin 0 -> 24219 bytes examples/assertion_function.rs | 113 ++++++++++++++++++++++++++++++++ src/lib.rs | 7 ++ 4 files changed, 125 insertions(+) create mode 100644 examples/assertion_function.png create mode 100644 examples/assertion_function.rs diff --git a/Cargo.toml b/Cargo.toml index 5003de6..2a96c0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -95,3 +95,8 @@ unwrap_used = "deny" name = "colored_diffs" path = "examples/colored_diffs.rs" required-features = ["colored"] + +[[example]] +name = "assertion_function" +path = "examples/assertion_function.rs" +required-features = ["colored"] diff --git a/examples/assertion_function.png b/examples/assertion_function.png new file mode 100644 index 0000000000000000000000000000000000000000..a792aef3173f5b328304cd77904f813a310e6a98 GIT binary patch literal 24219 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, +} + +/// Helper function for asserting a snake's state. +/// +/// It takes a snake and an expected body and asserts that the snake's +/// length, body, and head are equal to the expected body. +/// +/// It first does assertions on all fields of the snake without panicking so +/// that all found failures are printed at once and not the first one only. +/// +/// The failure messages contain names of the fields like "snake.length", +/// "snake.body" and "snake.head". +#[track_caller] +fn assert_snake_body(snake: &Snake, expected_body: &[Coord]) { + let mut failures = verify_that!(snake) + .with_configured_diff_format() + .extracting(|s| s.length) + .named("snake.length") + .is_equal_to(expected_body.len()) + .display_failures(); + failures.extend( + verify_that!(snake) + .with_configured_diff_format() + .extracting(|s| &s.body) + .named("snake.body") + .contains_exactly(expected_body) + .display_failures(), + ); + failures.extend( + verify_that!(snake) + .with_configured_diff_format() + .extracting(|s| s.head) + .named("snake.head") + .is_equal_to(expected_body[0]) + .display_failures(), + ); + assert!( + failures.is_empty(), + "assertion of snake body failed: \n\n{}", + failures.join("\n") + ); +} + +fn test() { + let snake = Snake { + length: 2, + head: Coord { x: 3, y: 1 }, + body: vec![ + Coord { x: 2, y: 1 }, + Coord { x: 1, y: 2 }, + Coord { x: -1, y: 1 }, + ], + }; + + assert_snake_body( + &snake, + &[ + Coord { x: 2, y: 1 }, + Coord { x: 1, y: 1 }, + Coord { x: 1, y: 2 }, + ], + ); +} + +fn main() { + test(); +} diff --git a/src/lib.rs b/src/lib.rs index 6094171..2fd7bad 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -341,6 +341,13 @@ //! 3. Custom expectations used with the [`Spec::expecting()`] method //! 4. Custom assertions methods //! +//! > 💡 +//! > Often the easiest way to assert a custom type is to write a helper +//! > function that asserts parts (e.g., fields of a struct) using existing +//! > assertions. See the example [`assertion_function.rs`](examples/assertion_function.rs) +//! > which demonstrates how to use a helper function for asserting a custom +//! > struct. +//! //! How to use predicate functions as custom assertions is described on the //! [`Spec::satisfies()`] method and in the [Examples](#predicate-as-custom-assertion) //! chapter above. The other 3 ways are described in the following subchapters.