diff --git a/tests/render.rs b/tests/render.rs index f6ca2e6d..45416a5b 100644 --- a/tests/render.rs +++ b/tests/render.rs @@ -60,6 +60,84 @@ fn progress_bar_builder_method_order() { ); } +#[test] +fn multi_progress_single_bar_and_leave() { + let in_mem = InMemoryTerm::new(10, 80); + let mp = + MultiProgress::with_draw_target(ProgressDrawTarget::term_like(Box::new(in_mem.clone()))); + + let pb1 = mp.add(ProgressBar::new(10).with_finish(ProgressFinish::AndLeave)); + + assert_eq!(in_mem.contents(), String::new()); + + pb1.tick(); + assert_eq!( + in_mem.contents(), + r#"░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/10"# + ); + + drop(pb1); + assert_eq!( + in_mem.contents(), + r#"██████████████████████████████████████████████████████████████████████████ 10/10"# + ); +} + +#[test] +fn multi_progress_single_bar_and_clear() { + let in_mem = InMemoryTerm::new(10, 80); + let mp = + MultiProgress::with_draw_target(ProgressDrawTarget::term_like(Box::new(in_mem.clone()))); + + let pb1 = mp.add(ProgressBar::new(10)); + + assert_eq!(in_mem.contents(), String::new()); + + pb1.tick(); + assert_eq!( + in_mem.contents(), + r#"░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/10"# + ); + + drop(pb1); + assert_eq!(in_mem.contents(), ""); +} +#[test] +fn multi_progress_two_bars() { + let in_mem = InMemoryTerm::new(10, 80); + let mp = + MultiProgress::with_draw_target(ProgressDrawTarget::term_like(Box::new(in_mem.clone()))); + + let pb1 = mp.add(ProgressBar::new(10).with_finish(ProgressFinish::AndLeave)); + let pb2 = mp.add(ProgressBar::new(5)); + + assert_eq!(in_mem.contents(), String::new()); + + pb1.tick(); + assert_eq!( + in_mem.contents(), + r#"░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/10"# + ); + + pb2.tick(); + + assert_eq!( + in_mem.contents(), + r#" +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/10 +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/5"# + .trim_start() + ); + + drop(pb1); + drop(pb2); + + assert_eq!( + in_mem.contents(), + r#"██████████████████████████████████████████████████████████████████████████ 10/10"# + ); +} + #[test] fn multi_progress() { let in_mem = InMemoryTerm::new(10, 80); @@ -293,3 +371,166 @@ fn manually_inc_ticker() { spinner.set_prefix("prefix"); assert_eq!(in_mem.contents(), "⠉ new message"); } + +#[test] +fn multi_progress_prune_zombies() { + let in_mem = InMemoryTerm::new(10, 80); + let mp = + MultiProgress::with_draw_target(ProgressDrawTarget::term_like(Box::new(in_mem.clone()))); + + let pb0 = mp + .add(ProgressBar::new(10)) + .with_finish(ProgressFinish::AndLeave); + let pb1 = mp.add(ProgressBar::new(15)); + pb0.tick(); + assert_eq!( + in_mem.contents(), + "░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/10" + ); + + pb0.inc(1); + assert_eq!( + in_mem.contents(), + "███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 1/10" + ); + + drop(pb0); + + // Clear the screen + in_mem.reset(); + + // Write a line that we expect to remain. This helps ensure the adjustment to last_line_count is + // working as expected, and `MultiState` isn't erasing lines when it shouldn't. + in_mem.write_line("don't erase me plz").unwrap(); + + // pb0 is dead, so only pb1 should be drawn from now on + pb1.tick(); + assert_eq!( + in_mem.contents(), + "don't erase me plz\n░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/15" + ); +} + +#[test] +fn multi_progress_prune_zombies_2() { + let in_mem = InMemoryTerm::new(10, 80); + let mp = + MultiProgress::with_draw_target(ProgressDrawTarget::term_like(Box::new(in_mem.clone()))); + + let pb1 = mp.add(ProgressBar::new(10).with_finish(ProgressFinish::AndLeave)); + let pb2 = mp.add(ProgressBar::new(5)); + let pb3 = mp + .add(ProgressBar::new(100)) + .with_finish(ProgressFinish::Abandon); + let pb4 = mp + .add(ProgressBar::new(500)) + .with_finish(ProgressFinish::AndLeave); + let pb5 = mp.add(ProgressBar::new(7)); + + assert_eq!(in_mem.contents(), String::new()); + + pb1.tick(); + assert_eq!( + in_mem.contents(), + r#"░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/10"# + ); + + pb2.tick(); + + assert_eq!( + in_mem.contents(), + r#" +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/10 +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/5"# + .trim_start() + ); + + pb3.tick(); + assert_eq!( + in_mem.contents(), + r#" +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/10 +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/5 +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/100"# + .trim_start() + ); + + drop(pb1); + drop(pb2); + drop(pb3); + + assert_eq!( + in_mem.contents(), + r#" +██████████████████████████████████████████████████████████████████████████ 10/10 +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/100"# + .trim_start() + ); + + in_mem.reset(); + + // Another sacrificial line we expect shouldn't be touched + in_mem.write_line("don't erase plz").unwrap(); + + mp.println("Test friend :)").unwrap(); + assert_eq!( + in_mem.contents(), + r#" +don't erase plz +Test friend :)"# + .trim_start() + ); + + pb4.tick(); + assert_eq!( + in_mem.contents(), + r#" +don't erase plz +Test friend :) +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/500"# + .trim_start() + ); + + drop(pb4); + + in_mem.reset(); + pb5.tick(); + assert_eq!( + in_mem.contents(), + "░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/7" + ); + + mp.println("not your friend, buddy").unwrap(); + assert_eq!( + in_mem.contents(), + r#" +not your friend, buddy +░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0/7"# + .trim_start() + ); + + pb5.inc(1); + assert_eq!( + in_mem.contents(), + r#" +not your friend, buddy +██████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 1/7"# + .trim_start() + ); + + in_mem.reset(); + in_mem.write_line("don't erase me either").unwrap(); + + pb5.inc(1); + assert_eq!( + in_mem.contents(), + r#" +don't erase me either +█████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 2/7"# + .trim_start() + ); + + drop(pb5); + + assert_eq!(in_mem.contents(), "don't erase me either"); +}