Skip to content

Commit

Permalink
Start testing #271
Browse files Browse the repository at this point in the history
  • Loading branch information
osa1 committed Dec 5, 2020
1 parent 4d96617 commit 6fdb95e
Show file tree
Hide file tree
Showing 5 changed files with 232 additions and 141 deletions.
1 change: 1 addition & 0 deletions libtiny_tui/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ mod notifier;
mod statusline;
mod tab;
mod termbox;
pub mod test_utils;
#[doc(hidden)]
pub mod trie; // Public for benchmarks
pub mod tui; // Public for benchmarks
Expand Down
70 changes: 70 additions & 0 deletions libtiny_tui/src/test_utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
use std::panic::Location;

use termbox_simple::CellBuf;

pub fn buffer_str(buf: &CellBuf, w: u16, h: u16) -> String {
let w = usize::from(w);
let h = usize::from(h);

let mut ret = String::with_capacity(w * h);

for y in 0..h {
for x in 0..w {
let ch = buf.cells[(y * w) + x].ch;
ret.push(ch);
}
if y != h - 1 {
ret.push('\n');
}
}

ret
}

pub fn expect_screen(
screen: &str,
front_buffer: &CellBuf,
w: u16,
h: u16,
caller: &'static Location<'static>,
) {
let mut screen_filtered = String::with_capacity(screen.len());

let mut in_screen = false;
for c in screen.chars() {
if in_screen {
if c == '|' {
screen_filtered.push('\n');
in_screen = false;
} else {
screen_filtered.push(c);
}
} else if c == '|' {
in_screen = true;
}
}
let _ = screen_filtered.pop(); // pop the last '\n'

let found = buffer_str(front_buffer, w, h);

let mut line = String::new();
for _ in 0..w {
line.push('-');
}

if screen_filtered != found {
panic!(
"Unexpected screen\n\
Expected:\n\
{}\n\
{}\n\
{}\n\
Found:\n\
{}\n\
{}\n\
{}\n\
Called by: {}\n",
line, screen_filtered, line, line, found, line, caller
);
}
}
103 changes: 21 additions & 82 deletions libtiny_tui/src/tests/mod.rs
Original file line number Diff line number Diff line change
@@ -1,75 +1,14 @@
use crate::tui::TUI;

use crate::test_utils::expect_screen;
use libtiny_common::ChanNameRef;
use libtiny_ui::*;
use term_input::{Event, Key};
use termbox_simple::CellBuf;

use std::fs::File;
use std::io::{BufRead, BufReader};
use std::panic::Location;

fn buffer_str(buf: &CellBuf, w: u16, h: u16) -> String {
let w = usize::from(w);
let h = usize::from(h);

let mut ret = String::with_capacity(w * h);

for y in 0..h {
for x in 0..w {
let ch = buf.cells[(y * w) + x].ch;
ret.push(ch);
}
if y != h - 1 {
ret.push('\n');
}
}

ret
}

fn expect_screen(screen: &str, tui: &TUI, w: u16, h: u16, caller: &'static Location<'static>) {
let mut screen_filtered = String::with_capacity(screen.len());

let mut in_screen = false;
for c in screen.chars() {
if in_screen {
if c == '|' {
screen_filtered.push('\n');
in_screen = false;
} else {
screen_filtered.push(c);
}
} else if c == '|' {
in_screen = true;
}
}
let _ = screen_filtered.pop(); // pop the last '\n'

let found = buffer_str(&tui.get_front_buffer(), w, h);

let mut line = String::new();
for _ in 0..w {
line.push('-');
}

if screen_filtered != found {
panic!(
"Unexpected screen\n\
Expected:\n\
{}\n\
{}\n\
{}\n\
Found:\n\
{}\n\
{}\n\
{}\n\
Called by: {}\n",
line, screen_filtered, line, line, found, line, caller
);
}
}

