|
|
|
// use helix_tui::{
|
|
|
|
// backend::TestBackend,
|
|
|
|
// buffer::Buffer,
|
|
|
|
// layout::Alignment,
|
|
|
|
// text::{Span, Spans, Text},
|
|
|
|
// widgets::{Block, Borders, Paragraph, Wrap},
|
|
|
|
// Terminal,
|
|
|
|
// };
|
|
|
|
|
|
|
|
// const SAMPLE_STRING: &str = "The library is based on the principle of immediate rendering with \
|
|
|
|
// intermediate buffers. This means that at each new frame you should build all widgets that are \
|
|
|
|
// supposed to be part of the UI. While providing a great flexibility for rich and \
|
|
|
|
// interactive UI, this may introduce overhead for highly dynamic content.";
|
|
|
|
|
|
|
|
// #[test]
|
|
|
|
// fn widgets_paragraph_can_wrap_its_content() {
|
|
|
|
// let test_case = |alignment, expected| {
|
|
|
|
// let backend = TestBackend::new(20, 10);
|
|
|
|
// let mut terminal = Terminal::new(backend).unwrap();
|
|
|
|
|
|
|
|
// terminal
|
|
|
|
// .draw(|f| {
|
|
|
|
// let size = f.size();
|
|
|
|
// let text = vec![Spans::from(SAMPLE_STRING)];
|
|
|
|
// let paragraph = Paragraph::new(text)
|
|
|
|
// .block(Block::default().borders(Borders::ALL))
|
|
|
|
// .alignment(alignment)
|
|
|
|
// .wrap(Wrap { trim: true });
|
|
|
|
// f.render_widget(paragraph, size);
|
|
|
|
// })
|
|
|
|
// .unwrap();
|
|
|
|
// terminal.backend().assert_buffer(&expected);
|
|
|
|
// };
|
|
|
|
|
|
|
|
// test_case(
|
|
|
|
// Alignment::Left,
|
|
|
|
// Buffer::with_lines(vec![
|
|
|
|
// "┌──────────────────┐",
|
|
|
|
// "│The library is │",
|
|
|
|
// "│based on the │",
|
|
|
|
// "│principle of │",
|
|
|
|
// "│immediate │",
|
|
|
|
// "│rendering with │",
|
|
|
|
// "│intermediate │",
|
|
|
|
// "│buffers. This │",
|
|
|
|
// "│means that at each│",
|
|
|
|
// "└──────────────────┘",
|
|
|
|
// ]),
|
|
|
|
// );
|
|
|
|
// test_case(
|
|
|
|
// Alignment::Right,
|
|
|
|
// Buffer::with_lines(vec![
|
|
|
|
// "┌──────────────────┐",
|
|
|
|
// "│ The library is│",
|
|
|
|
// "│ based on the│",
|
|
|
|
// "│ principle of│",
|
|
|
|
// "│ immediate│",
|
|
|
|
// "│ rendering with│",
|
|
|
|
// "│ intermediate│",
|
|
|
|
// "│ buffers. This│",
|
|
|
|
// "│means that at each│",
|
|
|
|
// "└──────────────────┘",
|
|
|
|
// ]),
|
|
|
|
// );
|
|
|
|
// test_case(
|
|
|
|
// Alignment::Center,
|
|
|
|
// Buffer::with_lines(vec![
|
|
|
|
// "┌──────────────────┐",
|
|
|
|
// "│ The library is │",
|
|
|
|
// "│ based on the │",
|
|
|
|
// "│ principle of │",
|
|
|
|
// "│ immediate │",
|
|
|
|
// "│ rendering with │",
|
|
|
|
// "│ intermediate │",
|
|
|
|
// "│ buffers. This │",
|
|
|
|
// "│means that at each│",
|
|
|
|
// "└──────────────────┘",
|
|
|
|
// ]),
|
|
|
|
// );
|
|
|
|
// }
|
|
|
|
|
|
|
|
// #[test]
|
|
|
|
// fn widgets_paragraph_renders_double_width_graphemes() {
|
|
|
|
// let backend = TestBackend::new(10, 10);
|
|
|
|
// let mut terminal = Terminal::new(backend).unwrap();
|
|
|
|
|
|
|
|
// let s = "コンピュータ上で文字を扱う場合、典型的には文字による通信を行う場合にその両端点では、";
|
|
|
|
// terminal
|
|
|
|
// .draw(|f| {
|
|
|
|
// let size = f.size();
|
|
|
|
// let text = vec![Spans::from(s)];
|
|
|
|
// let paragraph = Paragraph::new(text)
|
|
|
|
// .block(Block::default().borders(Borders::ALL))
|
|
|
|
// .wrap(Wrap { trim: true });
|
|
|
|
// f.render_widget(paragraph, size);
|
|
|
|
// })
|
|
|
|
// .unwrap();
|
|
|
|
|
|
|
|
// let expected = Buffer::with_lines(vec![
|
|
|
|
// "┌────────┐",
|
|
|
|
// "│コンピュ│",
|
|
|
|
// "│ータ上で│",
|
|
|
|
// "│文字を扱│",
|
|
|
|
// "│う場合、│",
|
|
|
|
// "│典型的に│",
|
|
|
|
// "│は文字に│",
|
|
|
|
// "│よる通信│",
|
|
|
|
// "│を行う場│",
|
|
|
|
// "└────────┘",
|
|
|
|
// ]);
|
|
|
|
// terminal.backend().assert_buffer(&expected);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// #[test]
|
|
|
|
// fn widgets_paragraph_renders_mixed_width_graphemes() {
|
|
|
|
// let backend = TestBackend::new(10, 7);
|
|
|
|
// let mut terminal = Terminal::new(backend).unwrap();
|
|
|
|
|
|
|
|
// let s = "aコンピュータ上で文字を扱う場合、";
|
|
|
|
// terminal
|
|
|
|
// .draw(|f| {
|
|
|
|
// let size = f.size();
|
|
|
|
// let text = vec![Spans::from(s)];
|
|
|
|
// let paragraph = Paragraph::new(text)
|
|
|
|
// .block(Block::default().borders(Borders::ALL))
|
|
|
|
// .wrap(Wrap { trim: true });
|
|
|
|
// f.render_widget(paragraph, size);
|
|
|
|
// })
|
|
|
|
// .unwrap();
|
|
|
|
|
|
|
|
// let expected = Buffer::with_lines(vec![
|
|
|
|
// // The internal width is 8 so only 4 slots for double-width characters.
|
|
|
|
// "┌────────┐",
|
|
|
|
// "│aコンピ │", // Here we have 1 latin character so only 3 double-width ones can fit.
|
|
|
|
// "│ュータ上│",
|
|
|
|
// "│で文字を│",
|
|
|
|
// "│扱う場合│",
|
|
|
|
// "│、 │",
|
|
|
|
// "└────────┘",
|
|
|
|
// ]);
|
|
|
|
// terminal.backend().assert_buffer(&expected);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// #[test]
|
|
|
|
// fn widgets_paragraph_can_wrap_with_a_trailing_nbsp() {
|
|
|
|
// let nbsp: &str = "\u{00a0}";
|
|
|
|
// let line = Spans::from(vec![Span::raw("NBSP"), Span::raw(nbsp)]);
|
|
|
|
// let backend = TestBackend::new(20, 3);
|
|
|
|
// let mut terminal = Terminal::new(backend).unwrap();
|
|
|
|
// let expected = Buffer::with_lines(vec![
|
|
|
|
// "┌──────────────────┐",
|
|
|
|
// "│NBSP\u{00a0} │",
|
|
|
|
// "└──────────────────┘",
|
|
|
|
// ]);
|
|
|
|
// terminal
|
|
|
|
// .draw(|f| {
|
|
|
|
// let size = f.size();
|
|
|
|
|
|
|
|
// let paragraph = Paragraph::new(line).block(Block::default().borders(Borders::ALL));
|
|
|
|
// f.render_widget(paragraph, size);
|
|
|
|
// })
|
|
|
|
// .unwrap();
|
|
|
|
// terminal.backend().assert_buffer(&expected);
|
|
|
|
// }
|
|
|
|
// #[test]
|
|
|
|
// fn widgets_paragraph_can_scroll_horizontally() {
|
|
|
|
// let test_case = |alignment, scroll, expected| {
|
|
|
|
// let backend = TestBackend::new(20, 10);
|
|
|
|
// let mut terminal = Terminal::new(backend).unwrap();
|
|
|
|
|
|
|
|
// terminal
|
|
|
|
// .draw(|f| {
|
|
|
|
// let size = f.size();
|
|
|
|
// let text = Text::from(
|
|
|
|
// "段落现在可以水平滚动了!\nParagraph can scroll horizontally!\nShort line",
|
|
|
|
// );
|
|
|
|
// let paragraph = Paragraph::new(text)
|
|
|
|
// .block(Block::default().borders(Borders::ALL))
|
|
|
|
// .alignment(alignment)
|
|
|
|
// .scroll(scroll);
|
|
|
|
// f.render_widget(paragraph, size);
|
|
|
|
// })
|
|
|
|
// .unwrap();
|
|
|
|
// terminal.backend().assert_buffer(&expected);
|
|
|
|
// };
|
|
|
|
|
|
|
|
// test_case(
|
|
|
|
// Alignment::Left,
|
|
|
|
// (0, 7),
|
|
|
|
// Buffer::with_lines(vec![
|
|
|
|
// "┌──────────────────┐",
|
|
|
|
// "│在可以水平滚动了!│",
|
|
|
|
// "│ph can scroll hori│",
|
|
|
|
// "│ine │",
|
|
|
|
// "│ │",
|
|
|
|
// "│ │",
|
|
|
|
// "│ │",
|
|
|
|
// "│ │",
|
|
|
|
// "│ │",
|
|
|
|
// "└──────────────────┘",
|
|
|
|
// ]),
|
|
|
|
// );
|
|
|
|
// // only support Alignment::Left
|
|
|
|
// test_case(
|
|
|
|
// Alignment::Right,
|
|
|
|
// (0, 7),
|
|
|
|
// Buffer::with_lines(vec![
|
|
|
|
// "┌──────────────────┐",
|
|
|
|
// "│段落现在可以水平滚│",
|
|
|
|
// "│Paragraph can scro│",
|
|
|
|
// "│ Short line│",
|
|
|
|
// "│ │",
|
|
|
|
// "│ │",
|
|
|
|
// "│ │",
|
|
|
|
// "│ │",
|
|
|
|
// "│ │",
|
|
|
|
// "└──────────────────┘",
|
|
|
|
// ]),
|
|
|
|
// );
|
|
|
|
// }
|