mirror of
https://github.com/ratatui/ratatui.git
synced 2025-09-30 06:21:31 +00:00

Both termion and crossterm backends were not moving the cursor if the first diff to draw was on the second cell. The condition triggering the cursor move has been updated to fix this. In addition, two tests have been added to avoid future regressions.
64 lines
2.0 KiB
Rust
64 lines
2.0 KiB
Rust
#[cfg(feature = "termion")]
|
|
#[test]
|
|
fn backend_termion_should_only_write_diffs() -> Result<(), Box<dyn std::error::Error>> {
|
|
use std::{fmt::Write, io::Cursor};
|
|
|
|
let mut bytes = Vec::new();
|
|
let mut stdout = Cursor::new(&mut bytes);
|
|
{
|
|
use tui::{
|
|
backend::TermionBackend, layout::Rect, widgets::Paragraph, Terminal, TerminalOptions,
|
|
Viewport,
|
|
};
|
|
let backend = TermionBackend::new(&mut stdout);
|
|
let area = Rect::new(0, 0, 3, 1);
|
|
let mut terminal = Terminal::with_options(
|
|
backend,
|
|
TerminalOptions {
|
|
viewport: Viewport::fixed(area),
|
|
},
|
|
)?;
|
|
terminal.draw(|f| {
|
|
f.render_widget(Paragraph::new("a"), area);
|
|
})?;
|
|
terminal.draw(|f| {
|
|
f.render_widget(Paragraph::new("ab"), area);
|
|
})?;
|
|
terminal.draw(|f| {
|
|
f.render_widget(Paragraph::new("abc"), area);
|
|
})?;
|
|
}
|
|
|
|
let expected = {
|
|
use termion::{color, cursor, style};
|
|
let mut s = String::new();
|
|
// First draw
|
|
write!(s, "{}", cursor::Goto(1, 1))?;
|
|
s.push_str("a");
|
|
write!(s, "{}", color::Fg(color::Reset))?;
|
|
write!(s, "{}", color::Bg(color::Reset))?;
|
|
write!(s, "{}", style::Reset)?;
|
|
write!(s, "{}", cursor::Hide)?;
|
|
// Second draw
|
|
write!(s, "{}", cursor::Goto(2, 1))?;
|
|
s.push_str("b");
|
|
write!(s, "{}", color::Fg(color::Reset))?;
|
|
write!(s, "{}", color::Bg(color::Reset))?;
|
|
write!(s, "{}", style::Reset)?;
|
|
write!(s, "{}", cursor::Hide)?;
|
|
// Third draw
|
|
write!(s, "{}", cursor::Goto(3, 1))?;
|
|
s.push_str("c");
|
|
write!(s, "{}", color::Fg(color::Reset))?;
|
|
write!(s, "{}", color::Bg(color::Reset))?;
|
|
write!(s, "{}", style::Reset)?;
|
|
write!(s, "{}", cursor::Hide)?;
|
|
// Terminal drop
|
|
write!(s, "{}", cursor::Show)?;
|
|
s
|
|
};
|
|
assert_eq!(std::str::from_utf8(&bytes)?, expected);
|
|
|
|
Ok(())
|
|
}
|