ratatui/buffer/
assert.rs

1/// Assert that two buffers are equal by comparing their areas and content.
2///
3/// # Panics
4/// When the buffers differ this method panics and displays the differences similar to
5/// `assert_eq!()`.
6#[deprecated = "use assert_eq!(&actual, &expected)"]
7#[macro_export]
8macro_rules! assert_buffer_eq {
9    ($actual_expr:expr, $expected_expr:expr) => {
10        match (&$actual_expr, &$expected_expr) {
11            (actual, expected) => {
12                assert!(
13                    actual.area == expected.area,
14                    "buffer areas not equal\nexpected: {expected:?}\nactual:   {actual:?}",
15                );
16                let nice_diff = expected
17                    .diff(actual)
18                    .into_iter()
19                    .enumerate()
20                    .map(|(i, (x, y, cell))| {
21                        let expected_cell = &expected[(x, y)];
22                        format!("{i}: at ({x}, {y})\n  expected: {expected_cell:?}\n  actual:   {cell:?}")
23                    })
24                    .collect::<Vec<String>>()
25                    .join("\n");
26                assert!(
27                    nice_diff.is_empty(),
28                    "buffer contents not equal\nexpected: {expected:?}\nactual:   {actual:?}\ndiff:\n{nice_diff}",
29                );
30                // shouldn't get here, but this guards against future behavior
31                // that changes equality but not area or content
32                assert_eq!(
33                    actual, expected,
34                    "buffers are not equal in an unexpected way. Please open an issue about this."
35                );
36            }
37        }
38    };
39}
40
41#[allow(deprecated)]
42#[cfg(test)]
43mod tests {
44    use crate::{
45        buffer::Buffer,
46        layout::Rect,
47        style::{Color, Style},
48    };
49
50    #[test]
51    fn assert_buffer_eq_does_not_panic_on_equal_buffers() {
52        let buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
53        let other_buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
54        assert_buffer_eq!(buffer, other_buffer);
55    }
56
57    #[should_panic = "buffer areas not equal"]
58    #[test]
59    fn assert_buffer_eq_panics_on_unequal_area() {
60        let buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
61        let other_buffer = Buffer::empty(Rect::new(0, 0, 6, 1));
62        assert_buffer_eq!(buffer, other_buffer);
63    }
64
65    #[should_panic = "buffer contents not equal"]
66    #[test]
67    fn assert_buffer_eq_panics_on_unequal_style() {
68        let buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
69        let mut other_buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
70        other_buffer.set_string(0, 0, " ", Style::default().fg(Color::Red));
71        assert_buffer_eq!(buffer, other_buffer);
72    }
73}