ratatui_core/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                        ::alloc::format!("{i}: at ({x}, {y})\n  expected: {expected_cell:?}\n  actual:   {cell:?}")
23                    })
24                    .collect::<::alloc::vec::Vec<::alloc::string::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#[expect(deprecated)]
42#[cfg(test)]
43mod tests {
44    use crate::buffer::Buffer;
45    use crate::layout::Rect;
46    use crate::style::{Color, Style};
47
48    #[test]
49    fn assert_buffer_eq_does_not_panic_on_equal_buffers() {
50        let buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
51        let other_buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
52        assert_buffer_eq!(buffer, other_buffer);
53    }
54
55    #[should_panic = "buffer areas not equal"]
56    #[test]
57    fn assert_buffer_eq_panics_on_unequal_area() {
58        let buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
59        let other_buffer = Buffer::empty(Rect::new(0, 0, 6, 1));
60        assert_buffer_eq!(buffer, other_buffer);
61    }
62
63    #[should_panic = "buffer contents not equal"]
64    #[test]
65    fn assert_buffer_eq_panics_on_unequal_style() {
66        let buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
67        let mut other_buffer = Buffer::empty(Rect::new(0, 0, 5, 1));
68        other_buffer.set_string(0, 0, " ", Style::default().fg(Color::Red));
69        assert_buffer_eq!(buffer, other_buffer);
70    }
71}