namespace Spectre.Console.Testing;
///
/// A testable console.
///
public sealed class TestConsole : IAnsiConsole, IDisposable
{
private readonly IAnsiConsole _console;
private readonly StringWriter _writer;
private IAnsiConsoleCursor? _cursor;
///
public Profile Profile => _console.Profile;
///
public IExclusivityMode ExclusivityMode => _console.ExclusivityMode;
///
/// Gets the console input.
///
public TestConsoleInput Input { get; }
///
public RenderPipeline Pipeline => _console.Pipeline;
///
public IAnsiConsoleCursor Cursor => _cursor ?? _console.Cursor;
///
IAnsiConsoleInput IAnsiConsole.Input => Input;
///
/// Gets the console output.
///
public string Output => _writer.ToString();
///
/// Gets the console output lines.
///
public IReadOnlyList Lines => Output.NormalizeLineEndings().TrimEnd('\n').Split(new char[] { '\n' });
///
/// Gets or sets a value indicating whether or not VT/ANSI sequences
/// should be emitted to the console.
///
public bool EmitAnsiSequences { get; set; }
///
/// Initializes a new instance of the class.
///
public TestConsole()
{
_writer = new StringWriter();
_cursor = new NoopCursor();
Input = new TestConsoleInput();
EmitAnsiSequences = false;
_console = AnsiConsole.Create(new AnsiConsoleSettings
{
Ansi = AnsiSupport.Yes,
ColorSystem = (ColorSystemSupport)ColorSystem.TrueColor,
Out = new AnsiConsoleOutput(_writer),
Interactive = InteractionSupport.No,
ExclusivityMode = new NoopExclusivityMode(),
Enrichment = new ProfileEnrichment
{
UseDefaultEnrichers = false,
},
});
_console.Profile.Width = 80;
_console.Profile.Height = 24;
_console.Profile.Capabilities.Ansi = true;
_console.Profile.Capabilities.Unicode = true;
}
///
public void Dispose()
{
_writer.Dispose();
}
///
public void Clear(bool home)
{
_console.Clear(home);
}
///
public void Write(IRenderable renderable)
{
if (EmitAnsiSequences)
{
_console.Write(renderable);
}
else
{
foreach (var segment in renderable.GetSegments(this))
{
if (segment.IsControlCode)
{
continue;
}
Profile.Out.Writer.Write(segment.Text);
}
}
}
internal void SetCursor(IAnsiConsoleCursor? cursor)
{
_cursor = cursor;
}
}