From f3b64b7f680609dcecc9b018bc1a7af3aa4eab2a Mon Sep 17 00:00:00 2001 From: Chris Laplante Date: Wed, 30 Mar 2022 20:42:19 -0400 Subject: [PATCH] add unit tests and render test for tab handling --- src/style.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/render.rs | 35 ++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/src/style.rs b/src/style.rs index 9147191f..f3fec3b3 100644 --- a/src/style.rs +++ b/src/style.rs @@ -770,4 +770,66 @@ mod tests { style.format_state(&state, &mut buf, WIDTH); assert_eq!(&buf[0], "fghijklmno"); } + + #[test] + fn tab_expansion_basics() { + const WIDTH: u16 = 20; + let pos = Arc::new(AtomicPosition::new()); + let state = ProgressState::new(Some(10), pos); + let mut buf = Vec::new(); + + let mut style = ProgressStyle::default_spinner(); + style.message = "a\ttest".into(); + style.format_state(&state, &mut buf, WIDTH); + assert_eq!(&buf[0], "⠁ a test"); + + style.tab_width = 8; + buf.clear(); + style.format_state(&state, &mut buf, WIDTH); + assert_eq!(&buf[0], "⠁ a test"); + } + + #[test] + fn tab_expansion_wide_msg() { + const WIDTH: u16 = 20; + let pos = Arc::new(AtomicPosition::new()); + let state = ProgressState::new(Some(10), pos); + let mut buf = Vec::new(); + + let mut style = ProgressStyle::with_template("{wide_msg}").unwrap(); + style.message = "abc\tdefghijklmnopqrst".into(); + style.format_state(&state, &mut buf, WIDTH); + assert_eq!(&buf[0], "abc defghijklmnop"); + + buf.clear(); + let mut style = ProgressStyle::with_template("{wide_msg:>}").unwrap(); + style.message = "abc\tdefghijklmnopqrst".into(); + style.format_state(&state, &mut buf, WIDTH); + assert_eq!(&buf[0], " defghijklmnopqrst"); + + buf.clear(); + let mut style = ProgressStyle::with_template("{wide_msg:^}").unwrap(); + style.message = "abc\tdefghijklmnopqrst".into(); + style.format_state(&state, &mut buf, WIDTH); + assert_eq!(&buf[0], "c defghijklmnopqr"); + } + + #[test] + fn tab_expansion_multiple() { + const WIDTH: u16 = 20; + let pos = Arc::new(AtomicPosition::new()); + let state = ProgressState::new(Some(10), pos); + let mut buf = Vec::new(); + + let mut style = ProgressStyle::with_template("\top: {wide_msg}").unwrap(); + style.message = "abc\tdefghijklmnopqrst".into(); + style.format_state(&state, &mut buf, WIDTH); + assert_eq!(&buf[0], " op: abc defgh"); + + buf.clear(); + let mut style = ProgressStyle::with_template("{msg}:\t{wide_bar}").unwrap(); + style.message = "\tOP".into(); + style.format_state(&state, &mut buf, WIDTH); + assert_eq!(&buf[0], " OP: ░░░░░░░░░"); + } } diff --git a/tests/render.rs b/tests/render.rs index c2d5399f..36a733a0 100644 --- a/tests/render.rs +++ b/tests/render.rs @@ -270,3 +270,38 @@ fn ticker_drop() { " doing stuff 0\n doing stuff 1\n doing stuff 2\n doing stuff 3\n doing stuff 4" ); } + +#[test] +fn multi_with_tabs() { + let in_mem = InMemoryTerm::new(10, 80); + let mp = + MultiProgress::with_draw_target(ProgressDrawTarget::term_like(Box::new(in_mem.clone()))); + + let overall_progress = mp.add(ProgressBar::new(10).with_message("overall")); + + let spinner = mp.insert_before( + &overall_progress, + ProgressBar::new_spinner() + .with_finish(ProgressFinish::AndLeave) + .with_message("spinning"), + ); + spinner.tick(); + + assert_eq!(in_mem.contents(), "⠁ spinning"); + assert_eq!(in_mem.cursor_pos(), (0, 80)); + + let msg1 = mp.insert_after( + &spinner, + ProgressBar::new_spinner() + .with_finish(ProgressFinish::AndLeave) + .with_message("\tmessage!"), + ); + + msg1.tick(); + assert_eq!(in_mem.contents(), "⠁ spinning\n⠁ message!"); + // If tabs are being handled correctly, the cursor should be at the end of the last line. + assert_eq!(in_mem.cursor_pos(), (1, 80)); + + overall_progress.inc(1); + assert_eq!(in_mem.contents(), "⠁ spinning\n⠁ message!\n███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 1/10"); +}