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