use std::fmt;
pub struct Emulator {
parser: vt100::Parser,
}
impl fmt::Debug for Emulator {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let (rows, cols) = self.parser.screen().size();
f.debug_struct("Emulator")
.field("rows", &rows)
.field("cols", &cols)
.finish_non_exhaustive()
}
}
impl Emulator {
#[must_use]
pub fn new(rows: u16, cols: u16) -> Self {
Self {
parser: vt100::Parser::new(rows, cols, 0),
}
}
pub fn process(&mut self, bytes: &[u8]) {
self.parser.process(bytes);
}
pub fn set_size(&mut self, rows: u16, cols: u16) {
self.parser.screen_mut().set_size(rows, cols);
}
#[must_use]
pub fn screen(&self) -> &vt100::Screen {
self.parser.screen()
}
#[must_use]
pub fn parser(&self) -> &vt100::Parser {
&self.parser
}
pub fn parser_mut(&mut self) -> &mut vt100::Parser {
&mut self.parser
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn set_size_updates_screen_dimensions() {
let mut emu = Emulator::new(24, 80);
assert_eq!(emu.screen().size(), (24, 80));
emu.set_size(30, 100);
assert_eq!(emu.screen().size(), (30, 100));
}
#[test]
fn emulator_new_initial_size() {
let emu = Emulator::new(24, 80);
assert_eq!(emu.screen().size(), (24, 80));
}
#[test]
fn emulator_process_bytes_moves_cursor() {
let mut emu = Emulator::new(24, 80);
emu.process(b"hello");
assert_eq!(emu.screen().cursor_position(), (0, 5));
}
#[test]
fn emulator_debug_format_contains_struct_name() {
let emu = Emulator::new(24, 80);
let s = format!("{emu:?}");
assert!(s.contains("Emulator"));
}
}