pub struct MockTty { /* private fields */ }Expand description
Mock TTY backend that captures output and tracks terminal state.
This struct allows testing terminal applications without a real TTY by:
- Capturing all output (including ANSI escape sequences)
- Tracking terminal state (raw mode, alternate screen, etc.)
- Providing mock events for input simulation
Implementations§
Source§impl MockTty
impl MockTty
Sourcepub fn with_events(self, events: Vec<Event>) -> Self
pub fn with_events(self, events: Vec<Event>) -> Self
Queue events to be returned by read_event().
Sourcepub fn with_polls(self, polls: Vec<bool>) -> Self
pub fn with_polls(self, polls: Vec<bool>) -> Self
Queue poll results to be returned by poll().
Sourcepub fn set_size(&mut self, width: u16, height: u16)
pub fn set_size(&mut self, width: u16, height: u16)
Set the terminal size (for resize simulation).
Sourcepub fn is_raw_mode(&self) -> bool
pub fn is_raw_mode(&self) -> bool
Check if raw mode is enabled.
Sourcepub fn enable_raw_mode(&mut self)
pub fn enable_raw_mode(&mut self)
Enable raw mode.
Sourcepub fn disable_raw_mode(&mut self)
pub fn disable_raw_mode(&mut self)
Disable raw mode.
Sourcepub fn is_alternate_screen(&self) -> bool
pub fn is_alternate_screen(&self) -> bool
Check if alternate screen is active.
Sourcepub fn enter_alternate_screen(&mut self)
pub fn enter_alternate_screen(&mut self)
Enter alternate screen.
Sourcepub fn leave_alternate_screen(&mut self)
pub fn leave_alternate_screen(&mut self)
Leave alternate screen.
Sourcepub fn is_cursor_visible(&self) -> bool
pub fn is_cursor_visible(&self) -> bool
Check if cursor is visible.
Sourcepub fn hide_cursor(&mut self)
pub fn hide_cursor(&mut self)
Hide cursor.
Sourcepub fn show_cursor(&mut self)
pub fn show_cursor(&mut self)
Show cursor.
Sourcepub fn is_mouse_captured(&self) -> bool
pub fn is_mouse_captured(&self) -> bool
Check if mouse capture is enabled.
Sourcepub fn enable_mouse_capture(&mut self)
pub fn enable_mouse_capture(&mut self)
Enable mouse capture.
Sourcepub fn disable_mouse_capture(&mut self)
pub fn disable_mouse_capture(&mut self)
Disable mouse capture.
Sourcepub fn read_event(&mut self) -> Result<Event>
pub fn read_event(&mut self) -> Result<Event>
Read the next event.
Sourcepub fn output_str(&self) -> String
pub fn output_str(&self) -> String
Get the captured output as a string (lossy UTF-8 conversion).
Sourcepub fn clear_output(&mut self)
pub fn clear_output(&mut self)
Clear the captured output.
Sourcepub fn output_contains(&self, needle: &[u8]) -> bool
pub fn output_contains(&self, needle: &[u8]) -> bool
Check if the output contains a specific byte sequence. Returns false for empty needle (consistent with windows(0) behavior).
Sourcepub fn output_contains_str(&self, needle: &str) -> bool
pub fn output_contains_str(&self, needle: &str) -> bool
Check if the output contains a specific string.
Sourcepub fn contains_escape(&self, seq: &str) -> bool
pub fn contains_escape(&self, seq: &str) -> bool
Check if the output contains an ANSI escape sequence.
Sourcepub fn parsed_commands(&self) -> Vec<AnsiCommand>
pub fn parsed_commands(&self) -> Vec<AnsiCommand>
Parse output into ANSI commands.
Sourcepub fn queued_events(&self) -> usize
pub fn queued_events(&self) -> usize
Get the number of queued events.
Sourcepub fn push_event(&mut self, event: Event)
pub fn push_event(&mut self, event: Event)
Add an event to the queue.
Trait Implementations§
Source§impl Write for MockTty
impl Write for MockTty
Source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
Source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
Source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector)1.0.0 · Source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
Source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
write_all_vectored)Auto Trait Implementations§
impl Freeze for MockTty
impl RefUnwindSafe for MockTty
impl Send for MockTty
impl Sync for MockTty
impl Unpin for MockTty
impl UnsafeUnpin for MockTty
impl UnwindSafe for MockTty
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ExecutableCommand for T
impl<T> ExecutableCommand for T
Source§fn execute(&mut self, command: impl Command) -> Result<&mut T, Error>
fn execute(&mut self, command: impl Command) -> Result<&mut T, Error>
Executes the given command directly.
The given command its ANSI escape code will be written and flushed onto Self.
§Arguments
-
The command that you want to execute directly.
§Example
use std::io;
use crossterm::{ExecutableCommand, style::Print};
fn main() -> io::Result<()> {
// will be executed directly
io::stdout()
.execute(Print("sum:\n".to_string()))?
.execute(Print(format!("1 + 1= {} ", 1 + 1)))?;
Ok(())
// ==== Output ====
// sum:
// 1 + 1 = 2
}Have a look over at the Command API for more details.
§Notes
- In the case of UNIX and Windows 10, ANSI codes are written to the given ‘writer’.
- In case of Windows versions lower than 10, a direct WinAPI call will be made.
The reason for this is that Windows versions lower than 10 do not support ANSI codes,
and can therefore not be written to the given
writer. Therefore, there is no difference between execute and queue for those old Windows versions.
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> QueueableCommand for T
impl<T> QueueableCommand for T
Source§fn queue(&mut self, command: impl Command) -> Result<&mut T, Error>
fn queue(&mut self, command: impl Command) -> Result<&mut T, Error>
Queues the given command for further execution.
Queued commands will be executed in the following cases:
- When
flushis called manually on the given type implementingio::Write. - The terminal will
flushautomatically if the buffer is full. - Each line is flushed in case of
stdout, because it is line buffered.
§Arguments
-
The command that you want to queue for later execution.
§Examples
use std::io::{self, Write};
use crossterm::{QueueableCommand, style::Print};
fn main() -> io::Result<()> {
let mut stdout = io::stdout();
// `Print` will executed executed when `flush` is called.
stdout
.queue(Print("foo 1\n".to_string()))?
.queue(Print("foo 2".to_string()))?;
// some other code (no execution happening here) ...
// when calling `flush` on `stdout`, all commands will be written to the stdout and therefore executed.
stdout.flush()?;
Ok(())
// ==== Output ====
// foo 1
// foo 2
}Have a look over at the Command API for more details.
§Notes
- In the case of UNIX and Windows 10, ANSI codes are written to the given ‘writer’.
- In case of Windows versions lower than 10, a direct WinAPI call will be made.
The reason for this is that Windows versions lower than 10 do not support ANSI codes,
and can therefore not be written to the given
writer. Therefore, there is no difference between execute and queue for those old Windows versions.
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<W> SynchronizedUpdate for W
impl<W> SynchronizedUpdate for W
Source§fn sync_update<T>(
&mut self,
operations: impl FnOnce(&mut W) -> T,
) -> Result<T, Error>
fn sync_update<T>( &mut self, operations: impl FnOnce(&mut W) -> T, ) -> Result<T, Error>
Performs a set of actions within a synchronous update.
Updates will be suspended in the terminal, the function will be executed against self, updates will be resumed, and a flush will be performed.
§Arguments
-
Function
A function that performs the operations that must execute in a synchronized update.
§Examples
use std::io;
use crossterm::{ExecutableCommand, SynchronizedUpdate, style::Print};
fn main() -> io::Result<()> {
let mut stdout = io::stdout();
stdout.sync_update(|stdout| {
stdout.execute(Print("foo 1\n".to_string()))?;
stdout.execute(Print("foo 2".to_string()))?;
// The effects of the print command will not be present in the terminal
// buffer, but not visible in the terminal.
std::io::Result::Ok(())
})?;
// The effects of the commands will be visible.
Ok(())
// ==== Output ====
// foo 1
// foo 2
}§Notes
This command is performed only using ANSI codes, and will do nothing on terminals that do not support ANSI codes, or this specific extension.
When rendering the screen of the terminal, the Emulator usually iterates through each visible grid cell and renders its current state. With applications updating the screen a at higher frequency this can cause tearing.
This mode attempts to mitigate that.
When the synchronization mode is enabled following render calls will keep rendering the last rendered state. The terminal Emulator keeps processing incoming text and sequences. When the synchronized update mode is disabled again the renderer may fetch the latest screen buffer state again, effectively avoiding the tearing effect by unintentionally rendering in the middle a of an application screen update.
Source§impl<W> WriteBytesExt for W
impl<W> WriteBytesExt for W
Source§fn write_u8(&mut self, n: u8) -> Result<(), Error>
fn write_u8(&mut self, n: u8) -> Result<(), Error>
Source§fn write_i8(&mut self, n: i8) -> Result<(), Error>
fn write_i8(&mut self, n: i8) -> Result<(), Error>
Source§fn write_u16<T>(&mut self, n: u16) -> Result<(), Error>where
T: ByteOrder,
fn write_u16<T>(&mut self, n: u16) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_i16<T>(&mut self, n: i16) -> Result<(), Error>where
T: ByteOrder,
fn write_i16<T>(&mut self, n: i16) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_u24<T>(&mut self, n: u32) -> Result<(), Error>where
T: ByteOrder,
fn write_u24<T>(&mut self, n: u32) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_i24<T>(&mut self, n: i32) -> Result<(), Error>where
T: ByteOrder,
fn write_i24<T>(&mut self, n: i32) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_u32<T>(&mut self, n: u32) -> Result<(), Error>where
T: ByteOrder,
fn write_u32<T>(&mut self, n: u32) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_i32<T>(&mut self, n: i32) -> Result<(), Error>where
T: ByteOrder,
fn write_i32<T>(&mut self, n: i32) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_u48<T>(&mut self, n: u64) -> Result<(), Error>where
T: ByteOrder,
fn write_u48<T>(&mut self, n: u64) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_i48<T>(&mut self, n: i64) -> Result<(), Error>where
T: ByteOrder,
fn write_i48<T>(&mut self, n: i64) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_u64<T>(&mut self, n: u64) -> Result<(), Error>where
T: ByteOrder,
fn write_u64<T>(&mut self, n: u64) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_i64<T>(&mut self, n: i64) -> Result<(), Error>where
T: ByteOrder,
fn write_i64<T>(&mut self, n: i64) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_u128<T>(&mut self, n: u128) -> Result<(), Error>where
T: ByteOrder,
fn write_u128<T>(&mut self, n: u128) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_i128<T>(&mut self, n: i128) -> Result<(), Error>where
T: ByteOrder,
fn write_i128<T>(&mut self, n: i128) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_uint<T>(&mut self, n: u64, nbytes: usize) -> Result<(), Error>where
T: ByteOrder,
fn write_uint<T>(&mut self, n: u64, nbytes: usize) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_int<T>(&mut self, n: i64, nbytes: usize) -> Result<(), Error>where
T: ByteOrder,
fn write_int<T>(&mut self, n: i64, nbytes: usize) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_uint128<T>(&mut self, n: u128, nbytes: usize) -> Result<(), Error>where
T: ByteOrder,
fn write_uint128<T>(&mut self, n: u128, nbytes: usize) -> Result<(), Error>where
T: ByteOrder,
Source§fn write_int128<T>(&mut self, n: i128, nbytes: usize) -> Result<(), Error>where
T: ByteOrder,
fn write_int128<T>(&mut self, n: i128, nbytes: usize) -> Result<(), Error>where
T: ByteOrder,
Source§impl<W> WriteEndian<[f32]> for Wwhere
W: Write,
impl<W> WriteEndian<[f32]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[f32]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[f32]) -> Result<(), Error>
Source§impl<W> WriteEndian<[f64]> for Wwhere
W: Write,
impl<W> WriteEndian<[f64]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[f64]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[f64]) -> Result<(), Error>
Source§impl<W> WriteEndian<[i8]> for Wwhere
W: Write,
impl<W> WriteEndian<[i8]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[i8]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[i8]) -> Result<(), Error>
Source§impl<W> WriteEndian<[i16]> for Wwhere
W: Write,
impl<W> WriteEndian<[i16]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[i16]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[i16]) -> Result<(), Error>
Source§impl<W> WriteEndian<[i32]> for Wwhere
W: Write,
impl<W> WriteEndian<[i32]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[i32]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[i32]) -> Result<(), Error>
Source§impl<W> WriteEndian<[i64]> for Wwhere
W: Write,
impl<W> WriteEndian<[i64]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[i64]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[i64]) -> Result<(), Error>
Source§impl<W> WriteEndian<[i128]> for Wwhere
W: Write,
impl<W> WriteEndian<[i128]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[i128]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[i128]) -> Result<(), Error>
Source§impl<W> WriteEndian<[u8]> for Wwhere
W: Write,
impl<W> WriteEndian<[u8]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[u8]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[u8]) -> Result<(), Error>
Source§impl<W> WriteEndian<[u16]> for Wwhere
W: Write,
impl<W> WriteEndian<[u16]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[u16]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[u16]) -> Result<(), Error>
Source§impl<W> WriteEndian<[u32]> for Wwhere
W: Write,
impl<W> WriteEndian<[u32]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[u32]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[u32]) -> Result<(), Error>
Source§impl<W> WriteEndian<[u64]> for Wwhere
W: Write,
impl<W> WriteEndian<[u64]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[u64]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[u64]) -> Result<(), Error>
Source§impl<W> WriteEndian<[u128]> for Wwhere
W: Write,
impl<W> WriteEndian<[u128]> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &[u128]) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &[u128]) -> Result<(), Error>
Source§impl<W> WriteEndian<f32> for Wwhere
W: Write,
impl<W> WriteEndian<f32> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &f32) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &f32) -> Result<(), Error>
Source§impl<W> WriteEndian<f64> for Wwhere
W: Write,
impl<W> WriteEndian<f64> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &f64) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &f64) -> Result<(), Error>
Source§impl<W> WriteEndian<i8> for Wwhere
W: Write,
impl<W> WriteEndian<i8> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &i8) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &i8) -> Result<(), Error>
Source§impl<W> WriteEndian<i16> for Wwhere
W: Write,
impl<W> WriteEndian<i16> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &i16) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &i16) -> Result<(), Error>
Source§impl<W> WriteEndian<i32> for Wwhere
W: Write,
impl<W> WriteEndian<i32> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &i32) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &i32) -> Result<(), Error>
Source§impl<W> WriteEndian<i64> for Wwhere
W: Write,
impl<W> WriteEndian<i64> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &i64) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &i64) -> Result<(), Error>
Source§impl<W> WriteEndian<i128> for Wwhere
W: Write,
impl<W> WriteEndian<i128> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &i128) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &i128) -> Result<(), Error>
Source§impl<W> WriteEndian<u8> for Wwhere
W: Write,
impl<W> WriteEndian<u8> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &u8) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &u8) -> Result<(), Error>
Source§impl<W> WriteEndian<u16> for Wwhere
W: Write,
impl<W> WriteEndian<u16> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &u16) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &u16) -> Result<(), Error>
Source§impl<W> WriteEndian<u32> for Wwhere
W: Write,
impl<W> WriteEndian<u32> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &u32) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &u32) -> Result<(), Error>
Source§impl<W> WriteEndian<u64> for Wwhere
W: Write,
impl<W> WriteEndian<u64> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &u64) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &u64) -> Result<(), Error>
Source§impl<W> WriteEndian<u128> for Wwhere
W: Write,
impl<W> WriteEndian<u128> for Wwhere
W: Write,
Source§fn write_as_little_endian(&mut self, value: &u128) -> Result<(), Error>
fn write_as_little_endian(&mut self, value: &u128) -> Result<(), Error>
Source§impl<T> ZByteWriterTrait for Twhere
T: Write,
impl<T> ZByteWriterTrait for Twhere
T: Write,
Source§fn write_bytes(&mut self, buf: &[u8]) -> Result<usize, ZByteIoError>
fn write_bytes(&mut self, buf: &[u8]) -> Result<usize, ZByteIoError>
Source§fn write_all_bytes(&mut self, buf: &[u8]) -> Result<(), ZByteIoError>
fn write_all_bytes(&mut self, buf: &[u8]) -> Result<(), ZByteIoError>
Source§fn write_const_bytes<const N: usize>(
&mut self,
buf: &[u8; N],
) -> Result<(), ZByteIoError>
fn write_const_bytes<const N: usize>( &mut self, buf: &[u8; N], ) -> Result<(), ZByteIoError>
Source§fn flush_bytes(&mut self) -> Result<(), ZByteIoError>
fn flush_bytes(&mut self) -> Result<(), ZByteIoError>
Source§fn reserve_capacity(&mut self, _: usize) -> Result<(), ZByteIoError>
fn reserve_capacity(&mut self, _: usize) -> Result<(), ZByteIoError>
Vec can use this to reserve additional memory to
prevent reallocation when encoding Read more