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");
}