#testing #assert #assertion #diff

no-std assert_unordered

A direct replacement for assert_eq for unordered collections

10 releases

Uses new Rust 2021

0.3.5 Apr 17, 2022
0.3.4 Apr 17, 2022
0.2.1 Apr 16, 2022
0.1.1 Apr 16, 2022

#107 in Rust patterns

Download history 106/week @ 2022-06-08 25/week @ 2022-06-15 44/week @ 2022-06-22 107/week @ 2022-06-29 194/week @ 2022-07-06 151/week @ 2022-07-13 808/week @ 2022-07-20 1551/week @ 2022-07-27 1678/week @ 2022-08-03 2011/week @ 2022-08-10 8095/week @ 2022-08-17 6251/week @ 2022-08-24 2762/week @ 2022-08-31 3519/week @ 2022-09-07 3508/week @ 2022-09-14 2700/week @ 2022-09-21

12,899 downloads per month
Used in 59 crates (3 directly)

MIT/Apache

37KB
275 lines

assert_unordered

Crate Docs

A direct replacement for assert_eq for unordered collections

This macro is useful for any situation where the ordering of the collection doesn't matter, even if they are always in the same order. This is because the stdlib assert_eq shows the entire collection for both left and right and leaves it up to the user to visually scan for differences. In contrast, this crate only works with collections (types that implement IntoIterator) and therefore can show only the differences (see below for an example of what the output looks like).

NOTE: As of 0.3.2, the output by default is in color similar to pretty_assertions

Usage

NOTE: no-default-features can be used to disable color output (and enable no-std support)

[dev-dependencies]
assert_unordered = "0.3"

Which Macro?

TLDR; - favor assert_eq_unordered_sort unless the trait requirements can't be met

  • assert_eq_unordered
    • Requires only Debug and PartialEq on the elements
    • Collection level equality check, and if unequal, falls back to item by item compare (O(n^2))
  • assert_eq_unordered_sort
    • Requires Debug, Eq and Ord on the elements
    • Collection level equality check, and if unequal, sorts and then compares again, and if still unequal, falls back to item by item compare (O(n^2))

Example

use assert_unordered::assert_eq_unordered;

#[derive(Debug, PartialEq)]
struct MyType(i32);

fn main() {
    let expected = vec![MyType(1), MyType(2), MyType(4), MyType(5)];
    let actual = vec![MyType(2), MyType(0), MyType(4)];

    assert_eq_unordered!(expected, actual);
}

Output:

example_error

License

This project is licensed optionally under either:

Dependencies