Skip to content

Commit 2e0e1ba

Browse files
Nero5023facebook-github-bot
authored andcommitted
Add tests for stdout output in superconsole
Summary: RFC: https://fb.workplace.com/groups/buck2dev/permalink/3976662752621767/ This diff adds tests for previous diff changes Reviewed By: scottcao Differential Revision: D73540242 fbshipit-source-id: 24d5ac72d939c8cc84f36b4c639db4a851239bf3
1 parent e816a30 commit 2e0e1ba

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed

src/superconsole.rs

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ mod tests {
296296
use super::*;
297297
use crate::components::echo::Echo;
298298
use crate::testing::SuperConsoleTestingExt;
299+
use crate::testing::TestOutput;
299300
use crate::testing::frame_contains;
300301
use crate::testing::test_console;
301302

@@ -451,4 +452,139 @@ mod tests {
451452
}
452453
Ok(())
453454
}
455+
456+
#[test]
457+
fn test_emit_aux() -> anyhow::Result<()> {
458+
let mut console = test_console();
459+
460+
let root = Echo(Lines(vec![vec!["state"].try_into()?]));
461+
462+
// Emit auxiliary output
463+
console.emit_aux(Lines(vec![vec!["aux line 1"].try_into()?]));
464+
console.render(&root)?;
465+
466+
// Since we emit aux, we don't output the whole frame once in TestConsole
467+
let frame: Vec<u8> = console
468+
.test_output_mut()?
469+
.frames
470+
.iter()
471+
.flatten()
472+
.copied()
473+
.collect();
474+
475+
assert!(frame_contains(&frame, "state"));
476+
assert!(frame_contains(
477+
&frame,
478+
TestOutput::aux_output_with_prefix("aux line 1"),
479+
));
480+
481+
Ok(())
482+
}
483+
484+
#[test]
485+
fn test_emit_aux_multiple_lines() -> anyhow::Result<()> {
486+
let mut console = test_console();
487+
488+
let root = Echo(Lines(vec![vec!["state"].try_into()?]));
489+
490+
// Emit multiple auxiliary output lines
491+
console.emit_aux(Lines(vec![
492+
vec!["aux line 1"].try_into()?,
493+
vec!["aux line 2"].try_into()?,
494+
vec!["aux line 3"].try_into()?,
495+
]));
496+
console.render(&root)?;
497+
498+
// Since we emit aux, we don't output the whole frame once in TestConsole
499+
let frame: Vec<u8> = console
500+
.test_output_mut()?
501+
.frames
502+
.iter()
503+
.flatten()
504+
.copied()
505+
.collect();
506+
507+
println!("frame: {:?}", String::from_utf8_lossy(&frame));
508+
509+
assert!(frame_contains(&frame, "state"));
510+
assert!(frame_contains(
511+
&frame,
512+
TestOutput::aux_output_with_prefix("aux line 1")
513+
));
514+
// Only the first line of a render of aux output is prefixed
515+
assert!(frame_contains(&frame, "aux line 2"));
516+
assert!(frame_contains(&frame, "aux line 3"));
517+
518+
Ok(())
519+
}
520+
521+
#[test]
522+
fn test_block_aux_lines() -> anyhow::Result<()> {
523+
let mut console = test_console();
524+
525+
let root = Echo(Lines(vec![vec!["state"].try_into()?]));
526+
527+
// Block rendering and emit auxiliary output
528+
console.test_output_mut()?.should_render = false;
529+
console.emit_aux(Lines(vec![vec!["aux line 1"].try_into()?]));
530+
console.render(&root)?;
531+
assert_eq!(console.test_output()?.frames.len(), 0);
532+
533+
// Unblock rendering and check if auxiliary output is rendered
534+
console.test_output_mut()?.should_render = true;
535+
console.emit_aux(Lines(vec![vec!["aux line 2"].try_into()?]));
536+
console.render(&root)?;
537+
538+
// Since we emit aux, we don't output the whole frame once in TestConsole
539+
let frame: Vec<u8> = console
540+
.test_output_mut()?
541+
.frames
542+
.iter()
543+
.flatten()
544+
.copied()
545+
.collect();
546+
547+
assert!(frame_contains(&frame, "state"));
548+
assert!(frame_contains(
549+
&frame,
550+
TestOutput::aux_output_with_prefix("aux line 1")
551+
));
552+
assert!(frame_contains(&frame, "aux line 2"));
553+
554+
Ok(())
555+
}
556+
557+
#[test]
558+
fn test_emit_and_emit_aux() -> anyhow::Result<()> {
559+
let mut console = test_console();
560+
561+
let root = Echo(Lines(vec![vec!["state"].try_into()?]));
562+
563+
// Emit both regular and auxiliary output
564+
console.emit(Lines(vec![vec!["regular line 1"].try_into()?]));
565+
console.emit(Lines(vec![vec!["regular line 2"].try_into()?]));
566+
console.emit_aux(Lines(vec![vec!["aux line 1"].try_into()?]));
567+
console.emit_aux(Lines(vec![vec!["aux line 2"].try_into()?]));
568+
console.render(&root)?;
569+
570+
// Since we emit aux, we don't output the whole frame once in TestConsole
571+
let frame: Vec<u8> = console
572+
.test_output_mut()?
573+
.frames
574+
.iter()
575+
.flatten()
576+
.copied()
577+
.collect();
578+
579+
assert!(frame_contains(&frame, "state"));
580+
assert!(frame_contains(&frame, "regular line 1"));
581+
assert!(frame_contains(&frame, "regular line 2"));
582+
assert!(frame_contains(
583+
&frame,
584+
TestOutput::aux_output_with_prefix("aux line 1")
585+
));
586+
assert!(frame_contains(&frame, "aux line 2"));
587+
588+
Ok(())
589+
}
454590
}

src/testing.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use std::any::Any;
1313
use anyhow::Context as _;
1414

1515
use crate::Dimensions;
16+
use crate::output::OutputTarget;
1617
use crate::output::SuperConsoleOutput;
1718
use crate::superconsole::SuperConsole;
1819

@@ -26,6 +27,16 @@ pub struct TestOutput {
2627
pub frames: Vec<Vec<u8>>,
2728
}
2829

30+
impl TestOutput {
31+
fn aux_prefix() -> &'static str {
32+
"AUX PREFIX: "
33+
}
34+
35+
pub fn aux_output_with_prefix(content: &str) -> String {
36+
format!("{}{}", Self::aux_prefix(), content)
37+
}
38+
}
39+
2940
impl SuperConsoleOutput for TestOutput {
3041
fn should_render(&mut self) -> bool {
3142
self.should_render
@@ -36,6 +47,22 @@ impl SuperConsoleOutput for TestOutput {
3647
Ok(())
3748
}
3849

50+
fn output_to(&mut self, buffer: Vec<u8>, target: OutputTarget) -> anyhow::Result<()> {
51+
match target {
52+
OutputTarget::Main => self.output(buffer),
53+
OutputTarget::Aux => {
54+
let output = Self::aux_prefix()
55+
.as_bytes()
56+
.iter()
57+
.copied()
58+
.chain(buffer.into_iter())
59+
.collect::<Vec<u8>>();
60+
self.frames.push(output);
61+
Ok(())
62+
}
63+
}
64+
}
65+
3966
fn terminal_size(&self) -> anyhow::Result<Dimensions> {
4067
Ok(self.terminal_size)
4168
}

0 commit comments

Comments
 (0)