using CliFx.Analyzers.Tests.Utils; using Microsoft.CodeAnalysis.Diagnostics; using Xunit; namespace CliFx.Analyzers.Tests; public class SystemConsoleShouldBeAvoidedAnalyzerSpecs { private static DiagnosticAnalyzer Analyzer { get; } = new SystemConsoleShouldBeAvoidedAnalyzer(); [Fact] public void Analyzer_reports_an_error_if_a_command_calls_a_method_on_SystemConsole() { // Arrange // lang=csharp const string code = """ [Command] public class MyCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) { Console.WriteLine("Hello world"); return default; } } """; // Act & assert Analyzer.Should().ProduceDiagnostics(code); } [Fact] public void Analyzer_reports_an_error_if_a_command_accesses_a_property_on_SystemConsole() { // Arrange // lang=csharp const string code = """ [Command] public class MyCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) { Console.ForegroundColor = ConsoleColor.Black; return default; } } """; // Act & assert Analyzer.Should().ProduceDiagnostics(code); } [Fact] public void Analyzer_reports_an_error_if_a_command_calls_a_method_on_a_property_of_SystemConsole() { // Arrange // lang=csharp const string code = """ [Command] public class MyCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) { Console.Error.WriteLine("Hello world"); return default; } } """; // Act & assert Analyzer.Should().ProduceDiagnostics(code); } [Fact] public void Analyzer_does_not_report_an_error_if_a_command_interacts_with_the_console_through_IConsole() { // Arrange // lang=csharp const string code = """ [Command] public class MyCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) { console.Output.WriteLine("Hello world"); return default; } } """; // Act & assert Analyzer.Should().NotProduceDiagnostics(code); } [Fact] public void Analyzer_does_not_report_an_error_if_IConsole_is_not_available_in_the_current_method() { // Arrange // lang=csharp const string code = """ [Command] public class MyCommand : ICommand { public void SomeOtherMethod() => Console.WriteLine("Test"); public ValueTask ExecuteAsync(IConsole console) => default; } """; // Act & assert Analyzer.Should().NotProduceDiagnostics(code); } [Fact] public void Analyzer_does_not_report_an_error_if_a_command_does_not_access_SystemConsole() { // Arrange // lang=csharp const string code = """ [Command] public class MyCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) { return default; } } """; // Act & assert Analyzer.Should().NotProduceDiagnostics(code); } }