using System.Text; using TinyTUI.Stdout; namespace TinyTUI.Tests.TestInfrastructure; /// /// 捕获渲染器写出的终端序列并提供可模拟的窗口尺寸 /// internal sealed class VirtualTerminalOutput(int columns = 80, int rows = 24) : ITerminalOutput { private readonly List _writes = []; /// /// 获取当前模拟终端尺寸 /// public TerminalSize Size { get; private set; } = new(columns, rows); /// /// 获取完整输出缓冲 /// public StringBuilder Buffer { get; } = new(); /// /// 获取每一次写入的原始片段 /// public IReadOnlyList Writes => _writes; /// /// 调整模拟终端尺寸 /// public void Resize(int columns, int rows) => Size = new TerminalSize(columns, rows); /// /// 清空已捕获的输出 /// public void ClearWrites() { _writes.Clear(); Buffer.Clear(); } /// /// 判断完整输出缓冲是否包含指定序列 /// public bool Contains(string value) => Buffer.ToString().Contains(value, StringComparison.Ordinal); /// public void Write(string value) { _writes.Add(value); Buffer.Append(value); } /// public void Flush() { } /// public void ClearScreen() => Write("\e[2J\e[H"); /// public void HideCursor() => Write("\e[?25l"); /// public void ShowCursor() => Write("\e[?25h"); /// public void MoveCursorTo(int row, int column) => Write($"\e[{row};{column}H"); }