diff --git a/src/Spectre.Console.Testing/.editorconfig b/src/Spectre.Console.Testing/.editorconfig index 4f53fb9..2adf83c 100644 --- a/src/Spectre.Console.Testing/.editorconfig +++ b/src/Spectre.Console.Testing/.editorconfig @@ -1,17 +1,3 @@ root = false [*.cs] -# CS1591: Missing XML comment for publicly visible type or member -dotnet_diagnostic.CS1591.severity = none - -# SA1600: Elements should be documented -dotnet_diagnostic.SA1600.severity = none - -# SA1200: Using directives should be placed correctly -dotnet_diagnostic.SA1200.severity = none - -# Default severity for analyzer diagnostics with category 'StyleCop.CSharp.OrderingRules' -dotnet_analyzer_diagnostic.category-StyleCop.CSharp.OrderingRules.severity = none - -# CA1819: Properties should not return arrays -dotnet_diagnostic.CA1819.severity = none \ No newline at end of file diff --git a/src/Spectre.Console.Testing/Cli/CallbackCommandInterceptor.cs b/src/Spectre.Console.Testing/Cli/CallbackCommandInterceptor.cs new file mode 100644 index 0000000..a99a09b --- /dev/null +++ b/src/Spectre.Console.Testing/Cli/CallbackCommandInterceptor.cs @@ -0,0 +1,28 @@ +using System; +using Spectre.Console.Cli; + +namespace Spectre.Console.Testing +{ + /// + /// A that triggers a callback when invoked. + /// + public sealed class CallbackCommandInterceptor : ICommandInterceptor + { + private readonly Action _callback; + + /// + /// Initializes a new instance of the class. + /// + /// The callback to call when the interceptor is invoked. + public CallbackCommandInterceptor(Action callback) + { + _callback = callback ?? throw new ArgumentNullException(nameof(callback)); + } + + /// + public void Intercept(CommandContext context, CommandSettings settings) + { + _callback(context, settings); + } + } +} diff --git a/src/Spectre.Console.Testing/Cli/CommandAppFailure.cs b/src/Spectre.Console.Testing/Cli/CommandAppFailure.cs new file mode 100644 index 0000000..21ea0b7 --- /dev/null +++ b/src/Spectre.Console.Testing/Cli/CommandAppFailure.cs @@ -0,0 +1,29 @@ +using System; +using Spectre.Console.Cli; + +namespace Spectre.Console.Testing +{ + /// + /// Represents a runtime failure. + /// + public sealed class CommandAppFailure + { + /// + /// Gets the exception that was thrown. + /// + public Exception Exception { get; } + + /// + /// Gets the console output. + /// + public string Output { get; } + + internal CommandAppFailure(Exception exception, string output) + { + Exception = exception ?? throw new ArgumentNullException(nameof(exception)); + Output = output.NormalizeLineEndings() + .TrimLines() + .Trim(); + } + } +} diff --git a/src/Spectre.Console.Testing/Cli/CommandAppResult.cs b/src/Spectre.Console.Testing/Cli/CommandAppResult.cs new file mode 100644 index 0000000..e877eda --- /dev/null +++ b/src/Spectre.Console.Testing/Cli/CommandAppResult.cs @@ -0,0 +1,43 @@ +using Spectre.Console.Cli; + +namespace Spectre.Console.Testing +{ + /// + /// Represents the result of a completed run. + /// + public sealed class CommandAppResult + { + /// + /// Gets the exit code. + /// + public int ExitCode { get; } + + /// + /// Gets the console output. + /// + public string Output { get; } + + /// + /// Gets the command context. + /// + public CommandContext? Context { get; } + + /// + /// Gets the command settings. + /// + public CommandSettings? Settings { get; } + + internal CommandAppResult(int exitCode, string output, CommandContext? context, CommandSettings? settings) + { + ExitCode = exitCode; + Output = output ?? string.Empty; + Context = context; + Settings = settings; + + Output = Output + .NormalizeLineEndings() + .TrimLines() + .Trim(); + } + } +} diff --git a/src/Spectre.Console.Testing/Cli/CommandAppTester.cs b/src/Spectre.Console.Testing/Cli/CommandAppTester.cs new file mode 100644 index 0000000..00d5080 --- /dev/null +++ b/src/Spectre.Console.Testing/Cli/CommandAppTester.cs @@ -0,0 +1,112 @@ +using System; +using Spectre.Console.Cli; + +namespace Spectre.Console.Testing +{ + /// + /// A test harness. + /// + public sealed class CommandAppTester + { + private Action? _appConfiguration; + private Action? _configuration; + + /// + /// Sets the default command. + /// + /// The default command type. + public void SetDefaultCommand() + where T : class, ICommand + { + _appConfiguration = (app) => app.SetDefaultCommand(); + } + + /// + /// Configures the command application. + /// + /// The configuration action. + public void Configure(Action action) + { + if (_configuration != null) + { + throw new InvalidOperationException("The command app harnest have already been configured."); + } + + _configuration = action; + } + + /// + /// Runs the command application and expects an exception of a specific type to be thrown. + /// + /// The expected exception type. + /// The arguments. + /// The information about the failure. + public CommandAppFailure RunAndCatch(params string[] args) + where T : Exception + { + var console = new TestConsole().Width(int.MaxValue); + + try + { + Run(args, console, c => c.PropagateExceptions()); + throw new InvalidOperationException("Expected an exception to be thrown, but there was none."); + } + catch (T ex) + { + return new CommandAppFailure(ex, console.Output); + } + catch (Exception ex) + { + throw new InvalidOperationException( + $"Expected an exception of type '{typeof(T).FullName}' to be thrown, " + + $"but received {ex.GetType().FullName}."); + } + } + + /// + /// Runs the command application. + /// + /// The arguments. + /// The result. + public CommandAppResult Run(params string[] args) + { + var console = new TestConsole().Width(int.MaxValue); + return Run(args, console); + } + + private CommandAppResult Run(string[] args, TestConsole console, Action? config = null) + { + CommandContext? context = null; + CommandSettings? settings = null; + + var app = new CommandApp(); + _appConfiguration?.Invoke(app); + + if (_configuration != null) + { + app.Configure(_configuration); + } + + if (config != null) + { + app.Configure(config); + } + + app.Configure(c => c.ConfigureConsole(console)); + app.Configure(c => c.SetInterceptor(new CallbackCommandInterceptor((ctx, s) => + { + context = ctx; + settings = s; + }))); + + var result = app.Run(args); + + var output = console.Output + .NormalizeLineEndings() + .TrimLines() + .Trim(); + + return new CommandAppResult(result, output, context, settings); + } + } +} diff --git a/src/Spectre.Console.Testing/CommandAppFixture.cs b/src/Spectre.Console.Testing/CommandAppFixture.cs deleted file mode 100644 index f26e364..0000000 --- a/src/Spectre.Console.Testing/CommandAppFixture.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using Spectre.Console.Cli; - -namespace Spectre.Console.Testing -{ - public sealed class CommandAppFixture - { - private Action _appConfiguration = _ => { }; - private Action _configuration; - - public CommandAppFixture() - { - _configuration = (_) => { }; - } - - public CommandAppFixture WithDefaultCommand() - where T : class, ICommand - { - _appConfiguration = (app) => app.SetDefaultCommand(); - return this; - } - - public void Configure(Action action) - { - _configuration = action; - } - - public (string Message, string Output) RunAndCatch(params string[] args) - where T : Exception - { - CommandContext context = null; - CommandSettings settings = null; - - using var console = new FakeConsole(); - - var app = new CommandApp(); - _appConfiguration?.Invoke(app); - - app.Configure(_configuration); - app.Configure(c => c.ConfigureConsole(console)); - app.Configure(c => c.SetInterceptor(new FakeCommandInterceptor((ctx, s) => - { - context = ctx; - settings = s; - }))); - - try - { - app.Run(args); - } - catch (T ex) - { - var output = console.Output - .NormalizeLineEndings() - .TrimLines() - .Trim(); - - return (ex.Message, output); - } - - throw new InvalidOperationException("No exception was thrown"); - } - - public (int ExitCode, string Output, CommandContext Context, CommandSettings Settings) Run(params string[] args) - { - CommandContext context = null; - CommandSettings settings = null; - - using var console = new FakeConsole(width: int.MaxValue); - - var app = new CommandApp(); - _appConfiguration?.Invoke(app); - - app.Configure(_configuration); - app.Configure(c => c.ConfigureConsole(console)); - app.Configure(c => c.SetInterceptor(new FakeCommandInterceptor((ctx, s) => - { - context = ctx; - settings = s; - }))); - - var result = app.Run(args); - - var output = console.Output - .NormalizeLineEndings() - .TrimLines() - .Trim(); - - return (result, output, context, settings); - } - } -} diff --git a/src/Spectre.Console.Testing/Extensions/ShouldlyExtensions.cs b/src/Spectre.Console.Testing/Extensions/ShouldlyExtensions.cs deleted file mode 100644 index 4701acc..0000000 --- a/src/Spectre.Console.Testing/Extensions/ShouldlyExtensions.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Diagnostics; -using Shouldly; - -namespace Spectre.Console -{ - public static class ShouldlyExtensions - { - [DebuggerStepThrough] - public static T And(this T item, Action action) - { - if (action == null) - { - throw new ArgumentNullException(nameof(action)); - } - - action(item); - return item; - } - - [DebuggerStepThrough] - public static void As(this T item, Action action) - { - if (action == null) - { - throw new ArgumentNullException(nameof(action)); - } - - action(item); - } - - [DebuggerStepThrough] - public static void As(this object item, Action action) - { - if (action == null) - { - throw new ArgumentNullException(nameof(action)); - } - - action((T)item); - } - - [DebuggerStepThrough] - public static void ShouldBe(this Type item) - { - item.ShouldBe(typeof(T)); - } - } -} diff --git a/src/Spectre.Console.Testing/Extensions/StringExtensions.cs b/src/Spectre.Console.Testing/Extensions/StringExtensions.cs index 05ac9e3..6eec20f 100644 --- a/src/Spectre.Console.Testing/Extensions/StringExtensions.cs +++ b/src/Spectre.Console.Testing/Extensions/StringExtensions.cs @@ -1,13 +1,18 @@ using System.Collections.Generic; using System.Text.RegularExpressions; -namespace Spectre.Console +namespace Spectre.Console.Testing { + /// + /// Contains extensions for . + /// public static class StringExtensions { - private static readonly Regex _lineNumberRegex = new Regex(":\\d+", RegexOptions.Singleline); - private static readonly Regex _filenameRegex = new Regex("\\sin\\s.*cs:nn", RegexOptions.Multiline); - + /// + /// Returns a new string with all lines trimmed of trailing whitespace. + /// + /// The string to trim. + /// A new string with all lines trimmed of trailing whitespace. public static string TrimLines(this string value) { if (value is null) @@ -16,24 +21,19 @@ namespace Spectre.Console } var result = new List(); - var lines = value.Split(new[] { '\n' }); - - foreach (var line in lines) + foreach (var line in value.Split(new[] { '\n' })) { - var current = line.TrimEnd(); - if (string.IsNullOrWhiteSpace(current)) - { - result.Add(string.Empty); - } - else - { - result.Add(current); - } + result.Add(line.TrimEnd()); } return string.Join("\n", result); } + /// + /// Returns a new string with normalized line endings. + /// + /// The string to normalize line endings for. + /// A new string with normalized line endings. public static string NormalizeLineEndings(this string value) { if (value != null) @@ -44,36 +44,5 @@ namespace Spectre.Console return string.Empty; } - - public static string NormalizeStackTrace(this string text) - { - text = _lineNumberRegex.Replace(text, match => - { - return ":nn"; - }); - - return _filenameRegex.Replace(text, match => - { - var value = match.Value; - var index = value.LastIndexOfAny(new[] { '\\', '/' }); - var filename = value.Substring(index + 1, value.Length - index - 1); - - return $" in /xyz/{filename}"; - }); - } - - internal static string ReplaceExact(this string text, string oldValue, string newValue) - { - if (string.IsNullOrWhiteSpace(newValue)) - { - return text; - } - -#if NET5_0 - return text.Replace(oldValue, newValue, StringComparison.Ordinal); -#else - return text.Replace(oldValue, newValue); -#endif - } } } diff --git a/src/Spectre.Console.Testing/Extensions/StyleExtensions.cs b/src/Spectre.Console.Testing/Extensions/StyleExtensions.cs index cf8d466..bcf3627 100644 --- a/src/Spectre.Console.Testing/Extensions/StyleExtensions.cs +++ b/src/Spectre.Console.Testing/Extensions/StyleExtensions.cs @@ -1,7 +1,17 @@ -namespace Spectre.Console.Tests +namespace Spectre.Console.Testing { + /// + /// Contains extensions for . + /// public static class StyleExtensions { + /// + /// Sets the foreground or background color of the specified style. + /// + /// The style. + /// The color. + /// Whether or not to set the foreground color. + /// The same instance so that multiple calls can be chained. public static Style SetColor(this Style style, Color color, bool foreground) { if (foreground) diff --git a/src/Spectre.Console.Testing/Extensions/XmlElementExtensions.cs b/src/Spectre.Console.Testing/Extensions/XmlElementExtensions.cs deleted file mode 100644 index 8bbee95..0000000 --- a/src/Spectre.Console.Testing/Extensions/XmlElementExtensions.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Reflection; -using System.Xml; - -namespace Spectre.Console -{ - public static class XmlElementExtensions - { - public static void SetNullableAttribute(this XmlElement element, string name, string value) - { - if (element == null) - { - throw new ArgumentNullException(nameof(element)); - } - - element.SetAttribute(name, value ?? "NULL"); - } - - public static void SetNullableAttribute(this XmlElement element, string name, IEnumerable values) - { - if (element == null) - { - throw new ArgumentNullException(nameof(element)); - } - - if (values?.Any() != true) - { - element.SetAttribute(name, "NULL"); - } - - element.SetAttribute(name, string.Join(",", values)); - } - - public static void SetBooleanAttribute(this XmlElement element, string name, bool value) - { - if (element == null) - { - throw new ArgumentNullException(nameof(element)); - } - - element.SetAttribute(name, value ? "true" : "false"); - } - - public static void SetEnumAttribute(this XmlElement element, string name, Enum value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (element == null) - { - throw new ArgumentNullException(nameof(element)); - } - - var field = value.GetType().GetField(value.ToString()); - var attribute = field.GetCustomAttribute(false); - if (attribute == null) - { - throw new InvalidOperationException("Enum is missing description."); - } - - element.SetAttribute(name, attribute.Description); - } - } -} diff --git a/src/Spectre.Console.Testing/Fakes/FakeAnsiConsole.cs b/src/Spectre.Console.Testing/Fakes/FakeAnsiConsole.cs deleted file mode 100644 index 2e1149c..0000000 --- a/src/Spectre.Console.Testing/Fakes/FakeAnsiConsole.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.IO; -using Spectre.Console.Rendering; - -namespace Spectre.Console.Testing -{ - public sealed class FakeAnsiConsole : IDisposable, IAnsiConsole - { - private readonly StringWriter _writer; - private readonly IAnsiConsole _console; - private readonly FakeExclusivityMode _exclusivityLock; - - public string Output => _writer.ToString(); - - public Profile Profile => _console.Profile; - public IAnsiConsoleCursor Cursor => _console.Cursor; - public FakeConsoleInput Input { get; } - public IExclusivityMode ExclusivityMode => _exclusivityLock; - public RenderPipeline Pipeline => _console.Pipeline; - - IAnsiConsoleInput IAnsiConsole.Input => Input; - - public FakeAnsiConsole( - ColorSystem colors, - AnsiSupport ansi = AnsiSupport.Yes, - int width = 80) - { - _exclusivityLock = new FakeExclusivityMode(); - _writer = new StringWriter(); - - var factory = new AnsiConsoleFactory(); - _console = factory.Create(new AnsiConsoleSettings - { - Ansi = ansi, - ColorSystem = (ColorSystemSupport)colors, - Out = new AnsiConsoleOutput(_writer), - Enrichment = new ProfileEnrichment - { - UseDefaultEnrichers = false, - }, - }); - - _console.Profile.Width = width; - _console.Profile.Capabilities.Unicode = true; - - Input = new FakeConsoleInput(); - } - - public void Dispose() - { - _writer?.Dispose(); - } - - public void Clear(bool home) - { - _console.Clear(home); - } - - public void Write(IRenderable renderable) - { - _console.Write(renderable); - } - } -} diff --git a/src/Spectre.Console.Testing/Fakes/FakeCapabilities.cs b/src/Spectre.Console.Testing/Fakes/FakeCapabilities.cs deleted file mode 100644 index 6feedea..0000000 --- a/src/Spectre.Console.Testing/Fakes/FakeCapabilities.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Spectre.Console.Testing -{ - public sealed class FakeCapabilities : IReadOnlyCapabilities - { - public ColorSystem ColorSystem { get; set; } = ColorSystem.TrueColor; - - public bool Ansi { get; set; } - - public bool Links { get; set; } - - public bool Legacy { get; set; } - - public bool IsTerminal { get; set; } - - public bool Interactive { get; set; } - - public bool Unicode { get; set; } - } -} diff --git a/src/Spectre.Console.Testing/Fakes/FakeCommandInterceptor.cs b/src/Spectre.Console.Testing/Fakes/FakeCommandInterceptor.cs deleted file mode 100644 index 254a8a8..0000000 --- a/src/Spectre.Console.Testing/Fakes/FakeCommandInterceptor.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Spectre.Console.Cli; - -namespace Spectre.Console.Testing -{ - public sealed class FakeCommandInterceptor : ICommandInterceptor - { - private readonly Action _action; - - public FakeCommandInterceptor(Action action) - { - _action = action ?? throw new ArgumentNullException(nameof(action)); - } - - public void Intercept(CommandContext context, CommandSettings settings) - { - _action(context, settings); - } - } -} diff --git a/src/Spectre.Console.Testing/Fakes/FakeConsole.cs b/src/Spectre.Console.Testing/Fakes/FakeConsole.cs deleted file mode 100644 index 335de66..0000000 --- a/src/Spectre.Console.Testing/Fakes/FakeConsole.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Spectre.Console.Rendering; - -namespace Spectre.Console.Testing -{ - public sealed class FakeConsole : IAnsiConsole, IDisposable - { - public Profile Profile { get; } - public IAnsiConsoleCursor Cursor => new FakeAnsiConsoleCursor(); - IAnsiConsoleInput IAnsiConsole.Input => Input; - public IExclusivityMode ExclusivityMode { get; } - public RenderPipeline Pipeline { get; } - - public FakeConsoleInput Input { get; } - public string Output => Profile.Out.Writer.ToString(); - public IReadOnlyList Lines => Output.TrimEnd('\n').Split(new char[] { '\n' }); - - public FakeConsole( - int width = 80, int height = 9000, Encoding encoding = null, - bool supportsAnsi = true, ColorSystem colorSystem = ColorSystem.Standard, - bool legacyConsole = false, bool interactive = true) - { - Input = new FakeConsoleInput(); - ExclusivityMode = new FakeExclusivityMode(); - Pipeline = new RenderPipeline(); - - Profile = new Profile(new AnsiConsoleOutput(new StringWriter()), encoding ?? Encoding.UTF8); - Profile.Width = width; - Profile.Height = height; - Profile.Capabilities.ColorSystem = colorSystem; - Profile.Capabilities.Ansi = supportsAnsi; - Profile.Capabilities.Legacy = legacyConsole; - Profile.Capabilities.Interactive = interactive; - Profile.Capabilities.Links = true; - Profile.Capabilities.Unicode = true; - } - - public void Dispose() - { - Profile.Out.Writer.Dispose(); - } - - public void Clear(bool home) - { - } - - public void Write(IRenderable renderable) - { - foreach (var segment in renderable.GetSegments(this)) - { - Profile.Out.Writer.Write(segment.Text); - } - } - - public string WriteNormalizedException(Exception ex, ExceptionFormats formats = ExceptionFormats.Default) - { - this.WriteException(ex, formats); - return string.Join("\n", Output.NormalizeStackTrace() - .NormalizeLineEndings() - .Split(new char[] { '\n' }) - .Select(line => line.TrimEnd())); - } - } -} diff --git a/src/Spectre.Console.Testing/Fakes/FakeConsoleInput.cs b/src/Spectre.Console.Testing/Fakes/FakeConsoleInput.cs deleted file mode 100644 index a3223fe..0000000 --- a/src/Spectre.Console.Testing/Fakes/FakeConsoleInput.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Spectre.Console.Testing -{ - public sealed class FakeConsoleInput : IAnsiConsoleInput - { - private readonly Queue _input; - - public FakeConsoleInput() - { - _input = new Queue(); - } - - public void PushText(string input) - { - if (input is null) - { - throw new ArgumentNullException(nameof(input)); - } - - foreach (var character in input) - { - PushCharacter(character); - } - } - - public void PushTextWithEnter(string input) - { - PushText(input); - PushKey(ConsoleKey.Enter); - } - - public void PushCharacter(char character) - { - var control = char.IsUpper(character); - _input.Enqueue(new ConsoleKeyInfo(character, (ConsoleKey)character, false, false, control)); - } - - public void PushKey(ConsoleKey key) - { - _input.Enqueue(new ConsoleKeyInfo((char)key, key, false, false, false)); - } - - public ConsoleKeyInfo ReadKey(bool intercept) - { - if (_input.Count == 0) - { - throw new InvalidOperationException("No input available."); - } - - return _input.Dequeue(); - } - } -} diff --git a/src/Spectre.Console.Testing/Fakes/FakeTypeResolver.cs b/src/Spectre.Console.Testing/Fakes/FakeTypeResolver.cs deleted file mode 100644 index a676ed3..0000000 --- a/src/Spectre.Console.Testing/Fakes/FakeTypeResolver.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using Spectre.Console.Cli; - -namespace Spectre.Console.Testing -{ - public sealed class FakeTypeResolver : ITypeResolver - { - private readonly IDictionary _lookup; - - public FakeTypeResolver() - { - _lookup = new Dictionary(); - } - - public void Register(T instance) - { - _lookup[typeof(T)] = instance; - } - - public object Resolve(Type type) - { - if (_lookup.TryGetValue(type, out var value)) - { - return value; - } - - return Activator.CreateInstance(type); - } - } -} diff --git a/src/Spectre.Console.Testing/Fakes/FakeAnsiConsoleCursor.cs b/src/Spectre.Console.Testing/Internal/NoopCursor.cs similarity index 79% rename from src/Spectre.Console.Testing/Fakes/FakeAnsiConsoleCursor.cs rename to src/Spectre.Console.Testing/Internal/NoopCursor.cs index a67f506..6980bcc 100644 --- a/src/Spectre.Console.Testing/Fakes/FakeAnsiConsoleCursor.cs +++ b/src/Spectre.Console.Testing/Internal/NoopCursor.cs @@ -1,6 +1,6 @@ namespace Spectre.Console.Testing { - public sealed class FakeAnsiConsoleCursor : IAnsiConsoleCursor + internal sealed class NoopCursor : IAnsiConsoleCursor { public void Move(CursorDirection direction, int steps) { diff --git a/src/Spectre.Console.Testing/Fakes/FakeExclusivityMode.cs b/src/Spectre.Console.Testing/Internal/NoopExclusivityMode.cs similarity index 81% rename from src/Spectre.Console.Testing/Fakes/FakeExclusivityMode.cs rename to src/Spectre.Console.Testing/Internal/NoopExclusivityMode.cs index ffb98e7..17978b8 100644 --- a/src/Spectre.Console.Testing/Fakes/FakeExclusivityMode.cs +++ b/src/Spectre.Console.Testing/Internal/NoopExclusivityMode.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; namespace Spectre.Console.Testing { - public sealed class FakeExclusivityMode : IExclusivityMode + internal sealed class NoopExclusivityMode : IExclusivityMode { public T Run(Func func) { diff --git a/src/Spectre.Console.Testing/Spectre.Console.Testing.csproj b/src/Spectre.Console.Testing/Spectre.Console.Testing.csproj index 24d93cd..3a50e9b 100644 --- a/src/Spectre.Console.Testing/Spectre.Console.Testing.csproj +++ b/src/Spectre.Console.Testing/Spectre.Console.Testing.csproj @@ -1,18 +1,24 @@ - netstandard2.0 + net5.0;netstandard2.0 false + enable + true + Contains testing utilities for Spectre.Console. + + + + + - - - - - + + + diff --git a/src/Spectre.Console.Testing/Spectre.Console.Testing.v3.ncrunchproject b/src/Spectre.Console.Testing/Spectre.Console.Testing.v3.ncrunchproject deleted file mode 100644 index cff5044..0000000 --- a/src/Spectre.Console.Testing/Spectre.Console.Testing.v3.ncrunchproject +++ /dev/null @@ -1,5 +0,0 @@ - - - False - - \ No newline at end of file diff --git a/src/Spectre.Console.Testing/TestCapabilities.cs b/src/Spectre.Console.Testing/TestCapabilities.cs new file mode 100644 index 0000000..90ca551 --- /dev/null +++ b/src/Spectre.Console.Testing/TestCapabilities.cs @@ -0,0 +1,40 @@ +using Spectre.Console.Rendering; + +namespace Spectre.Console.Testing +{ + /// + /// Represents fake capabilities useful in tests. + /// + public sealed class TestCapabilities : IReadOnlyCapabilities + { + /// + public ColorSystem ColorSystem { get; set; } = ColorSystem.TrueColor; + + /// + public bool Ansi { get; set; } + + /// + public bool Links { get; set; } + + /// + public bool Legacy { get; set; } + + /// + public bool IsTerminal { get; set; } + + /// + public bool Interactive { get; set; } + + /// + public bool Unicode { get; set; } + + /// + /// Creates a with the same capabilities as this instace. + /// + /// A with the same capabilities as this instace. + public RenderContext CreateRenderContext() + { + return new RenderContext(this); + } + } +} diff --git a/src/Spectre.Console.Testing/TestConsole.cs b/src/Spectre.Console.Testing/TestConsole.cs new file mode 100644 index 0000000..6ccff15 --- /dev/null +++ b/src/Spectre.Console.Testing/TestConsole.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Spectre.Console.Rendering; + +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; + + var factory = new AnsiConsoleFactory(); + _console = factory.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; + } + } +} diff --git a/src/Spectre.Console.Testing/TestConsoleExtensions.cs b/src/Spectre.Console.Testing/TestConsoleExtensions.cs new file mode 100644 index 0000000..59d9c1a --- /dev/null +++ b/src/Spectre.Console.Testing/TestConsoleExtensions.cs @@ -0,0 +1,55 @@ +namespace Spectre.Console.Testing +{ + /// + /// Contains extensions for . + /// + public static class TestConsoleExtensions + { + /// + /// Sets the console's color system. + /// + /// The console. + /// The color system to use. + /// The same instance so that multiple calls can be chained. + public static TestConsole Colors(this TestConsole console, ColorSystem colors) + { + console.Profile.Capabilities.ColorSystem = colors; + return console; + } + + /// + /// Makes the console interactive. + /// + /// The console. + /// The same instance so that multiple calls can be chained. + public static TestConsole Interactive(this TestConsole console) + { + console.Profile.Capabilities.Interactive = true; + return console; + } + + /// + /// Sets the console width. + /// + /// The console. + /// The console width. + /// The same instance so that multiple calls can be chained. + public static TestConsole Width(this TestConsole console, int width) + { + console.Profile.Width = width; + return console; + } + + /// + /// Turns on emitting of VT/ANSI sequences. + /// + /// The console. + /// The same instance so that multiple calls can be chained. + public static TestConsole EmitAnsiSequences(this TestConsole console) + { + console.SetCursor(null); + console.EmitAnsiSequences = true; + return console; + } + } +} diff --git a/src/Spectre.Console.Testing/TestConsoleInput.cs b/src/Spectre.Console.Testing/TestConsoleInput.cs new file mode 100644 index 0000000..92366d1 --- /dev/null +++ b/src/Spectre.Console.Testing/TestConsoleInput.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +namespace Spectre.Console.Testing +{ + /// + /// Represents a testable console input mechanism. + /// + public sealed class TestConsoleInput : IAnsiConsoleInput + { + private readonly Queue _input; + + /// + /// Initializes a new instance of the class. + /// + public TestConsoleInput() + { + _input = new Queue(); + } + + /// + /// Pushes the specified text to the input queue. + /// + /// The input string. + public void PushText(string input) + { + if (input is null) + { + throw new ArgumentNullException(nameof(input)); + } + + foreach (var character in input) + { + PushCharacter(character); + } + } + + /// + /// Pushes the specified text followed by 'Enter' to the input queue. + /// + /// The input. + public void PushTextWithEnter(string input) + { + PushText(input); + PushKey(ConsoleKey.Enter); + } + + /// + /// Pushes the specified character to the input queue. + /// + /// The input. + public void PushCharacter(char input) + { + var control = char.IsUpper(input); + _input.Enqueue(new ConsoleKeyInfo(input, (ConsoleKey)input, false, false, control)); + } + + /// + /// Pushes the specified key to the input queue. + /// + /// The input. + public void PushKey(ConsoleKey input) + { + _input.Enqueue(new ConsoleKeyInfo((char)input, input, false, false, false)); + } + + /// + public ConsoleKeyInfo ReadKey(bool intercept) + { + if (_input.Count == 0) + { + throw new InvalidOperationException("No input available."); + } + + return _input.Dequeue(); + } + } +} diff --git a/src/Spectre.Console.Testing/Widgets/DummySpinner1.cs b/src/Spectre.Console.Testing/Widgets/DummySpinner1.cs deleted file mode 100644 index d73bd42..0000000 --- a/src/Spectre.Console.Testing/Widgets/DummySpinner1.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Spectre.Console.Testing -{ - public sealed class DummySpinner1 : Spinner - { - public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); - public override bool IsUnicode => true; - public override IReadOnlyList Frames => new List { "*", }; - } -} diff --git a/src/Spectre.Console.Testing/Widgets/DummySpinner2.cs b/src/Spectre.Console.Testing/Widgets/DummySpinner2.cs deleted file mode 100644 index 8c248ae..0000000 --- a/src/Spectre.Console.Testing/Widgets/DummySpinner2.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Spectre.Console.Testing -{ - public sealed class DummySpinner2 : Spinner - { - public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); - public override bool IsUnicode => true; - public override IReadOnlyList Frames => new List { "-", }; - } -} diff --git a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Colors.cs b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Colors.cs index c03ebe6..731dc95 100644 --- a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Colors.cs +++ b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Colors.cs @@ -34,7 +34,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Return_Correct_Code(bool foreground, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.TrueColor); + var console = new TestConsole() + .Colors(ColorSystem.TrueColor) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(new Color(128, 0, 128), foreground)); @@ -49,7 +51,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Return_Eight_Bit_Ansi_Code_For_Known_Colors(bool foreground, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.TrueColor); + var console = new TestConsole() + .Colors(ColorSystem.TrueColor) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(Color.Purple, foreground)); @@ -67,7 +71,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Return_Correct_Code_For_Known_Color(bool foreground, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.EightBit); + var console = new TestConsole() + .Colors(ColorSystem.EightBit) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); @@ -82,7 +88,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Map_TrueColor_To_Nearest_Eight_Bit_Color_If_Possible(bool foreground, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.EightBit); + var console = new TestConsole() + .Colors(ColorSystem.EightBit) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(new Color(128, 128, 0), foreground)); @@ -97,7 +105,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Estimate_TrueColor_To_Nearest_Eight_Bit_Color(bool foreground, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.EightBit); + var console = new TestConsole() + .Colors(ColorSystem.EightBit) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(new Color(126, 127, 0), foreground)); @@ -115,7 +125,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Return_Correct_Code_For_Known_Color(bool foreground, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); @@ -135,7 +147,9 @@ namespace Spectre.Console.Tests.Unit string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); @@ -155,7 +169,9 @@ namespace Spectre.Console.Tests.Unit string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); @@ -173,7 +189,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Return_Correct_Code_For_Known_Color(bool foreground, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Legacy); + var console = new TestConsole() + .Colors(ColorSystem.Legacy) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); @@ -193,7 +211,9 @@ namespace Spectre.Console.Tests.Unit string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Legacy); + var console = new TestConsole() + .Colors(ColorSystem.Legacy) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); @@ -213,7 +233,9 @@ namespace Spectre.Console.Tests.Unit string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Legacy); + var console = new TestConsole() + .Colors(ColorSystem.Legacy) + .EmitAnsiSequences(); // When console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); diff --git a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Cursor.cs b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Cursor.cs index fbbc4b7..a2ac450 100644 --- a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Cursor.cs +++ b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Cursor.cs @@ -18,7 +18,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Return_Correct_Ansi_Code(CursorDirection direction, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole().EmitAnsiSequences(); // When console.Write("Hello"); @@ -36,7 +36,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Return_Correct_Ansi_Code() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole().EmitAnsiSequences(); // When console.Write("Hello"); diff --git a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs index cef8a69..bbe5076 100644 --- a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs +++ b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs @@ -15,7 +15,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Output_Expected_Ansi_For_Markup(string markup, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Markup(markup); @@ -28,7 +30,8 @@ namespace Spectre.Console.Tests.Unit public void Should_Output_Expected_Ansi_For_Link_With_Url_And_Text() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole() + .EmitAnsiSequences(); // When console.Markup("[link=https://patriksvensson.se]Click to visit my blog[/]"); @@ -41,7 +44,8 @@ namespace Spectre.Console.Tests.Unit public void Should_Output_Expected_Ansi_For_Link_With_Only_Url() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole() + .EmitAnsiSequences(); // When console.Markup("[link]https://patriksvensson.se[/]"); @@ -55,7 +59,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Be_Able_To_Escape_Tags(string markup, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Markup(markup); @@ -72,7 +78,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Throw_If_Encounters_Malformed_Tag(string markup, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole(); // When var result = Record.Exception(() => console.Markup(markup)); @@ -86,7 +92,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Throw_If_Tags_Are_Unbalanced() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole(); // When var result = Record.Exception(() => console.Markup("[yellow][blue]Hello[/]")); @@ -100,7 +106,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Throw_If_Encounters_Closing_Tag() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole(); // When var result = Record.Exception(() => console.Markup("Hello[/]World")); diff --git a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Style.cs b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Style.cs index 8424d03..f9a2703 100644 --- a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Style.cs +++ b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.Style.cs @@ -19,7 +19,8 @@ namespace Spectre.Console.Tests.Unit public void Should_Write_Decorated_Text_Correctly(Decoration decoration, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.TrueColor); + var console = new TestConsole() + .EmitAnsiSequences(); // When console.Write("Hello World", new Style().Decoration(decoration)); @@ -34,7 +35,8 @@ namespace Spectre.Console.Tests.Unit public void Should_Write_Text_With_Multiple_Decorations_Correctly(Decoration decoration, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.TrueColor); + var console = new TestConsole() + .EmitAnsiSequences(); // When console.Write("Hello World", new Style().Decoration(decoration)); diff --git a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.cs b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.cs index 19415f8..fc06cfb 100644 --- a/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.cs +++ b/src/Spectre.Console.Tests/Unit/AnsiConsoleTests.cs @@ -13,7 +13,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Clear_Screen(bool home, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Write("Hello"); @@ -28,7 +30,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Combine_Decoration_And_Colors() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Write( @@ -46,7 +50,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Not_Include_Foreground_If_Set_To_Default_Color() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Write( @@ -64,7 +70,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Not_Include_Background_If_Set_To_Default_Color() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Write( @@ -82,7 +90,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Not_Include_Decoration_If_Set_To_None() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.Write( @@ -102,7 +112,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Reset_Colors_Correctly_After_Line_Break() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.WriteLine("Hello", new Style().Background(ConsoleColor.Red)); @@ -117,7 +129,9 @@ namespace Spectre.Console.Tests.Unit public void Should_Reset_Colors_Correctly_After_Line_Break_In_Text() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); // When console.WriteLine("Hello\nWorld", new Style().Background(ConsoleColor.Red)); diff --git a/src/Spectre.Console.Tests/Unit/BarChartTests.cs b/src/Spectre.Console.Tests/Unit/BarChartTests.cs index 34319e7..ea565b7 100644 --- a/src/Spectre.Console.Tests/Unit/BarChartTests.cs +++ b/src/Spectre.Console.Tests/Unit/BarChartTests.cs @@ -15,7 +15,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new BarChart() @@ -34,7 +34,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Correctly_2() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new BarChart() diff --git a/src/Spectre.Console.Tests/Unit/BoxBorderTests.cs b/src/Spectre.Console.Tests/Unit/BoxBorderTests.cs index e41ff59..798264b 100644 --- a/src/Spectre.Console.Tests/Unit/BoxBorderTests.cs +++ b/src/Spectre.Console.Tests/Unit/BoxBorderTests.cs @@ -33,7 +33,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var panel = Fixture.GetPanel().NoBorder(); // When @@ -65,7 +65,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var panel = Fixture.GetPanel().AsciiBorder(); // When @@ -97,7 +97,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var panel = Fixture.GetPanel().DoubleBorder(); // When @@ -129,7 +129,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var panel = Fixture.GetPanel().HeavyBorder(); // When @@ -158,7 +158,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var panel = Fixture.GetPanel().RoundedBorder(); // When @@ -187,7 +187,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var panel = Fixture.GetPanel().SquareBorder(); // When diff --git a/src/Spectre.Console.Tests/Unit/BreakdownChartTests.cs b/src/Spectre.Console.Tests/Unit/BreakdownChartTests.cs index 1ff4352..8654dc8 100644 --- a/src/Spectre.Console.Tests/Unit/BreakdownChartTests.cs +++ b/src/Spectre.Console.Tests/Unit/BreakdownChartTests.cs @@ -15,7 +15,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var chart = Fixture.GetChart(); // When @@ -30,7 +30,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_With_Specific_Width() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var chart = Fixture.GetChart().Width(60); // When @@ -45,7 +45,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Correctly_With_Specific_Value_Formatter() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var chart = Fixture.GetChart() .Width(60) .Culture("sv-SE") @@ -63,7 +63,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Correctly_Without_Tags() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var chart = Fixture.GetChart().Width(60).HideTags(); // When @@ -78,7 +78,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Correctly_Without_Tag_Values() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var chart = Fixture.GetChart().Width(60).HideTagValues(); // When @@ -93,7 +93,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Correctly_With_Specific_Culture() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var chart = Fixture.GetChart().Width(60).Culture("sv-SE"); // When @@ -108,7 +108,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_FullSize_Mode_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var chart = Fixture.GetChart().Width(60).FullSize(); // When @@ -123,7 +123,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Correct_Ansi() { // Given - var console = new FakeAnsiConsole(ColorSystem.EightBit, width: 80); + var console = new TestConsole().EmitAnsiSequences(); var chart = Fixture.GetChart().Width(60).FullSize(); // When diff --git a/src/Spectre.Console.Tests/Unit/CalendarTests.cs b/src/Spectre.Console.Tests/Unit/CalendarTests.cs index af8228e..aace6c0 100644 --- a/src/Spectre.Console.Tests/Unit/CalendarTests.cs +++ b/src/Spectre.Console.Tests/Unit/CalendarTests.cs @@ -16,7 +16,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Calendar_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var calendar = new Calendar(2020, 10) .AddCalendarEvent(new DateTime(2020, 9, 1)) .AddCalendarEvent(new DateTime(2020, 10, 3)) @@ -34,7 +34,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Center_Calendar_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var calendar = new Calendar(2020, 10) .Centered() .AddCalendarEvent(new DateTime(2020, 9, 1)) @@ -53,7 +53,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Left_Align_Calendar_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var calendar = new Calendar(2020, 10) .LeftAligned() .AddCalendarEvent(new DateTime(2020, 9, 1)) @@ -72,7 +72,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Right_Align_Calendar_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var calendar = new Calendar(2020, 10) .RightAligned() .AddCalendarEvent(new DateTime(2020, 9, 1)) @@ -91,7 +91,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Calendar_Correctly_For_Specific_Culture() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var calendar = new Calendar(2020, 10, 15) .Culture("de-DE") .AddCalendarEvent(new DateTime(2020, 9, 1)) diff --git a/src/Spectre.Console.Tests/Unit/CanvasTests.cs b/src/Spectre.Console.Tests/Unit/CanvasTests.cs index 89537cb..e306863 100644 --- a/src/Spectre.Console.Tests/Unit/CanvasTests.cs +++ b/src/Spectre.Console.Tests/Unit/CanvasTests.cs @@ -42,7 +42,10 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Canvas_Correctly() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); + var canvas = new Canvas(width: 5, height: 5); canvas.SetPixel(0, 0, Color.Red); canvas.SetPixel(4, 0, Color.Green); @@ -61,7 +64,10 @@ namespace Spectre.Console.Tests.Unit public async Task Simple_Measure() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); + var panel = new Panel(new Canvas(width: 2, height: 2) .SetPixel(0, 0, Color.Aqua) .SetPixel(1, 1, Color.Grey)); @@ -78,7 +84,11 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Scale_Down_Canvas_Is_Bigger_Than_Terminal() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, width: 10); + var console = new TestConsole() + .Width(10) + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); + var canvas = new Canvas(width: 20, height: 10); canvas.SetPixel(0, 0, Color.Aqua); canvas.SetPixel(19, 9, Color.Grey); @@ -95,7 +105,10 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Scale_Down_Canvas_If_MaxWidth_Is_Set() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, width: 80); + var console = new TestConsole() + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); + var canvas = new Canvas(width: 20, height: 10) { MaxWidth = 10 }; canvas.SetPixel(0, 0, Color.Aqua); canvas.SetPixel(19, 9, Color.Aqua); @@ -111,7 +124,11 @@ namespace Spectre.Console.Tests.Unit public void Should_Not_Render_Canvas_If_Canvas_Cannot_Be_Scaled_Down() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, width: 10); + var console = new TestConsole() + .Width(10) + .Colors(ColorSystem.Standard) + .EmitAnsiSequences(); + var canvas = new Canvas(width: 20, height: 2); canvas.SetPixel(0, 0, Color.Aqua); canvas.SetPixel(19, 1, Color.Grey); diff --git a/src/Spectre.Console.Tests/Unit/Cli/Annotations/CommandArgumentAttributeTests.Rendering.cs b/src/Spectre.Console.Tests/Unit/Cli/Annotations/CommandArgumentAttributeTests.Rendering.cs index 7015565..a7c83b2 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/Annotations/CommandArgumentAttributeTests.Rendering.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/Annotations/CommandArgumentAttributeTests.Rendering.cs @@ -79,7 +79,7 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public static string Run(params string[] args) where TSettings : CommandSettings { - using (var writer = new FakeConsole()) + using (var writer = new TestConsole()) { var app = new CommandApp(); app.Configure(c => c.ConfigureConsole(writer)); diff --git a/src/Spectre.Console.Tests/Unit/Cli/Annotations/CommandOptionAttributeTests.Rendering.cs b/src/Spectre.Console.Tests/Unit/Cli/Annotations/CommandOptionAttributeTests.Rendering.cs index 9176343..7e3977f 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/Annotations/CommandOptionAttributeTests.Rendering.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/Annotations/CommandOptionAttributeTests.Rendering.cs @@ -26,11 +26,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Encountered unexpected character '$'."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Encountered unexpected character '$'."); + return Verifier.Verify(result.Output); } } @@ -48,11 +48,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Encountered unterminated value name 'BAR'."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Encountered unterminated value name 'BAR'."); + return Verifier.Verify(result.Output); } } @@ -70,11 +70,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Options without name are not allowed."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Options without name are not allowed."); + return Verifier.Verify(result.Output); } } @@ -92,11 +92,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Option names cannot start with a digit."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Option names cannot start with a digit."); + return Verifier.Verify(result.Output); } } @@ -114,11 +114,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Encountered invalid character '$' in option name."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Encountered invalid character '$' in option name."); + return Verifier.Verify(result.Output); } } @@ -136,11 +136,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Long option names must consist of more than one character."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Long option names must consist of more than one character."); + return Verifier.Verify(result.Output); } } @@ -158,11 +158,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Short option names can not be longer than one character."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Short option names can not be longer than one character."); + return Verifier.Verify(result.Output); } } @@ -180,11 +180,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Multiple option values are not supported."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Multiple option values are not supported."); + return Verifier.Verify(result.Output); } } @@ -202,11 +202,11 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("Encountered invalid character '$' in value name."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("Encountered invalid character '$' in value name."); + return Verifier.Verify(result.Output); } } @@ -224,23 +224,22 @@ namespace Spectre.Console.Tests.Unit.Cli.Annotations public Task Should_Return_Correct_Text() { // Given, When - var (message, result) = Fixture.Run(); + var result = Fixture.Run(); // Then - message.ShouldBe("No long or short name for option has been specified."); - return Verifier.Verify(result); + result.Exception.Message.ShouldBe("No long or short name for option has been specified."); + return Verifier.Verify(result.Output); } } private static class Fixture { - public static (string Message, string Output) Run(params string[] args) + public static CommandAppFailure Run(params string[] args) where TSettings : CommandSettings { - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(c => { - c.PropagateExceptions(); c.AddCommand>("foo"); }); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Constructor.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Constructor.cs index c86b494..fa261cd 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Constructor.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Constructor.cs @@ -1,4 +1,4 @@ -using Shouldly; +using Shouldly; using Spectre.Console.Cli; using Spectre.Console.Testing; using Xunit; @@ -42,10 +42,10 @@ namespace Spectre.Console.Tests.Unit.Cli } [Fact] - public void Nullable_objects_in_settings_are_populated_properly() + public void Should_Populate_Nullable_Objects_In_Settings() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -53,19 +53,21 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, _, _, settings) = fixture.Run("null"); - var nullableSettings = (NullableSettings)settings; + var result = fixture.Run("null"); // Then - nullableSettings.Detailed.ShouldBeNull(); - nullableSettings.Extra.ShouldBeNull(); + result.Settings.ShouldBeOfType().And(settings => + { + settings.Detailed.ShouldBeNull(); + settings.Extra.ShouldBeNull(); + }); } [Fact] - public void Nullable_objects_with_init_in_settings_are_populated_properly() + public void Should_Populate_Nullable_Objects_With_Init_In_Settings() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -73,19 +75,21 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, _, _, settings) = fixture.Run("null"); - var nullableSettings = (NullableWithInitSettings)settings; + var result = fixture.Run("null"); // Then - nullableSettings.Detailed.ShouldBeNull(); - nullableSettings.Extra.ShouldBeNull(); + result.Settings.ShouldBeOfType().And(settings => + { + settings.Detailed.ShouldBeNull(); + settings.Extra.ShouldBeNull(); + }); } [Fact] - public void Regular_settings_are_populated_properly() + public void Should_Populate_Regular_Settings() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -93,12 +97,14 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, _, _, settings) = fixture.Run("null", "-d", "true", "first-item"); - var nullableSettings = (NullableSettings)settings; + var result = fixture.Run("null", "-d", "true", "first-item"); // Then - nullableSettings.Detailed.ShouldBe(true); - nullableSettings.Extra.ShouldBe(new[] { "first-item" }); + result.Settings.ShouldBeOfType().And(settings => + { + settings.Detailed.ShouldBe(true); + settings.Extra.ShouldBe(new[] { "first-item" }); + }); } } } \ No newline at end of file diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.FlagValues.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.FlagValues.cs index 9e7483d..2b1c500 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.FlagValues.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.FlagValues.cs @@ -66,7 +66,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Set_Flag_And_Value_If_Both_Were_Provided() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -74,14 +74,11 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] - { - "foo", "--serve", "123", - }); + var result = app.Run(new[] { "foo", "--serve", "123", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(flag => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(flag => { flag.Serve.IsSet.ShouldBeTrue(); flag.Serve.Value.ShouldBe(123); @@ -92,7 +89,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Only_Set_Flag_If_No_Value_Was_Provided() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -100,14 +97,11 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] - { - "foo", "--serve", - }); + var result = app.Run(new[] { "foo", "--serve" }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(flag => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(flag => { flag.Serve.IsSet.ShouldBeTrue(); flag.Serve.Value.ShouldBe(0); @@ -118,7 +112,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Set_Value_To_Default_Value_If_None_Was_Explicitly_Set() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -126,14 +120,11 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] - { - "foo", "--serve", - }); + var result = app.Run(new[] { "foo", "--serve" }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(flag => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(flag => { flag.Serve.IsSet.ShouldBeTrue(); flag.Serve.Value.ShouldBe(987); @@ -144,7 +135,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Create_Unset_Instance_If_Flag_Was_Not_Set() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -152,14 +143,11 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] - { - "foo", - }); + var result = app.Run(new[] { "foo" }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(flag => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(flag => { flag.Serve.IsSet.ShouldBeFalse(); flag.Serve.Value.ShouldBe(0); @@ -170,7 +158,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Create_Unset_Instance_With_Null_For_Nullable_Value_Type_If_Flag_Was_Not_Set() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -178,14 +166,11 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] - { - "foo", - }); + var result = app.Run(new[] { "foo" }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(flag => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(flag => { flag.Serve.IsSet.ShouldBeFalse(); flag.Serve.Value.ShouldBeNull(); @@ -201,9 +186,11 @@ namespace Spectre.Console.Tests.Unit.Cli string expected) { // Given - var flag = new FlagValue(); - flag.Value = value; - flag.IsSet = isSet; + var flag = new FlagValue + { + Value = value, + IsSet = isSet, + }; // When var result = flag.ToString(); @@ -220,8 +207,10 @@ namespace Spectre.Console.Tests.Unit.Cli string expected) { // Given - var flag = new FlagValue(); - flag.IsSet = isSet; + var flag = new FlagValue + { + IsSet = isSet, + }; // When var result = flag.ToString(); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Help.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Help.cs index 6cfc738..cc8bf6c 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Help.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Help.cs @@ -19,7 +19,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Output_Root_Correctly() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -29,10 +29,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -40,7 +40,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Skip_Hidden_Commands() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -52,10 +52,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -63,7 +63,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Output_Command_Correctly() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -75,10 +75,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("cat", "--help"); + var result = fixture.Run("cat", "--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -86,7 +86,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Output_Leaf_Correctly() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -98,10 +98,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("cat", "lion", "--help"); + var result = fixture.Run("cat", "lion", "--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -109,18 +109,18 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Output_Default_Command_Correctly() { // Given - var fixture = new CommandAppFixture(); - fixture.WithDefaultCommand(); + var fixture = new CommandAppTester(); + fixture.SetDefaultCommand(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -128,7 +128,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Output_Root_Examples_Defined_On_Root() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -139,10 +139,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -150,7 +150,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Output_Root_Examples_Defined_On_Direct_Children_If_Root_Have_No_Examples() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -161,10 +161,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -172,7 +172,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Output_Root_Examples_Defined_On_Leaves_If_No_Other_Examples_Are_Found() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -187,10 +187,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -198,7 +198,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Only_Output_Command_Examples_Defined_On_Command() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -215,10 +215,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("animal", "--help"); + var result = fixture.Run("animal", "--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -226,8 +226,8 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Output_Root_Examples_If_Default_Command_Is_Specified() { // Given - var fixture = new CommandAppFixture(); - fixture.WithDefaultCommand(); + var fixture = new CommandAppTester(); + fixture.SetDefaultCommand(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -235,10 +235,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -246,7 +246,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Not_Show_Truncated_Command_Table_If_Commands_Are_Missing_Description() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); @@ -254,10 +254,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -265,18 +265,18 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_List_Arguments_In_Correct_Order() { // Given - var fixture = new CommandAppFixture(); - fixture.WithDefaultCommand>(); + var fixture = new CommandAppTester(); + fixture.SetDefaultCommand>(); fixture.Configure(configurator => { configurator.SetApplicationName("myapp"); }); // When - var (_, output, _, _) = fixture.Run("--help"); + var result = fixture.Run("--help"); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } } } diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Injection.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Injection.cs index 77a56c2..183b2bf 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Injection.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Injection.cs @@ -35,10 +35,10 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Inject_Parameters() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); var dependency = new FakeDependency(); - app.WithDefaultCommand>(); + app.SetDefaultCommand>(); app.Configure(config => { config.Settings.Registrar.RegisterInstance(dependency); @@ -46,15 +46,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "--name", "foo", "--age", "35", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(injected => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(injected => { injected.ShouldNotBeNull(); injected.Fake.ShouldBeSameAs(dependency); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Pairs.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Pairs.cs index 3e8cb64..ea1565d 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Pairs.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Pairs.cs @@ -127,15 +127,15 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Map_Pairs_To_Pair_Deconstructable_Collection_Using_Default_Deconstructort() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); app.Configure(config => { config.PropagateExceptions(); }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "--var", "foo=1", "--var", "foo=3", @@ -143,8 +143,8 @@ namespace Spectre.Console.Tests.Unit.Cli }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(pair => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(pair => { pair.Values.ShouldNotBeNull(); pair.Values.Count.ShouldBe(2); @@ -160,41 +160,41 @@ namespace Spectre.Console.Tests.Unit.Cli string input, string expected) { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); // When - var (result, output, _, settings) = app.Run(new[] + var result = app.Run(new[] { "--var", input, }); // Then - result.ShouldBe(-1); - output.ShouldBe(expected); + result.ExitCode.ShouldBe(-1); + result.Output.ShouldBe(expected); } [Fact] public void Should_Map_Lookup_Values() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); app.Configure(config => { config.PropagateExceptions(); }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "--var", "foo=bar", "--var", "foo=qux", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(pair => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(pair => { pair.Values.ShouldNotBeNull(); pair.Values.Count.ShouldBe(1); @@ -206,23 +206,23 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Map_Dictionary_Values() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); app.Configure(config => { config.PropagateExceptions(); }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "--var", "foo=bar", "--var", "baz=qux", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(pair => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(pair => { pair.Values.ShouldNotBeNull(); pair.Values.Count.ShouldBe(2); @@ -235,23 +235,23 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Map_Latest_Value_Of_Same_Key_When_Mapping_To_Dictionary() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); app.Configure(config => { config.PropagateExceptions(); }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "--var", "foo=bar", "--var", "foo=qux", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(pair => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(pair => { pair.Values.ShouldNotBeNull(); pair.Values.Count.ShouldBe(1); @@ -263,23 +263,23 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Map_ReadOnly_Dictionary_Values() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); app.Configure(config => { config.PropagateExceptions(); }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "--var", "foo=bar", "--var", "baz=qux", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(pair => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(pair => { pair.Values.ShouldNotBeNull(); pair.Values.Count.ShouldBe(2); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Parsing.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Parsing.cs index 1f3ecc2..15390e9 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Parsing.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Parsing.cs @@ -657,7 +657,7 @@ namespace Spectre.Console.Tests.Unit.Cli public string Run(params string[] args) { - using (var console = new FakeConsole()) + using (var console = new TestConsole()) { var app = new CommandApp(); _appConfiguration?.Invoke(app); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Remaining.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Remaining.cs index cd95a31..fc09c6a 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Remaining.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Remaining.cs @@ -14,7 +14,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Register_Remaining_Parsed_Arguments_With_Context() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -25,7 +25,7 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, ctx, _) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", "--", "--foo", "bar", "--foo", "baz", @@ -34,18 +34,18 @@ namespace Spectre.Console.Tests.Unit.Cli }); // Then - ctx.Remaining.Parsed.Count.ShouldBe(4); - ctx.ShouldHaveRemainingArgument("foo", values: new[] { "bar", "baz" }); - ctx.ShouldHaveRemainingArgument("b", values: new[] { (string)null }); - ctx.ShouldHaveRemainingArgument("a", values: new[] { (string)null }); - ctx.ShouldHaveRemainingArgument("r", values: new[] { (string)null }); + result.Context.Remaining.Parsed.Count.ShouldBe(4); + result.Context.ShouldHaveRemainingArgument("foo", values: new[] { "bar", "baz" }); + result.Context.ShouldHaveRemainingArgument("b", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("a", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("r", values: new[] { (string)null }); } [Fact] public void Should_Register_Remaining_Raw_Arguments_With_Context() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -56,7 +56,7 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, ctx, _) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", "--", "--foo", "bar", "-bar", "\"baz\"", "qux", @@ -64,13 +64,13 @@ namespace Spectre.Console.Tests.Unit.Cli }); // Then - ctx.Remaining.Raw.Count.ShouldBe(6); - ctx.Remaining.Raw[0].ShouldBe("--foo"); - ctx.Remaining.Raw[1].ShouldBe("bar"); - ctx.Remaining.Raw[2].ShouldBe("-bar"); - ctx.Remaining.Raw[3].ShouldBe("baz"); - ctx.Remaining.Raw[4].ShouldBe("qux"); - ctx.Remaining.Raw[5].ShouldBe("foo bar baz qux"); + result.Context.Remaining.Raw.Count.ShouldBe(6); + result.Context.Remaining.Raw[0].ShouldBe("--foo"); + result.Context.Remaining.Raw[1].ShouldBe("bar"); + result.Context.Remaining.Raw[2].ShouldBe("-bar"); + result.Context.Remaining.Raw[3].ShouldBe("baz"); + result.Context.Remaining.Raw[4].ShouldBe("qux"); + result.Context.Remaining.Raw[5].ShouldBe("foo bar baz qux"); } } } diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Sensitivity.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Sensitivity.cs index d82150e..3f3ccff 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Sensitivity.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Sensitivity.cs @@ -12,7 +12,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Treat_Commands_As_Case_Sensitive_If_Specified() { // Given - var app = new CommandAppFixture(); + var app = new CommandApp(); app.Configure(config => { config.UseStrictParsing(); @@ -39,7 +39,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Treat_Long_Options_As_Case_Sensitive_If_Specified() { // Given - var app = new CommandAppFixture(); + var app = new CommandApp(); app.Configure(config => { config.UseStrictParsing(); @@ -66,7 +66,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Treat_Short_Options_As_Case_Sensitive() { // Given - var app = new CommandAppFixture(); + var app = new CommandApp(); app.Configure(config => { config.UseStrictParsing(); @@ -92,7 +92,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Suppress_Case_Sensitivity_If_Specified() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.UseStrictParsing(); @@ -102,14 +102,14 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "Command", "--Foo", "bar", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(vec => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(vec => { vec.Foo.ShouldBe("bar"); }); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.TypeConverters.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.TypeConverters.cs index 820f84c..e312eef 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.TypeConverters.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.TypeConverters.cs @@ -14,7 +14,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Bind_Using_Custom_Type_Converter_If_Specified() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -22,15 +22,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "cat", "--name", "Tiger", "--agility", "FOOBAR", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(cat => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(cat => { cat.Agility.ShouldBe(6); }); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Unsafe.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Unsafe.cs index 75460a8..6f2c60b 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Unsafe.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Unsafe.cs @@ -15,7 +15,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Can_Mix_Safe_And_Unsafe_Configurators() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -31,15 +31,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "animal", "--alive", "mammal", "--name", "Rufus", "dog", "12", "--good-boy", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Age.ShouldBe(12); dog.GoodBoy.ShouldBe(true); @@ -52,7 +52,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Can_Turn_Safety_On_After_Turning_It_Off_For_Branch() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -69,15 +69,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "animal", "--alive", "mammal", "--name", "Rufus", "dog", "12", "--good-boy", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Age.ShouldBe(12); dog.GoodBoy.ShouldBe(true); @@ -112,7 +112,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_1() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -128,15 +128,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "animal", "--alive", "mammal", "--name", "Rufus", "dog", "12", "--good-boy", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Age.ShouldBe(12); dog.GoodBoy.ShouldBe(true); @@ -149,7 +149,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_2() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -157,15 +157,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "dog", "12", "4", "--good-boy", "--name", "Rufus", "--alive", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Legs.ShouldBe(12); dog.Age.ShouldBe(4); @@ -179,7 +179,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_3() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -191,15 +191,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "animal", "dog", "12", "--good-boy", "--name", "Rufus", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Age.ShouldBe(12); dog.GoodBoy.ShouldBe(true); @@ -212,7 +212,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_4() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -223,15 +223,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", "--good-boy", "--name", "Rufus", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Legs.ShouldBe(4); dog.Age.ShouldBe(12); @@ -245,7 +245,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_5() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -253,14 +253,14 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "multi", "--foo", "a", "--foo", "b", "--bar", "1", "--foo", "c", "--bar", "2", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(vec => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(vec => { vec.Foo.Length.ShouldBe(3); vec.Foo.ShouldBe(new[] { "a", "b", "c" }); @@ -273,7 +273,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_6() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -281,14 +281,14 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "multi", "a", "b", "c", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(vec => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(vec => { vec.Foo.Length.ShouldBe(3); vec.Foo.ShouldBe(new[] { "a", "b", "c" }); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Vectors.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Vectors.cs index fe60da5..1d9b11a 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Vectors.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Vectors.cs @@ -56,7 +56,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Assign_Values_To_Argument_Vector() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -64,14 +64,14 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "multi", "a", "b", "c", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(vec => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(vec => { vec.Foo.Length.ShouldBe(3); vec.Foo[0].ShouldBe("a"); @@ -84,7 +84,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Assign_Values_To_Option_Vector() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -92,15 +92,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "cmd", "--foo", "red", "--bar", "4", "--foo", "blue", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(vec => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(vec => { vec.Foo.ShouldBe(new string[] { "red", "blue" }); vec.Bar.ShouldBe(new int[] { 4 }); diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Version.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Version.cs index 324d9e2..62c2c41 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Version.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Version.cs @@ -13,7 +13,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Output_The_Version_To_The_Console() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(config => { config.AddBranch("animal", animal => @@ -27,10 +27,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run(Constants.VersionCommand); + var result = fixture.Run(Constants.VersionCommand); // Then - output.ShouldStartWith("Spectre.Cli version "); + result.Output.ShouldStartWith("Spectre.Cli version "); } } } diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Xml.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Xml.cs index 40c266d..bb5ca24 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Xml.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Xml.cs @@ -19,7 +19,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Dump_Correct_Model_For_Case_1() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(config => { config.PropagateExceptions(); @@ -34,10 +34,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run(Constants.XmlDocCommand); + var result = fixture.Run(Constants.XmlDocCommand); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -45,17 +45,17 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Dump_Correct_Model_For_Case_2() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(config => { config.AddCommand("dog"); }); // When - var (_, output, _, _) = fixture.Run(Constants.XmlDocCommand); + var result = fixture.Run(Constants.XmlDocCommand); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -63,7 +63,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Dump_Correct_Model_For_Case_3() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(config => { config.AddBranch("animal", animal => @@ -74,10 +74,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run(Constants.XmlDocCommand); + var result = fixture.Run(Constants.XmlDocCommand); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -85,7 +85,7 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Dump_Correct_Model_For_Case_4() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(config => { config.AddBranch("animal", animal => @@ -95,10 +95,10 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (_, output, _, _) = fixture.Run(Constants.XmlDocCommand); + var result = fixture.Run(Constants.XmlDocCommand); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -106,17 +106,17 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Dump_Correct_Model_For_Case_5() { // Given - var fixture = new CommandAppFixture(); + var fixture = new CommandAppTester(); fixture.Configure(config => { config.AddCommand("cmd"); }); // When - var (_, output, _, _) = fixture.Run(Constants.XmlDocCommand); + var result = fixture.Run(Constants.XmlDocCommand); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } [Fact] @@ -124,17 +124,18 @@ namespace Spectre.Console.Tests.Unit.Cli public Task Should_Dump_Correct_Model_For_Model_With_Default_Command() { // Given - var fixture = new CommandAppFixture().WithDefaultCommand(); + var fixture = new CommandAppTester(); + fixture.SetDefaultCommand(); fixture.Configure(config => { config.AddCommand("horse"); }); // When - var (_, output, _, _) = fixture.Run(Constants.XmlDocCommand); + var result = fixture.Run(Constants.XmlDocCommand); // Then - return Verifier.Verify(output); + return Verifier.Verify(result.Output); } } } diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.cs index 329dd5d..63fa00d 100644 --- a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.cs +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.cs @@ -13,7 +13,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_1() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -28,15 +28,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "animal", "--alive", "mammal", "--name", "Rufus", "dog", "12", "--good-boy", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Age.ShouldBe(12); dog.GoodBoy.ShouldBe(true); @@ -49,7 +49,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_2() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -57,15 +57,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "dog", "12", "4", "--good-boy", "--name", "Rufus", "--alive", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Legs.ShouldBe(12); dog.Age.ShouldBe(4); @@ -79,7 +79,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_3() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -91,15 +91,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "animal", "dog", "12", "--good-boy", "--name", "Rufus", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Age.ShouldBe(12); dog.GoodBoy.ShouldBe(true); @@ -112,7 +112,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_4() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -123,15 +123,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", "--good-boy", "--name", "Rufus", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Legs.ShouldBe(4); dog.Age.ShouldBe(12); @@ -145,7 +145,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_5() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -153,15 +153,15 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "multi", "--foo", "a", "--foo", "b", "--bar", "1", "--foo", "c", "--bar", "2", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(vec => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(vec => { vec.Foo.Length.ShouldBe(3); vec.Foo.ShouldBe(new[] { "a", "b", "c" }); @@ -174,7 +174,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Pass_Case_6() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -182,14 +182,14 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "multi", "a", "b", "c", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(vec => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(vec => { vec.Foo.Length.ShouldBe(3); vec.Foo.ShouldBe(new[] { "a", "b", "c" }); @@ -200,7 +200,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Be_Able_To_Use_Command_Alias() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -208,14 +208,14 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "multiple", "--foo", "a", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(vec => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(vec => { vec.Foo.Length.ShouldBe(1); vec.Foo.ShouldBe(new[] { "a" }); @@ -226,19 +226,19 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Assign_Default_Value_To_Optional_Argument() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); app.Configure(config => { config.PropagateExceptions(); }); // When - var (result, _, _, settings) = app.Run(Array.Empty()); + var result = app.Run(Array.Empty()); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(settings => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(settings => { settings.Greeting.ShouldBe("Hello World"); }); @@ -248,19 +248,19 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Assign_Default_Value_To_Optional_Argument_Using_Converter_If_Necessary() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); app.Configure(config => { config.PropagateExceptions(); }); // When - var (result, _, _, settings) = app.Run(Array.Empty()); + var result = app.Run(Array.Empty()); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(settings => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(settings => { settings.Greeting.ShouldBe(5); }); @@ -270,8 +270,8 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Throw_If_Required_Argument_Have_Default_Value() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand>(); + var app = new CommandAppTester(); + app.SetDefaultCommand>(); app.Configure(config => { config.PropagateExceptions(); @@ -385,35 +385,6 @@ namespace Spectre.Console.Tests.Unit.Cli registrar.Registrations[typeof(DogSettings)].ShouldContain(typeof(DogSettings)); } - [Theory] - [InlineData("true", true)] - [InlineData("True", true)] - [InlineData("false", false)] - [InlineData("False", false)] - public void Should_Accept_Explicit_Boolan_Flag(string value, bool expected) - { - // Given - var app = new CommandAppFixture(); - app.Configure(config => - { - config.PropagateExceptions(); - config.AddCommand("dog"); - }); - - // When - var (result, _, _, settings) = app.Run(new[] - { - "dog", "12", "4", "--alive", value, - }); - - // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => - { - dog.IsAlive.ShouldBe(expected); - }); - } - [Fact] public void Can_Register_Command_Settings_When_Configuring_Application() { @@ -447,6 +418,35 @@ namespace Spectre.Console.Tests.Unit.Cli registrar.Registrations[typeof(MammalSettings)].ShouldContain(typeof(MammalSettings)); } + [Theory] + [InlineData("true", true)] + [InlineData("True", true)] + [InlineData("false", false)] + [InlineData("False", false)] + public void Should_Accept_Explicit_Boolan_Flag(string value, bool expected) + { + // Given + var app = new CommandAppTester(); + app.Configure(config => + { + config.PropagateExceptions(); + config.AddCommand("dog"); + }); + + // When + var result = app.Run(new[] + { + "dog", "12", "4", "--alive", value, + }); + + // Then + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => + { + dog.IsAlive.ShouldBe(expected); + }); + } + [Fact] public void Should_Throw_When_Encountering_Unknown_Option_In_Strict_Mode() { @@ -473,7 +473,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Add_Unknown_Option_To_Remaining_Arguments_In_Relaxed_Mode() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -484,23 +484,23 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, ctx, _) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", "--foo", "bar", }); // Then - ctx.ShouldNotBeNull(); - ctx.Remaining.Parsed.Count.ShouldBe(1); - ctx.ShouldHaveRemainingArgument("foo", values: new[] { "bar" }); + result.Context.ShouldNotBeNull(); + result.Context.Remaining.Parsed.Count.ShouldBe(1); + result.Context.ShouldHaveRemainingArgument("foo", values: new[] { "bar" }); } [Fact] public void Should_Add_Unknown_Boolean_Option_To_Remaining_Arguments_In_Relaxed_Mode() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -511,33 +511,33 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, ctx, _) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", "--foo", }); // Then - ctx.ShouldNotBeNull(); - ctx.Remaining.Parsed.Count.ShouldBe(1); - ctx.ShouldHaveRemainingArgument("foo", values: new[] { (string)null }); + result.Context.ShouldNotBeNull(); + result.Context.Remaining.Parsed.Count.ShouldBe(1); + result.Context.ShouldHaveRemainingArgument("foo", values: new[] { (string)null }); } [Fact] public void Should_Be_Able_To_Set_The_Default_Command() { // Given - var app = new CommandAppFixture(); - app.WithDefaultCommand(); + var app = new CommandAppTester(); + app.SetDefaultCommand(); // When - var (result, _, _, settings) = app.Run(new[] + var result = app.Run(new[] { "4", "12", "--good-boy", "--name", "Rufus", }); // Then - result.ShouldBe(0); - settings.ShouldBeOfType().And(dog => + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(dog => { dog.Legs.ShouldBe(4); dog.Age.ShouldBe(12); @@ -550,7 +550,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Set_Command_Name_In_Context() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -561,21 +561,21 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, ctx, _) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", }); // Then - ctx.ShouldNotBeNull(); - ctx.Name.ShouldBe("dog"); + result.Context.ShouldNotBeNull(); + result.Context.Name.ShouldBe("dog"); } [Fact] public void Should_Pass_Command_Data_In_Context() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -586,14 +586,14 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, ctx, _) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", }); // Then - ctx.ShouldNotBeNull(); - ctx.Data.ShouldBe(123); + result.Context.ShouldNotBeNull(); + result.Context.Data.ShouldBe(123); } public sealed class Delegate_Commands @@ -670,7 +670,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Register_Remaining_Parsed_Arguments_With_Context() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -681,7 +681,7 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, ctx, _) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", "--", "--foo", "bar", "--foo", "baz", @@ -689,18 +689,18 @@ namespace Spectre.Console.Tests.Unit.Cli }); // Then - ctx.Remaining.Parsed.Count.ShouldBe(4); - ctx.ShouldHaveRemainingArgument("foo", values: new[] { "bar", "baz" }); - ctx.ShouldHaveRemainingArgument("b", values: new[] { (string)null }); - ctx.ShouldHaveRemainingArgument("a", values: new[] { (string)null }); - ctx.ShouldHaveRemainingArgument("r", values: new[] { (string)null }); + result.Context.Remaining.Parsed.Count.ShouldBe(4); + result.Context.ShouldHaveRemainingArgument("foo", values: new[] { "bar", "baz" }); + result.Context.ShouldHaveRemainingArgument("b", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("a", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("r", values: new[] { (string)null }); } [Fact] public void Should_Register_Remaining_Raw_Arguments_With_Context() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.PropagateExceptions(); @@ -711,19 +711,19 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, ctx, _) = app.Run(new[] + var result = app.Run(new[] { "animal", "4", "dog", "12", "--", "--foo", "bar", "-bar", "\"baz\"", "qux", }); // Then - ctx.Remaining.Raw.Count.ShouldBe(5); - ctx.Remaining.Raw[0].ShouldBe("--foo"); - ctx.Remaining.Raw[1].ShouldBe("bar"); - ctx.Remaining.Raw[2].ShouldBe("-bar"); - ctx.Remaining.Raw[3].ShouldBe("baz"); - ctx.Remaining.Raw[4].ShouldBe("qux"); + result.Context.Remaining.Raw.Count.ShouldBe(5); + result.Context.Remaining.Raw[0].ShouldBe("--foo"); + result.Context.Remaining.Raw[1].ShouldBe("bar"); + result.Context.Remaining.Raw[2].ShouldBe("-bar"); + result.Context.Remaining.Raw[3].ShouldBe("baz"); + result.Context.Remaining.Raw[4].ShouldBe("qux"); } } @@ -733,7 +733,7 @@ namespace Spectre.Console.Tests.Unit.Cli public void Should_Not_Propagate_Runtime_Exceptions_If_Not_Explicitly_Told_To_Do_So() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.AddBranch("animal", animal => @@ -744,27 +744,27 @@ namespace Spectre.Console.Tests.Unit.Cli }); // When - var (result, _, _, _) = app.Run(new[] { "animal", "4", "dog", "101", "--name", "Rufus" }); + var result = app.Run(new[] { "animal", "4", "dog", "101", "--name", "Rufus" }); // Then - result.ShouldBe(-1); + result.ExitCode.ShouldBe(-1); } [Fact] public void Should_Not_Propagate_Exceptions_If_Not_Explicitly_Told_To_Do_So() { // Given - var app = new CommandAppFixture(); + var app = new CommandAppTester(); app.Configure(config => { config.AddCommand("throw"); }); // When - var (result, _, _, _) = app.Run(new[] { "throw" }); + var result = app.Run(new[] { "throw" }); // Then - result.ShouldBe(-1); + result.ExitCode.ShouldBe(-1); } } } diff --git a/src/Spectre.Console.Tests/Unit/ColumnsTests.cs b/src/Spectre.Console.Tests/Unit/ColumnsTests.cs index 40c0bca..ab4fd4f 100644 --- a/src/Spectre.Console.Tests/Unit/ColumnsTests.cs +++ b/src/Spectre.Console.Tests/Unit/ColumnsTests.cs @@ -22,7 +22,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Columns_Correctly() { // Given - var console = new FakeConsole(width: 61); + var console = new TestConsole().Width(61); var users = new[] { new User { Name = "Savannah Thompson", Country = "Australia" }, diff --git a/src/Spectre.Console.Tests/Unit/EmojiTests.cs b/src/Spectre.Console.Tests/Unit/EmojiTests.cs index 97a89c5..0cd3587 100644 --- a/src/Spectre.Console.Tests/Unit/EmojiTests.cs +++ b/src/Spectre.Console.Tests/Unit/EmojiTests.cs @@ -10,7 +10,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Substitute_Emoji_Shortcodes_In_Markdown() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole(); // When console.Markup("Hello :globe_showing_europe_africa:!"); @@ -57,7 +57,7 @@ namespace Spectre.Console.Tests.Unit public void Can_Handle_Different_Combinations(string markup, string expected) { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole(); // When console.Markup(markup); @@ -70,7 +70,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Leave_Single_Colons() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole(); // When console.Markup("Hello :globe_showing_europe_africa:! Output: good"); @@ -80,10 +80,10 @@ namespace Spectre.Console.Tests.Unit } [Fact] - public void Unknown_emojis_should_remain() + public void Unknown_emojis_should_remain_unchanged() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole(); // When console.Markup("Hello :globe_showing_flat_earth:!"); diff --git a/src/Spectre.Console.Tests/Unit/ExceptionTests.cs b/src/Spectre.Console.Tests/Unit/ExceptionTests.cs index 65e0d48..2a4eb26 100644 --- a/src/Spectre.Console.Tests/Unit/ExceptionTests.cs +++ b/src/Spectre.Console.Tests/Unit/ExceptionTests.cs @@ -17,7 +17,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Write_Exception() { // Given - var console = new FakeConsole(width: 1024); + var console = new TestConsole().Width(1024); var dex = GetException(() => TestExceptions.MethodThatThrows(null)); // When @@ -32,7 +32,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Write_Exception_With_Shortened_Types() { // Given - var console = new FakeConsole(width: 1024); + var console = new TestConsole().Width(1024); var dex = GetException(() => TestExceptions.MethodThatThrows(null)); // When @@ -47,7 +47,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Write_Exception_With_Shortened_Methods() { // Given - var console = new FakeConsole(width: 1024); + var console = new TestConsole().Width(1024); var dex = GetException(() => TestExceptions.MethodThatThrows(null)); // When @@ -62,7 +62,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Write_Exception_With_Inner_Exception() { // Given - var console = new FakeConsole(width: 1024); + var console = new TestConsole().Width(1024); var dex = GetException(() => TestExceptions.ThrowWithInnerException()); // When @@ -77,7 +77,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Write_Exceptions_With_Generic_Type_Parameters_In_Callsite_As_Expected() { // Given - var console = new FakeConsole(width: 1024); + var console = new TestConsole().Width(1024); var dex = GetException(() => TestExceptions.ThrowWithGenericInnerException()); // When diff --git a/src/Spectre.Console.Tests/Unit/FigletTests.cs b/src/Spectre.Console.Tests/Unit/FigletTests.cs index 7b0f016..1b279a0 100644 --- a/src/Spectre.Console.Tests/Unit/FigletTests.cs +++ b/src/Spectre.Console.Tests/Unit/FigletTests.cs @@ -15,7 +15,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Load_Font_From_Stream() { // Given - var console = new FakeConsole(width: 180); + var console = new TestConsole().Width(180); var font = FigletFont.Load(EmbeddedResourceReader.LoadResourceStream("Spectre.Console.Tests/Data/starwars.flf")); var text = new FigletText(font, "Patrik was here"); @@ -31,7 +31,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Text_Correctly() { // Given - var console = new FakeConsole(width: 70); + var console = new TestConsole().Width(70); var text = new FigletText(FigletFont.Default, "Patrik was here"); // When @@ -46,7 +46,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Wrapped_Text_Correctly() { // Given - var console = new FakeConsole(width: 70); + var console = new TestConsole().Width(70); var text = new FigletText(FigletFont.Default, "Spectre.Console"); // When @@ -61,7 +61,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Left_Aligned_Text_Correctly() { // Given - var console = new FakeConsole(width: 120); + var console = new TestConsole().Width(120); var text = new FigletText(FigletFont.Default, "Spectre.Console") .Alignment(Justify.Left); @@ -77,7 +77,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Centered_Text_Correctly() { // Given - var console = new FakeConsole(width: 120); + var console = new TestConsole().Width(120); var text = new FigletText(FigletFont.Default, "Spectre.Console") .Alignment(Justify.Center); @@ -93,7 +93,7 @@ namespace Spectre.Console.Tests.Unit public async Task Should_Render_Right_Aligned_Text_Correctly() { // Given - var console = new FakeConsole(width: 120); + var console = new TestConsole().Width(120); var text = new FigletText(FigletFont.Default, "Spectre.Console") .Alignment(Justify.Right); diff --git a/src/Spectre.Console.Tests/Unit/GridTests.cs b/src/Spectre.Console.Tests/Unit/GridTests.cs index 8b2ea51..d0996bc 100644 --- a/src/Spectre.Console.Tests/Unit/GridTests.cs +++ b/src/Spectre.Console.Tests/Unit/GridTests.cs @@ -87,7 +87,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Add_Empty_Row() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var grid = new Grid(); grid.AddColumns(2); grid.AddRow("Foo", "Bar"); @@ -108,7 +108,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Grid_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var grid = new Grid(); grid.AddColumn(); grid.AddColumn(); @@ -127,7 +127,7 @@ namespace Spectre.Console.Tests.Unit [Expectation("Render_2")] public Task Should_Render_Grid_Correctly_2() { - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var grid = new Grid(); grid.AddColumn(new GridColumn { NoWrap = true }); grid.AddColumn(new GridColumn { Padding = new Padding(2, 0, 0, 0) }); @@ -147,7 +147,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Grid_Column_Alignment_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var grid = new Grid(); grid.AddColumn(new GridColumn { Alignment = Justify.Right }); grid.AddColumn(new GridColumn { Alignment = Justify.Center }); @@ -168,7 +168,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Use_Default_Padding() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var grid = new Grid(); grid.AddColumns(3); grid.AddRow("Foo", "Bar", "Baz"); @@ -187,7 +187,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Explicit_Grid_Column_Padding_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var grid = new Grid(); grid.AddColumn(new GridColumn { Padding = new Padding(3, 0, 0, 0) }); grid.AddColumn(new GridColumn { Padding = new Padding(0, 0, 0, 0) }); diff --git a/src/Spectre.Console.Tests/Unit/MarkupTests.cs b/src/Spectre.Console.Tests/Unit/MarkupTests.cs index 99bbc4f..2e571c9 100644 --- a/src/Spectre.Console.Tests/Unit/MarkupTests.cs +++ b/src/Spectre.Console.Tests/Unit/MarkupTests.cs @@ -47,7 +47,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Throw_If_Closing_Tag_Is_Not_Properly_Escaped(string input) { // Given - var console = new FakeConsole(); + var console = new TestConsole(); // When var result = Record.Exception(() => new Markup(input)); @@ -62,7 +62,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Escape_Markup_Blocks_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var markup = new Markup("Hello [[ World ]] !"); // When @@ -78,7 +78,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Render_Links_As_Expected(string input, string output) { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var markup = new Markup(input); // When @@ -89,10 +89,10 @@ namespace Spectre.Console.Tests.Unit } [Fact] - public void Should_not_fail_with_brackets_on_calls_without_args() + public void Should_Not_Fail_With_Brackets_On_Calls_Without_Args() { // Given - var console = new FakeAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); + var console = new TestConsole(); // When console.MarkupLine("{"); diff --git a/src/Spectre.Console.Tests/Unit/PadderTests.cs b/src/Spectre.Console.Tests/Unit/PadderTests.cs index ba09355..29d5870 100644 --- a/src/Spectre.Console.Tests/Unit/PadderTests.cs +++ b/src/Spectre.Console.Tests/Unit/PadderTests.cs @@ -15,7 +15,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Padded_Object_Correctly() { // Given - var console = new FakeConsole(width: 60); + var console = new TestConsole().Width(60); var table = new Table(); table.AddColumn("Foo"); table.AddColumn("Bar"); @@ -34,7 +34,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Expanded_Padded_Object_Correctly() { // Given - var console = new FakeConsole(width: 60); + var console = new TestConsole().Width(60); var table = new Table(); table.AddColumn("Foo"); table.AddColumn("Bar"); @@ -55,7 +55,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Padded_Object_Correctly_When_Nested_Within_Other_Object() { // Given - var console = new FakeConsole(width: 60); + var console = new TestConsole().Width(60); var table = new Table(); table.AddColumn("Foo"); table.AddColumn("Bar", c => c.PadLeft(0).PadRight(0)); diff --git a/src/Spectre.Console.Tests/Unit/PanelTests.cs b/src/Spectre.Console.Tests/Unit/PanelTests.cs index 17ebf70..72cbc2c 100644 --- a/src/Spectre.Console.Tests/Unit/PanelTests.cs +++ b/src/Spectre.Console.Tests/Unit/PanelTests.cs @@ -17,7 +17,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel(new Text("Hello World"))); @@ -31,7 +31,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_With_Padding_Set_To_Zero() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel(new Text("Hello World")) @@ -48,7 +48,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_With_Padding() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel(new Text("Hello World")) @@ -65,7 +65,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_With_Header() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel("Hello World") @@ -84,7 +84,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_With_Left_Aligned_Header() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel("Hello World") @@ -102,7 +102,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_With_Centered_Header() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel("Hello World") @@ -120,7 +120,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_With_Right_Aligned_Header() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel("Hello World") @@ -138,7 +138,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Collapse_Header_If_It_Will_Not_Fit() { // Given - var console = new FakeConsole(width: 10); + var console = new TestConsole().Width(10); // When console.Write(new Panel("Hello World") @@ -156,7 +156,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_With_Unicode_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel(new Text(" \n💩\n "))); @@ -170,7 +170,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_With_Multiple_Lines() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel(new Text("Hello World\nFoo Bar"))); @@ -184,7 +184,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Preserve_Explicit_Line_Ending() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var text = new Panel( new Markup("I heard [underline on blue]you[/] like 📦\n\n\n\nSo I put a 📦 in a 📦")); @@ -200,7 +200,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Expand_Panel_If_Enabled() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel(new Text("Hello World")) @@ -217,7 +217,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Justify_Child_To_Right_Correctly() { // Given - var console = new FakeConsole(width: 25); + var console = new TestConsole().Width(25); // When console.Write( @@ -235,7 +235,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Center_Child_Correctly() { // Given - var console = new FakeConsole(width: 25); + var console = new TestConsole().Width(25); // When console.Write( @@ -253,7 +253,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Panel_Inside_Panel_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Panel(new Panel(new Text("Hello World")))); @@ -267,7 +267,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Wrap_Content_Correctly() { // Given - var console = new FakeConsole(width: 84); + var console = new TestConsole().Width(84); var rows = new List(); var grid = new Grid(); grid.AddColumn(new GridColumn().PadLeft(2).PadRight(0)); @@ -292,7 +292,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Wrap_Table_With_CJK_Tables_In_Panel_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.AddColumn("测试"); diff --git a/src/Spectre.Console.Tests/Unit/Progress/ProgressColumnFixture.cs b/src/Spectre.Console.Tests/Unit/Progress/ProgressColumnFixture.cs index 9d2550c..132b9db 100644 --- a/src/Spectre.Console.Tests/Unit/Progress/ProgressColumnFixture.cs +++ b/src/Spectre.Console.Tests/Unit/Progress/ProgressColumnFixture.cs @@ -19,7 +19,7 @@ namespace Spectre.Console.Tests.Unit public string Render() { - var console = new FakeConsole(); + var console = new TestConsole(); var context = new RenderContext(console.Profile.Capabilities); console.Write(Column.Render(context, Task, TimeSpan.Zero)); return console.Output; diff --git a/src/Spectre.Console.Tests/Unit/Progress/ProgressTests.cs b/src/Spectre.Console.Tests/Unit/Progress/ProgressTests.cs index d8fa393..db32612 100644 --- a/src/Spectre.Console.Tests/Unit/Progress/ProgressTests.cs +++ b/src/Spectre.Console.Tests/Unit/Progress/ProgressTests.cs @@ -15,7 +15,10 @@ namespace Spectre.Console.Tests.Unit public void Should_Render_Task_Correctly() { // Given - var console = new FakeAnsiConsole(ColorSystem.TrueColor, width: 10); + var console = new TestConsole() + .Width(10) + .Interactive() + .EmitAnsiSequences(); var progress = new Progress(console) .Columns(new[] { new ProgressBarColumn() }) @@ -40,7 +43,10 @@ namespace Spectre.Console.Tests.Unit public void Should_Not_Auto_Clear_If_Specified() { // Given - var console = new FakeAnsiConsole(ColorSystem.TrueColor, width: 10); + var console = new TestConsole() + .Width(10) + .Interactive() + .EmitAnsiSequences(); var progress = new Progress(console) .Columns(new[] { new ProgressBarColumn() }) @@ -66,7 +72,9 @@ namespace Spectre.Console.Tests.Unit public Task Should_Reduce_Width_If_Needed() { // Given - var console = new FakeConsole(width: 20); + var console = new TestConsole() + .Width(20) + .Interactive(); var progress = new Progress(console) .Columns(new ProgressColumn[] @@ -96,8 +104,10 @@ namespace Spectre.Console.Tests.Unit public void Setting_Max_Value_Should_Set_The_MaxValue_And_Cap_Value() { // Given + var console = new TestConsole() + .Interactive(); + var task = default(ProgressTask); - var console = new FakeConsole(); var progress = new Progress(console) .Columns(new[] { new ProgressBarColumn() }) .AutoRefresh(false) @@ -120,8 +130,10 @@ namespace Spectre.Console.Tests.Unit public void Setting_Value_Should_Override_Incremented_Value() { // Given + var console = new TestConsole() + .Interactive(); + var task = default(ProgressTask); - var console = new FakeConsole(); var progress = new Progress(console) .Columns(new[] { new ProgressBarColumn() }) .AutoRefresh(false) @@ -144,8 +156,10 @@ namespace Spectre.Console.Tests.Unit public void Setting_Value_To_MaxValue_Should_Finish_Task() { // Given + var console = new TestConsole() + .Interactive(); + var task = default(ProgressTask); - var console = new FakeConsole(); var progress = new Progress(console) .Columns(new[] { new ProgressBarColumn() }) .AutoRefresh(false) @@ -166,8 +180,10 @@ namespace Spectre.Console.Tests.Unit public void Should_Increment_Manually_Set_Value() { // Given + var console = new TestConsole() + .Interactive(); + var task = default(ProgressTask); - var console = new FakeConsole(); var progress = new Progress(console) .Columns(new[] { new ProgressBarColumn() }) .AutoRefresh(false) @@ -189,10 +205,14 @@ namespace Spectre.Console.Tests.Unit public void Should_Hide_Completed_Tasks() { // Given + var console = new TestConsole() + .Width(10) + .Interactive() + .EmitAnsiSequences(); + var taskFinished = default(ProgressTask); var taskInProgress1 = default(ProgressTask); var taskInProgress2 = default(ProgressTask); - var console = new FakeAnsiConsole(ColorSystem.TrueColor, width: 10); var progress = new Progress(console) .Columns(new[] { new ProgressBarColumn() }) diff --git a/src/Spectre.Console.Tests/Unit/PromptTests.cs b/src/Spectre.Console.Tests/Unit/PromptTests.cs index c273250..02ce5c3 100644 --- a/src/Spectre.Console.Tests/Unit/PromptTests.cs +++ b/src/Spectre.Console.Tests/Unit/PromptTests.cs @@ -17,7 +17,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Return_Validation_Error_If_Value_Cannot_Be_Converted() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushTextWithEnter("ninety-nine"); console.Input.PushTextWithEnter("99"); @@ -33,7 +33,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Chose_Default_Value_If_Nothing_Is_Entered() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushKey(ConsoleKey.Enter); // When @@ -52,7 +52,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Return_Error_If_An_Invalid_Choice_Is_Made() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushTextWithEnter("Apple"); console.Input.PushTextWithEnter("Banana"); @@ -72,7 +72,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Accept_Choice_In_List() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushTextWithEnter("Orange"); // When @@ -91,7 +91,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Auto_Complete_To_First_Choice_If_Pressing_Tab_On_Empty_String() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushKey(ConsoleKey.Tab); console.Input.PushKey(ConsoleKey.Enter); @@ -111,7 +111,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Auto_Complete_To_Best_Match() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushText("Band"); console.Input.PushKey(ConsoleKey.Tab); console.Input.PushKey(ConsoleKey.Enter); @@ -132,7 +132,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Auto_Complete_To_Next_Choice_When_Pressing_Tab_On_A_Match() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushText("Apple"); console.Input.PushKey(ConsoleKey.Tab); console.Input.PushKey(ConsoleKey.Enter); @@ -153,7 +153,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Return_Error_If_Custom_Validation_Fails() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushTextWithEnter("22"); console.Input.PushTextWithEnter("102"); console.Input.PushTextWithEnter("ABC"); @@ -186,7 +186,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Use_Custom_Converter() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushTextWithEnter("Banana"); // When @@ -206,7 +206,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Chose_Masked_Default_Value_If_Nothing_Is_Entered_And_Prompt_Is_Secret() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Input.PushKey(ConsoleKey.Enter); // When diff --git a/src/Spectre.Console.Tests/Unit/RecorderTests.cs b/src/Spectre.Console.Tests/Unit/RecorderTests.cs index 3ee9282..08fad59 100644 --- a/src/Spectre.Console.Tests/Unit/RecorderTests.cs +++ b/src/Spectre.Console.Tests/Unit/RecorderTests.cs @@ -15,7 +15,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Export_Text_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var recorder = new Recorder(console); recorder.Write(new Table() @@ -35,7 +35,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Export_Html_Text_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var recorder = new Recorder(console); recorder.Write(new Table() diff --git a/src/Spectre.Console.Tests/Unit/RenderHookTests.cs b/src/Spectre.Console.Tests/Unit/RenderHookTests.cs index 7bba3cc..cdbc5f6 100644 --- a/src/Spectre.Console.Tests/Unit/RenderHookTests.cs +++ b/src/Spectre.Console.Tests/Unit/RenderHookTests.cs @@ -21,7 +21,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Inject_Renderable_Before_Writing_To_Console() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); console.Pipeline.Attach(new HelloRenderHook()); // When diff --git a/src/Spectre.Console.Tests/Unit/RowsTests.cs b/src/Spectre.Console.Tests/Unit/RowsTests.cs index 3e43116..6c38390 100644 --- a/src/Spectre.Console.Tests/Unit/RowsTests.cs +++ b/src/Spectre.Console.Tests/Unit/RowsTests.cs @@ -16,7 +16,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Rows() { // Given - var console = new FakeConsole(width: 60); + var console = new TestConsole().Width(60); var rows = new Rows( new IRenderable[] { @@ -39,7 +39,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Rows_Correctly_Inside_Other_Widget() { // Given - var console = new FakeConsole(width: 60); + var console = new TestConsole().Width(60); var table = new Table() .AddColumns("Foo", "Bar") .AddRow("HELLO WORLD") @@ -62,7 +62,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Rows_Correctly_Inside_Other_Widget_When_Expanded() { // Given - var console = new FakeConsole(width: 60); + var console = new TestConsole().Width(60); var table = new Table() .AddColumns("Foo", "Bar") .AddRow("HELLO WORLD") diff --git a/src/Spectre.Console.Tests/Unit/RuleTests.cs b/src/Spectre.Console.Tests/Unit/RuleTests.cs index 36d98d7..ee70f0c 100644 --- a/src/Spectre.Console.Tests/Unit/RuleTests.cs +++ b/src/Spectre.Console.Tests/Unit/RuleTests.cs @@ -16,7 +16,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Default_Rule_Without_Title() { // Given - var console = new FakeConsole(width: 40); + var console = new TestConsole().Width(40); // When console.Write(new Rule()); @@ -30,7 +30,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Default_Rule_With_Specified_Border() { // Given - var console = new FakeConsole(width: 40); + var console = new TestConsole().Width(40); // When console.Write(new Rule().DoubleBorder()); @@ -44,7 +44,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_With_Specified_Box() { // Given - var console = new FakeConsole(width: 40); + var console = new TestConsole().Width(40); // When console.Write(new Rule("Hello World").DoubleBorder()); @@ -58,7 +58,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Default_Rule_With_Title_Centered_By_Default() { // Given - var console = new FakeConsole(width: 40); + var console = new TestConsole().Width(40); // When console.Write(new Rule("Hello World")); @@ -72,7 +72,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Default_Rule_With_Title_Left_Aligned() { // Given - var console = new FakeConsole(width: 40); + var console = new TestConsole().Width(40); // When console.Write(new Rule("Hello World") @@ -89,7 +89,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Default_Rule_With_Title_Right_Aligned() { // Given - var console = new FakeConsole(width: 40); + var console = new TestConsole().Width(40); // When console.Write(new Rule("Hello World") @@ -106,7 +106,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Convert_Line_Breaks_In_Title_To_Spaces() { // Given - var console = new FakeConsole(width: 40); + var console = new TestConsole().Width(40); // When console.Write(new Rule("Hello\nWorld\r\n!")); @@ -120,7 +120,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Truncate_Title() { // Given - var console = new FakeConsole(width: 40); + var console = new TestConsole().Width(40); // When console.Write(new Rule(" Hello World ")); @@ -145,7 +145,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Truncate_Too_Long_Title(int width, string input, string expected) { // Given - var console = new FakeConsole(width); + var console = new TestConsole().Width(width); // When console.Write(new Rule(input)); diff --git a/src/Spectre.Console.Tests/Unit/StatusTests.cs b/src/Spectre.Console.Tests/Unit/StatusTests.cs index e223813..cecbd87 100644 --- a/src/Spectre.Console.Tests/Unit/StatusTests.cs +++ b/src/Spectre.Console.Tests/Unit/StatusTests.cs @@ -1,3 +1,5 @@ +using System; +using System.Collections.Generic; using System.Threading.Tasks; using Spectre.Console.Testing; using Spectre.Verify.Extensions; @@ -10,16 +12,36 @@ namespace Spectre.Console.Tests.Unit [ExpectationPath("Widgets/Status")] public sealed class StatusTests { + public sealed class DummySpinner1 : Spinner + { + public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); + public override bool IsUnicode => true; + public override IReadOnlyList Frames => new List { "*", }; + } + + public sealed class DummySpinner2 : Spinner + { + public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); + public override bool IsUnicode => true; + public override IReadOnlyList Frames => new List { "-", }; + } + [Fact] [Expectation("Render")] public Task Should_Render_Status_Correctly() { // Given - var console = new FakeAnsiConsole(ColorSystem.TrueColor, width: 10); + var console = new TestConsole() + .Colors(ColorSystem.TrueColor) + .Width(10) + .Interactive() + .EmitAnsiSequences(); - var status = new Status(console); - status.AutoRefresh = false; - status.Spinner = new DummySpinner1(); + var status = new Status(console) + { + AutoRefresh = false, + Spinner = new DummySpinner1(), + }; // When status.Start("foo", ctx => diff --git a/src/Spectre.Console.Tests/Unit/TableBorderTests.cs b/src/Spectre.Console.Tests/Unit/TableBorderTests.cs index e3d7dff..f2d311b 100644 --- a/src/Spectre.Console.Tests/Unit/TableBorderTests.cs +++ b/src/Spectre.Console.Tests/Unit/TableBorderTests.cs @@ -43,7 +43,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().NoBorder(); // When @@ -85,7 +85,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().AsciiBorder(); // When @@ -127,7 +127,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().Ascii2Border(); // When @@ -169,7 +169,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().AsciiDoubleHeadBorder(); // When @@ -211,7 +211,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().SquareBorder(); // When @@ -253,7 +253,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().RoundedBorder(); // When @@ -295,7 +295,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().MinimalBorder(); // When @@ -337,7 +337,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().MinimalHeavyHeadBorder(); // When @@ -379,7 +379,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().MinimalDoubleHeadBorder(); // When @@ -421,7 +421,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().SimpleBorder(); // When @@ -463,7 +463,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().HorizontalBorder(); // When @@ -505,7 +505,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().SimpleHeavyBorder(); // When @@ -547,7 +547,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().HeavyBorder(); // When @@ -589,7 +589,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().HeavyEdgeBorder(); // When @@ -631,7 +631,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().HeavyHeadBorder(); // When @@ -673,7 +673,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().DoubleBorder(); // When @@ -715,7 +715,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().DoubleEdgeBorder(); // When @@ -757,7 +757,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable().MarkdownBorder(); // When @@ -772,7 +772,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Left_Aligned_Table_Columns_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable(header2: Justify.Left).MarkdownBorder(); // When @@ -787,7 +787,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Center_Aligned_Table_Columns_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable(header2: Justify.Center).MarkdownBorder(); // When @@ -802,7 +802,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Right_Aligned_Table_Columns_As_Expected() { // Given - var console = new FakeConsole(); + var console = new TestConsole(); var table = Fixture.GetTable(header2: Justify.Right).MarkdownBorder(); // When diff --git a/src/Spectre.Console.Tests/Unit/TableTests.cs b/src/Spectre.Console.Tests/Unit/TableTests.cs index b781674..f5f2f6a 100644 --- a/src/Spectre.Console.Tests/Unit/TableTests.cs +++ b/src/Spectre.Console.Tests/Unit/TableTests.cs @@ -131,7 +131,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.AddColumns("Foo", "Bar", "Baz"); table.AddRow("Qux", "Corgi", "Waldo"); @@ -151,7 +151,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.AddColumns("Foo", "Bar", "Baz"); table.AddRow("Qux", "Corgi", "Waldo"); @@ -169,7 +169,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_With_Footers_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.AddColumn(new TableColumn("Foo").Footer("Oof").RightAligned()); table.AddColumn("Bar"); @@ -189,7 +189,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Left_Align_Table_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.Alignment = Justify.Left; table.AddColumns("Foo", "Bar", "Baz"); @@ -208,7 +208,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Center_Table_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.Alignment = Justify.Center; table.AddColumns("Foo", "Bar", "Baz"); @@ -227,7 +227,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Right_Align_Table_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.Alignment = Justify.Right; table.AddColumns("Foo", "Bar", "Baz"); @@ -246,7 +246,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_Nested_In_Panels_Correctly() { // A simple table - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table() { Border = TableBorder.Rounded }; table.AddColumn("Foo"); table.AddColumn("Bar"); @@ -269,7 +269,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_With_Column_Justification_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.AddColumn(new TableColumn("Foo") { Alignment = Justify.Left }); table.AddColumn(new TableColumn("Bar") { Alignment = Justify.Right }); @@ -289,7 +289,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Expand_Table_To_Available_Space_If_Specified() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table() { Expand = true }; table.AddColumns("Foo", "Bar", "Baz"); table.AddRow("Qux", "Corgi", "Waldo"); @@ -307,7 +307,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_With_Multiple_Rows_In_Cell_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.AddColumns("Foo", "Bar", "Baz"); table.AddRow("Qux\nQuuux", "Corgi", "Waldo"); @@ -325,7 +325,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_With_Cell_Padding_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.AddColumns("Foo", "Bar"); table.AddColumn(new TableColumn("Baz") { Padding = new Padding(3, 0, 2, 0) }); @@ -344,7 +344,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_Without_Rows() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table(); table.AddColumns("Foo", "Bar"); table.AddColumn(new TableColumn("Baz") { Padding = new Padding(3, 0, 2, 0) }); @@ -361,7 +361,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Not_Draw_Tables_That_Are_Impossible_To_Draw() { // Given - var console = new FakeConsole(width: 25); + var console = new TestConsole().Width(25); var first = new Table().Border(TableBorder.Rounded).BorderColor(Color.Red); first.AddColumn(new TableColumn("[u]PS1[/]").Centered()); @@ -399,7 +399,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Table_With_Title_And_Caption_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table { Border = TableBorder.Rounded }; table.Title = new TableTitle("Hello World"); table.Caption = new TableTitle("Goodbye World"); @@ -419,7 +419,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Left_Align_Table_With_Title_And_Caption_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table { Border = TableBorder.Rounded }; table.LeftAligned(); table.Title = new TableTitle("Hello World"); @@ -440,7 +440,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Center_Table_With_Title_And_Caption_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table { Border = TableBorder.Rounded }; table.Centered(); table.Title = new TableTitle("Hello World"); @@ -461,7 +461,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Right_Align_Table_With_Title_And_Caption_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var table = new Table { Border = TableBorder.Rounded }; table.RightAligned(); table.Title = new TableTitle("Hello World"); diff --git a/src/Spectre.Console.Tests/Unit/TextTests.cs b/src/Spectre.Console.Tests/Unit/TextTests.cs index 6504779..f630e64 100644 --- a/src/Spectre.Console.Tests/Unit/TextTests.cs +++ b/src/Spectre.Console.Tests/Unit/TextTests.cs @@ -11,11 +11,11 @@ namespace Spectre.Console.Tests.Unit public void Should_Consider_The_Longest_Word_As_Minimum_Width() { // Given - var caps = new FakeCapabilities { Unicode = true }; + var caps = new TestCapabilities { Unicode = true }; var text = new Text("Foo Bar Baz\nQux\nLol mobile"); // When - var result = ((IRenderable)text).Measure(new RenderContext(caps), 80); + var result = ((IRenderable)text).Measure(caps.CreateRenderContext(), 80); // Then result.Min.ShouldBe(6); @@ -25,11 +25,11 @@ namespace Spectre.Console.Tests.Unit public void Should_Consider_The_Longest_Line_As_Maximum_Width() { // Given - var caps = new FakeCapabilities { Unicode = true }; + var caps = new TestCapabilities { Unicode = true }; var text = new Text("Foo Bar Baz\nQux\nLol mobile"); // When - var result = ((IRenderable)text).Measure(new RenderContext(caps), 80); + var result = ((IRenderable)text).Measure(caps.CreateRenderContext(), 80); // Then result.Max.ShouldBe(11); @@ -39,7 +39,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Render_Unstyled_Text_As_Expected() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var text = new Text("Hello World"); // When @@ -55,7 +55,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Write_Line_Breaks(string input) { // Given - var console = new FakeConsole(width: 5); + var console = new TestConsole(); var text = new Text(input); // When @@ -69,7 +69,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Render_Panel_2() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); // When console.Write(new Markup("[b]Hello World[/]\n[yellow]Hello World[/]")); @@ -87,7 +87,7 @@ namespace Spectre.Console.Tests.Unit int width, string input, string expected) { // Given - var console = new FakeConsole(width); + var console = new TestConsole().Width(width); var text = new Text(input); // When @@ -106,7 +106,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Overflow_Text_Correctly(Overflow overflow, string expected) { // Given - var console = new FakeConsole(14); + var console = new TestConsole().Width(14); var text = new Text("foo pneumonoultramicroscopicsilicovolcanoconiosis bar qux") .Overflow(overflow); diff --git a/src/Spectre.Console.Tests/Unit/TreeTests.cs b/src/Spectre.Console.Tests/Unit/TreeTests.cs index c99f95f..9244bcb 100644 --- a/src/Spectre.Console.Tests/Unit/TreeTests.cs +++ b/src/Spectre.Console.Tests/Unit/TreeTests.cs @@ -17,7 +17,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Tree_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var tree = new Tree(new Text("Root node")).Guide(TreeGuide.DoubleLine); @@ -48,7 +48,7 @@ namespace Spectre.Console.Tests.Unit public Task Should_Render_Tree_With_No_Child_Nodes_Correctly() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var tree = new Tree(new Text("Root node")); // When @@ -62,7 +62,7 @@ namespace Spectre.Console.Tests.Unit public void Should_Throw_If_Tree_Contains_Cycles() { // Given - var console = new FakeConsole(width: 80); + var console = new TestConsole(); var child2 = new TreeNode(new Text("child 2")); var child3 = new TreeNode(new Text("child 3")); diff --git a/src/Spectre.Console.Testing/EmbeddedResourceReader.cs b/src/Spectre.Console.Tests/Utilities/EmbeddedResourceReader.cs similarity index 88% rename from src/Spectre.Console.Testing/EmbeddedResourceReader.cs rename to src/Spectre.Console.Tests/Utilities/EmbeddedResourceReader.cs index 0b3fe21..5368ae1 100644 --- a/src/Spectre.Console.Testing/EmbeddedResourceReader.cs +++ b/src/Spectre.Console.Tests/Utilities/EmbeddedResourceReader.cs @@ -14,7 +14,7 @@ namespace Spectre.Console.Tests } var assembly = Assembly.GetCallingAssembly(); - resourceName = resourceName.ReplaceExact("/", "."); + resourceName = resourceName.Replace("/", "."); return assembly.GetManifestResourceStream(resourceName); } @@ -31,7 +31,7 @@ namespace Spectre.Console.Tests throw new ArgumentNullException(nameof(resourceName)); } - resourceName = resourceName.ReplaceExact("/", "."); + resourceName = resourceName.Replace("/", "."); return assembly.GetManifestResourceStream(resourceName); } } diff --git a/src/Spectre.Console.Testing/Extensions/CommandContextExtensions.cs b/src/Spectre.Console.Tests/Utilities/Extensions/CommandContextExtensions.cs similarity index 100% rename from src/Spectre.Console.Testing/Extensions/CommandContextExtensions.cs rename to src/Spectre.Console.Tests/Utilities/Extensions/CommandContextExtensions.cs diff --git a/src/Spectre.Console.Tests/Utilities/Extensions/ShouldlyExtensions.cs b/src/Spectre.Console.Tests/Utilities/Extensions/ShouldlyExtensions.cs new file mode 100644 index 0000000..e099d06 --- /dev/null +++ b/src/Spectre.Console.Tests/Utilities/Extensions/ShouldlyExtensions.cs @@ -0,0 +1,20 @@ +using System; +using System.Diagnostics; + +namespace Spectre.Console +{ + public static class ShouldlyExtensions + { + [DebuggerStepThrough] + public static T And(this T item, Action action) + { + if (action == null) + { + throw new ArgumentNullException(nameof(action)); + } + + action(item); + return item; + } + } +} diff --git a/src/Spectre.Console.Tests/Utilities/Extensions/TestConsoleExtensions.cs b/src/Spectre.Console.Tests/Utilities/Extensions/TestConsoleExtensions.cs new file mode 100644 index 0000000..f9e3613 --- /dev/null +++ b/src/Spectre.Console.Tests/Utilities/Extensions/TestConsoleExtensions.cs @@ -0,0 +1,44 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using Spectre.Console.Testing; + +namespace Spectre.Console.Tests +{ + public static class TestConsoleExtensions + { + private static readonly Regex _lineNumberRegex = new Regex(":\\d+", RegexOptions.Singleline); + private static readonly Regex _filenameRegex = new Regex("\\sin\\s.*cs:nn", RegexOptions.Multiline); + + public static string WriteNormalizedException(this TestConsole console, Exception ex, ExceptionFormats formats = ExceptionFormats.Default) + { + if (!string.IsNullOrWhiteSpace(console.Output)) + { + throw new InvalidOperationException("Output buffer is not empty."); + } + + console.WriteException(ex, formats); + return string.Join("\n", NormalizeStackTrace(console.Output) + .NormalizeLineEndings() + .Split(new char[] { '\n' }) + .Select(line => line.TrimEnd())); + } + + public static string NormalizeStackTrace(string text) + { + text = _lineNumberRegex.Replace(text, match => + { + return ":nn"; + }); + + return _filenameRegex.Replace(text, match => + { + var value = match.Value; + var index = value.LastIndexOfAny(new[] { '\\', '/' }); + var filename = value.Substring(index + 1, value.Length - index - 1); + + return $" in /xyz/{filename}"; + }); + } + } +} diff --git a/src/Spectre.Console.Testing/Fakes/FakeTypeRegistrar.cs b/src/Spectre.Console.Tests/Utilities/FakeTypeRegistrar.cs similarity index 89% rename from src/Spectre.Console.Testing/Fakes/FakeTypeRegistrar.cs rename to src/Spectre.Console.Tests/Utilities/FakeTypeRegistrar.cs index f04fc57..bfc3348 100644 --- a/src/Spectre.Console.Testing/Fakes/FakeTypeRegistrar.cs +++ b/src/Spectre.Console.Tests/Utilities/FakeTypeRegistrar.cs @@ -6,13 +6,11 @@ namespace Spectre.Console.Testing { public sealed class FakeTypeRegistrar : ITypeRegistrar { - private readonly ITypeResolver _resolver; public Dictionary> Registrations { get; } public Dictionary> Instances { get; } - public FakeTypeRegistrar(ITypeResolver resolver = null) + public FakeTypeRegistrar() { - _resolver = resolver; Registrations = new Dictionary>(); Instances = new Dictionary>(); } @@ -52,7 +50,7 @@ namespace Spectre.Console.Testing public ITypeResolver Build() { - return _resolver; + return null; } } } diff --git a/src/Spectre.Console.sln b/src/Spectre.Console.sln index dea2096..6650d9c 100644 --- a/src/Spectre.Console.sln +++ b/src/Spectre.Console.sln @@ -86,6 +86,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{A0C772BA-C EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "..\examples\Shared\Shared.csproj", "{8428A7DD-29FC-4417-9CA0-B90D34B26AB2}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Internal", "Internal", "{0FC844AD-FCBB-4B2F-9AEC-6CB5505E49E3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU