Files
chuan b26104fe95 feat: add tui test infrastructure
- add xunit regression project with virtual terminal output

- cover text input overlay rendering and component checks
2026-06-04 02:35:52 +08:00

71 lines
1.7 KiB
C#

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