use strip_ansi_escapes::strip;
use super::*;
use std::{
io::{Result, Write},
sync::Arc,
};
#[derive(Clone)]
pub struct StdoutMock {
pub buffer: Arc<StdMutex<Vec<u8>>>,
}
impl Default for StdoutMock {
fn default() -> Self {
Self {
buffer: Arc::new(StdMutex::new(Vec::new())),
}
}
}
impl StdoutMock {
pub fn get_copy_of_buffer(&self) -> Vec<u8> {
self.buffer.lock().unwrap().clone()
}
pub fn get_copy_of_buffer_as_string(&self) -> String {
let buffer_data = self.buffer.lock().unwrap();
String::from_utf8(buffer_data.to_vec()).expect("utf8")
}
pub fn get_copy_of_buffer_as_string_strip_ansi(&self) -> String {
let buffer_data = self.buffer.lock().unwrap();
let buffer_data = strip(buffer_data.to_vec());
String::from_utf8(buffer_data).expect("utf8")
}
}
impl Write for StdoutMock {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
self.buffer.lock().unwrap().extend_from_slice(buf);
Ok(buf.len())
}
fn flush(&mut self) -> Result<()> {
Ok(())
}
}
#[tokio::test]
async fn test_stdout_mock_no_strip_ansi() {
let mut stdout_mock = StdoutMock::default();
let stdout_mock_clone = stdout_mock.clone();
let normal_text = "hello world";
stdout_mock.write_all(normal_text.as_bytes()).unwrap();
stdout_mock.flush().unwrap();
pretty_assertions::assert_eq!(stdout_mock.get_copy_of_buffer_as_string(), normal_text);
pretty_assertions::assert_eq!(
stdout_mock_clone.get_copy_of_buffer_as_string(),
normal_text
);
}
#[tokio::test]
async fn test_stdout_mock_strip_ansi() {
let mut stdout_mock = StdoutMock::default();
let stdout_mock_clone = stdout_mock.clone();
let normal_text = "hello world";
let red_text = format!("\x1b[31m{}\x1b[0m", normal_text);
stdout_mock.write_all(red_text.as_bytes()).unwrap();
stdout_mock.flush().unwrap();
pretty_assertions::assert_eq!(
stdout_mock.get_copy_of_buffer_as_string_strip_ansi(),
normal_text
);
pretty_assertions::assert_eq!(
stdout_mock_clone.get_copy_of_buffer_as_string_strip_ansi(),
normal_text
);
}