fn enter_string(tui: &mut TUI, s: &str) {
for c in s.chars() {
tui.handle_input_event(Event::Key(Key::Char(c)), &mut None);
Expand All @@ -87,7 +26,7 @@ fn init_screen() {
|will be listed here.|
| |
|mentions |";
expect_screen(screen, &tui, 20, 4, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 20, 4, Location::caller());
}

#[test]
Expand All @@ -106,7 +45,7 @@ fn close_rightmost_tab() {
| |
| |
|< irc.server_2.org |";
expect_screen(screen, &tui, 20, 4, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 20, 4, Location::caller());

// Should scroll left when the server tab is closed. Left arrow should still be visible as
// there are still tabs to the left.
Expand All @@ -119,7 +58,7 @@ fn close_rightmost_tab() {
| |
| |
|< irc.server_1.org |";
expect_screen(screen, &tui, 20, 4, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 20, 4, Location::caller());

// Scroll left again, left arrow should disappear this time.
tui.close_server_tab("irc.server_1.org");
Expand All @@ -131,7 +70,7 @@ fn close_rightmost_tab() {
|will be listed here.|
| |
|mentions |";
expect_screen(screen, &tui, 20, 4, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 20, 4, Location::caller());
}

#[test]
Expand All @@ -158,7 +97,7 @@ fn small_screen_1() {
|osa1: |
|< #chan |";

expect_screen(screen, &tui, 21, 3, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 21, 3, Location::caller());

tui.set_size(24, 3);
tui.draw();
Expand All @@ -169,7 +108,7 @@ fn small_screen_1() {
|osa1: |
|< irc.server_1.org #chan|";

expect_screen(screen, &tui, 24, 3, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 24, 3, Location::caller());

tui.set_size(31, 3);
tui.draw();
Expand All @@ -180,7 +119,7 @@ fn small_screen_1() {
|osa1: |
|mentions irc.server_1.org #chan|";

expect_screen(screen, &tui, 31, 3, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 31, 3, Location::caller());
}

#[test]
Expand All @@ -206,7 +145,7 @@ fn small_screen_2() {
|00:00 Blah blah blah-|
|osa1: |
|< #chan |";
expect_screen(screen, &tui, 21, 4, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 21, 4, Location::caller());

tui.add_nick("123456", Some(ts), &target);
tui.draw();
Expand All @@ -217,7 +156,7 @@ fn small_screen_2() {
|+123456 |
|osa1: |
|< #chan |";
expect_screen(screen, &tui, 21, 4, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 21, 4, Location::caller());
}

#[test]
Expand All @@ -240,7 +179,7 @@ fn ctrl_w() {
"| |
|osa1: dkf aslkdfj aslkdfj asf |
|< irc.server_1.org #chan |";
expect_screen(screen, &tui, 30, 3, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 30, 3, Location::caller());

tui.handle_input_event(Event::Key(Key::Ctrl('w')), &mut None);
tui.draw();
Expand All @@ -251,7 +190,7 @@ fn ctrl_w() {
|osa1: asldkf aslkdfj aslkdfj |
|< irc.server_1.org #chan |";

expect_screen(screen, &tui, 30, 3, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 30, 3, Location::caller());

println!("~~~~~~~~~~~~~~~~~~~~~~");
tui.handle_input_event(Event::Key(Key::Ctrl('w')), &mut None);
Expand All @@ -273,7 +212,7 @@ fn ctrl_w() {
|osa1: asldkf asldkf aslkdfj |
|< irc.server_1.org #chan |";

expect_screen(screen, &tui, 30, 3, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 30, 3, Location::caller());

tui.handle_input_event(Event::Key(Key::Ctrl('w')), &mut None);
tui.draw();
Expand All @@ -284,7 +223,7 @@ fn ctrl_w() {
|osa1: alskdfj asldkf asldkf |
|< irc.server_1.org #chan |";

expect_screen(screen, &tui, 30, 3, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 30, 3, Location::caller());
}

// Tests text field wrapping (text_field_wrap setting)
Expand Down Expand Up @@ -327,7 +266,7 @@ fn test_text_field_wrap() {
|bbbbb |
|mentions chat.freenode.net |";

expect_screen(screen, &tui, 40, 8, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 40, 8, Location::caller());

// Test resizing
tui.set_size(46, 8);
Expand All @@ -344,7 +283,7 @@ fn test_text_field_wrap() {
|x: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbb |
|mentions chat.freenode.net |";

expect_screen(screen, &tui, 46, 8, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 46, 8, Location::caller());

// Reset size
tui.set_size(40, 8);
Expand All @@ -369,7 +308,7 @@ fn test_text_field_wrap() {
|x: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
|mentions chat.freenode.net |";

expect_screen(screen, &tui, 40, 8, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 40, 8, Location::caller());

// On making screen smaller we should fall back to scrolling
tui.set_size(30, 8);
Expand All @@ -390,7 +329,7 @@ fn test_text_field_wrap() {
|x: aaaaaaaaaaaaaaaaaaaaabbbbb |
|mentions chat.freenode.net |";

expect_screen(screen, &tui, 30, 8, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 30, 8, Location::caller());

tui.set_size(40, 8);
tui.draw();
Expand All @@ -406,7 +345,7 @@ fn test_text_field_wrap() {
|bbbb |
|mentions chat.freenode.net |";

expect_screen(screen, &tui, 40, 8, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 40, 8, Location::caller());

// Wrapping on words - splits lines on whitespace
for _ in 0..6 {
Expand Down Expand Up @@ -436,7 +375,7 @@ fn test_text_field_wrap() {
|bbbbb |
|mentions chat.freenode.net |";

expect_screen(screen, &tui, 40, 8, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 40, 8, Location::caller());

// TODO: Test changing nick (osa: I don't understand how nick length is taken into account when
// falling back to scrolling)
Expand Down Expand Up @@ -467,7 +406,7 @@ fn test_join_part_overflow() {
|osa1: |
|< #chan |";

expect_screen(screen, &tui, 21, 4, Location::caller());
expect_screen(screen, &tui.get_front_buffer(), 21, 4, Location::caller());
}

#[test]
Expand Down
2 changes: 1 addition & 1 deletion libtiny_tui/src/tui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ impl TUI {

/// Create a test instance. Does not render to the screen, just updates the termbox buffer.
/// Useful for testing rendering. See also [`get_front_buffer`](TUI::get_front_buffer).
pub(crate) fn new_test(w: u16, h: u16) -> TUI {
pub fn new_test(w: u16, h: u16) -> TUI {
let tb = Termbox::init_test(w, h);
TUI::new_tb(None, tb)
}
Expand Down
Loading

0 comments on commit 6fdb95e

Please sign in to comment.