Use CSharpier

This commit is contained in:
Tyrrrz
2023-08-22 21:20:04 +03:00
parent a4726fcefd
commit 21b601da66
99 changed files with 975 additions and 1163 deletions

View File

@@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="Basic.Reference.Assemblies.Net70" Version="1.4.2" />
<PackageReference Include="coverlet.collector" Version="6.0.0" PrivateAssets="all" />
<PackageReference Include="CSharpier.MsBuild" Version="0.25.0" PrivateAssets="all" />
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.2" PrivateAssets="all" />
<PackageReference Include="FluentAssertions" Version="6.11.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.0" />

View File

@@ -13,8 +13,7 @@ public class CommandMustBeAnnotatedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyCommand : ICommand
{
public ValueTask ExecuteAsync(IConsole console) => default;
@@ -30,8 +29,7 @@ public class CommandMustBeAnnotatedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public abstract class MyCommand : ICommand
{
@@ -48,8 +46,7 @@ public class CommandMustBeAnnotatedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public abstract class MyCommand : ICommand
{
public ValueTask ExecuteAsync(IConsole console) => default;
@@ -65,8 +62,7 @@ public class CommandMustBeAnnotatedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class Foo
{
public int Bar { get; init; } = 5;
@@ -76,4 +72,4 @@ public class CommandMustBeAnnotatedAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class CommandMustImplementInterfaceAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new CommandMustImplementInterfaceAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new CommandMustImplementInterfaceAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_a_command_does_not_implement_ICommand_interface()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand
{
@@ -31,8 +31,7 @@ public class CommandMustImplementInterfaceAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -49,8 +48,7 @@ public class CommandMustImplementInterfaceAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class Foo
{
public int Bar { get; init; } = 5;
@@ -60,4 +58,4 @@ public class CommandMustImplementInterfaceAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -12,11 +12,10 @@ public class GeneralSpecs
public void All_analyzers_have_unique_diagnostic_IDs()
{
// Arrange
var analyzers = typeof(AnalyzerBase)
.Assembly
var analyzers = typeof(AnalyzerBase).Assembly
.GetTypes()
.Where(t => !t.IsAbstract && t.IsAssignableTo(typeof(DiagnosticAnalyzer)))
.Select(t => (DiagnosticAnalyzer) Activator.CreateInstance(t)!)
.Select(t => (DiagnosticAnalyzer)Activator.CreateInstance(t)!)
.ToArray();
// Act
@@ -27,4 +26,4 @@ public class GeneralSpecs
// Assert
diagnosticIds.Should().OnlyHaveUniqueItems();
}
}
}

View File

@@ -13,8 +13,7 @@ public class OptionMustBeInsideCommandAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyClass
{
[CommandOption("foo")]
@@ -31,8 +30,7 @@ public class OptionMustBeInsideCommandAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -52,8 +50,7 @@ public class OptionMustBeInsideCommandAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public abstract class MyCommand
{
[CommandOption("foo")]
@@ -70,8 +67,7 @@ public class OptionMustBeInsideCommandAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -84,4 +80,4 @@ public class OptionMustBeInsideCommandAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class OptionMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new OptionMustBeRequiredIfPropertyRequiredAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new OptionMustBeRequiredIfPropertyRequiredAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_a_non_required_option_is_bound_to_a_required_property()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -34,8 +34,7 @@ public class OptionMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -55,8 +54,7 @@ public class OptionMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -76,8 +74,7 @@ public class OptionMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -97,8 +94,7 @@ public class OptionMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -111,4 +107,4 @@ public class OptionMustBeRequiredIfPropertyRequiredAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class OptionMustHaveNameOrShortNameAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new OptionMustHaveNameOrShortNameAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new OptionMustHaveNameOrShortNameAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_an_option_does_not_have_a_name_or_short_name()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -34,8 +34,7 @@ public class OptionMustHaveNameOrShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -55,8 +54,7 @@ public class OptionMustHaveNameOrShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -76,8 +74,7 @@ public class OptionMustHaveNameOrShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -90,4 +87,4 @@ public class OptionMustHaveNameOrShortNameAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -13,8 +13,7 @@ public class OptionMustHaveUniqueNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -37,8 +36,7 @@ public class OptionMustHaveUniqueNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -61,8 +59,7 @@ public class OptionMustHaveUniqueNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -82,8 +79,7 @@ public class OptionMustHaveUniqueNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -96,4 +92,4 @@ public class OptionMustHaveUniqueNameAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class OptionMustHaveUniqueShortNameAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new OptionMustHaveUniqueShortNameAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new OptionMustHaveUniqueShortNameAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_an_option_has_the_same_short_name_as_another_option()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -37,8 +37,7 @@ public class OptionMustHaveUniqueShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -61,8 +60,7 @@ public class OptionMustHaveUniqueShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -85,8 +83,7 @@ public class OptionMustHaveUniqueShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -106,8 +103,7 @@ public class OptionMustHaveUniqueShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -120,4 +116,4 @@ public class OptionMustHaveUniqueShortNameAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class OptionMustHaveValidConverterAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new OptionMustHaveValidConverterAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new OptionMustHaveValidConverterAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_an_option_has_a_converter_that_does_not_derive_from_BindingConverter()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter
{
public string Convert(string? rawValue) => rawValue;
@@ -39,8 +39,7 @@ public class OptionMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter : BindingConverter<int>
{
public override int Convert(string? rawValue) => 42;
@@ -65,8 +64,7 @@ public class OptionMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter : BindingConverter<string>
{
public override string Convert(string? rawValue) => rawValue;
@@ -91,8 +89,7 @@ public class OptionMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter : BindingConverter<int>
{
public override int Convert(string? rawValue) => 42;
@@ -117,8 +114,7 @@ public class OptionMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter : BindingConverter<string>
{
public override string Convert(string? rawValue) => rawValue;
@@ -143,8 +139,7 @@ public class OptionMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -164,8 +159,7 @@ public class OptionMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -178,4 +172,4 @@ public class OptionMustHaveValidConverterAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -13,8 +13,7 @@ public class OptionMustHaveValidNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -34,8 +33,7 @@ public class OptionMustHaveValidNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -55,8 +53,7 @@ public class OptionMustHaveValidNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -76,8 +73,7 @@ public class OptionMustHaveValidNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -97,8 +93,7 @@ public class OptionMustHaveValidNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -111,4 +106,4 @@ public class OptionMustHaveValidNameAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class OptionMustHaveValidShortNameAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new OptionMustHaveValidShortNameAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new OptionMustHaveValidShortNameAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_an_option_has_a_short_name_which_is_not_a_letter_character()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -34,8 +34,7 @@ public class OptionMustHaveValidShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -55,8 +54,7 @@ public class OptionMustHaveValidShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -76,8 +74,7 @@ public class OptionMustHaveValidShortNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -90,4 +87,4 @@ public class OptionMustHaveValidShortNameAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class OptionMustHaveValidValidatorsAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new OptionMustHaveValidValidatorsAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new OptionMustHaveValidValidatorsAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_an_option_has_a_validator_that_does_not_derive_from_BindingValidator()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyValidator
{
public void Validate(string value) {}
@@ -39,8 +39,7 @@ public class OptionMustHaveValidValidatorsAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyValidator : BindingValidator<int>
{
public override BindingValidationError Validate(int value) => Ok();
@@ -65,8 +64,7 @@ public class OptionMustHaveValidValidatorsAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyValidator : BindingValidator<string>
{
public override BindingValidationError Validate(string value) => Ok();
@@ -91,8 +89,7 @@ public class OptionMustHaveValidValidatorsAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -112,8 +109,7 @@ public class OptionMustHaveValidValidatorsAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -126,4 +122,4 @@ public class OptionMustHaveValidValidatorsAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustBeInsideCommandAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustBeInsideCommandAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustBeInsideCommandAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_a_parameter_is_inside_a_class_that_is_not_a_command()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyClass
{
[CommandParameter(0)]
@@ -31,8 +31,7 @@ public class ParameterMustBeInsideCommandAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -52,8 +51,7 @@ public class ParameterMustBeInsideCommandAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public abstract class MyCommand
{
[CommandParameter(0)]
@@ -70,8 +68,7 @@ public class ParameterMustBeInsideCommandAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -84,4 +81,4 @@ public class ParameterMustBeInsideCommandAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustBeLastIfNonRequiredAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustBeLastIfNonRequiredAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustBeLastIfNonRequiredAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_a_non_required_parameter_is_not_the_last_in_order()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -37,8 +37,7 @@ public class ParameterMustBeLastIfNonRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -61,8 +60,7 @@ public class ParameterMustBeLastIfNonRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -85,8 +83,7 @@ public class ParameterMustBeLastIfNonRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -99,4 +96,4 @@ public class ParameterMustBeLastIfNonRequiredAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustBeLastIfNonScalarAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustBeLastIfNonScalarAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustBeLastIfNonScalarAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_a_non_scalar_parameter_is_not_the_last_in_order()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -37,8 +37,7 @@ public class ParameterMustBeLastIfNonScalarAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -61,8 +60,7 @@ public class ParameterMustBeLastIfNonScalarAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -85,8 +83,7 @@ public class ParameterMustBeLastIfNonScalarAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -99,4 +96,4 @@ public class ParameterMustBeLastIfNonScalarAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustBeRequiredIfPropertyRequiredAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustBeRequiredIfPropertyRequiredAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_a_non_required_parameter_is_bound_to_a_required_property()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -34,8 +34,7 @@ public class ParameterMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -55,8 +54,7 @@ public class ParameterMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -76,8 +74,7 @@ public class ParameterMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -97,8 +94,7 @@ public class ParameterMustBeRequiredIfPropertyRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -111,4 +107,4 @@ public class ParameterMustBeRequiredIfPropertyRequiredAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustBeSingleIfNonRequiredAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustBeSingleIfNonRequiredAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustBeSingleIfNonRequiredAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_more_than_one_non_required_parameters_are_defined()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -37,8 +37,7 @@ public class ParameterMustBeSingleIfNonRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -61,8 +60,7 @@ public class ParameterMustBeSingleIfNonRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -85,8 +83,7 @@ public class ParameterMustBeSingleIfNonRequiredAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -99,4 +96,4 @@ public class ParameterMustBeSingleIfNonRequiredAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustBeSingleIfNonScalarAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustBeSingleIfNonScalarAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustBeSingleIfNonScalarAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_more_than_one_non_scalar_parameters_are_defined()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -37,8 +37,7 @@ public class ParameterMustBeSingleIfNonScalarAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -61,8 +60,7 @@ public class ParameterMustBeSingleIfNonScalarAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -85,8 +83,7 @@ public class ParameterMustBeSingleIfNonScalarAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -99,4 +96,4 @@ public class ParameterMustBeSingleIfNonScalarAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -13,8 +13,7 @@ public class ParameterMustHaveUniqueNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -37,8 +36,7 @@ public class ParameterMustHaveUniqueNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -61,8 +59,7 @@ public class ParameterMustHaveUniqueNameAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -75,4 +72,4 @@ public class ParameterMustHaveUniqueNameAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustHaveUniqueOrderAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustHaveUniqueOrderAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustHaveUniqueOrderAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_a_parameter_has_the_same_order_as_another_parameter()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -37,8 +37,7 @@ public class ParameterMustHaveUniqueOrderAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -61,8 +60,7 @@ public class ParameterMustHaveUniqueOrderAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -75,4 +73,4 @@ public class ParameterMustHaveUniqueOrderAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustHaveValidConverterAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustHaveValidConverterAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustHaveValidConverterAnalyzer();
[Fact]
public void Analyzer_reports_an_error_if_a_parameter_has_a_converter_that_does_not_derive_from_BindingConverter()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter
{
public string Convert(string? rawValue) => rawValue;
@@ -39,8 +39,7 @@ public class ParameterMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter : BindingConverter<int>
{
public override int Convert(string? rawValue) => 42;
@@ -56,7 +55,6 @@ public class ParameterMustHaveValidConverterAnalyzerSpecs
}
""";
// Act & assert
Analyzer.Should().ProduceDiagnostics(code);
}
@@ -66,8 +64,7 @@ public class ParameterMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter : BindingConverter<string>
{
public override string Convert(string? rawValue) => rawValue;
@@ -92,8 +89,7 @@ public class ParameterMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter : BindingConverter<int>
{
public override int Convert(string? rawValue) => 42;
@@ -118,8 +114,7 @@ public class ParameterMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyConverter : BindingConverter<string>
{
public override string Convert(string? rawValue) => rawValue;
@@ -144,8 +139,7 @@ public class ParameterMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -165,8 +159,7 @@ public class ParameterMustHaveValidConverterAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -179,4 +172,4 @@ public class ParameterMustHaveValidConverterAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class ParameterMustHaveValidValidatorsAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new ParameterMustHaveValidValidatorsAnalyzer();
private static DiagnosticAnalyzer Analyzer { get; } =
new ParameterMustHaveValidValidatorsAnalyzer();
[Fact]
public void Analyzer_reports_an_error_a_parameter_has_a_validator_that_does_not_derive_from_BindingValidator()
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyValidator
{
public void Validate(string value) {}
@@ -39,8 +39,7 @@ public class ParameterMustHaveValidValidatorsAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyValidator : BindingValidator<int>
{
public override BindingValidationError Validate(int value) => Ok();
@@ -65,8 +64,7 @@ public class ParameterMustHaveValidValidatorsAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
public class MyValidator : BindingValidator<string>
{
public override BindingValidationError Validate(string value) => Ok();
@@ -91,8 +89,7 @@ public class ParameterMustHaveValidValidatorsAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -112,8 +109,7 @@ public class ParameterMustHaveValidValidatorsAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -126,4 +122,4 @@ public class ParameterMustHaveValidValidatorsAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -6,15 +6,15 @@ namespace CliFx.Analyzers.Tests;
public class SystemConsoleShouldBeAvoidedAnalyzerSpecs
{
private static DiagnosticAnalyzer Analyzer { get; } = new SystemConsoleShouldBeAvoidedAnalyzer();
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 =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -35,8 +35,7 @@ public class SystemConsoleShouldBeAvoidedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -57,8 +56,7 @@ public class SystemConsoleShouldBeAvoidedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -79,8 +77,7 @@ public class SystemConsoleShouldBeAvoidedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -101,8 +98,7 @@ public class SystemConsoleShouldBeAvoidedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -121,8 +117,7 @@ public class SystemConsoleShouldBeAvoidedAnalyzerSpecs
{
// Arrange
// lang=csharp
const string code =
"""
const string code = """
[Command]
public class MyCommand : ICommand
{
@@ -136,4 +131,4 @@ public class SystemConsoleShouldBeAvoidedAnalyzerSpecs
// Act & assert
Analyzer.Should().NotProduceDiagnostics(code);
}
}
}

View File

@@ -18,9 +18,7 @@ internal class AnalyzerAssertions : ReferenceTypeAssertions<DiagnosticAnalyzer,
protected override string Identifier { get; } = "analyzer";
public AnalyzerAssertions(DiagnosticAnalyzer analyzer)
: base(analyzer)
{
}
: base(analyzer) { }
private Compilation Compile(string sourceCode)
{
@@ -33,8 +31,7 @@ internal class AnalyzerAssertions : ReferenceTypeAssertions<DiagnosticAnalyzer,
};
// Get default CliFx namespaces
var defaultCliFxNamespaces = typeof(ICommand)
.Assembly
var defaultCliFxNamespaces = typeof(ICommand).Assembly
.GetTypes()
.Where(t => t.IsPublic)
.Select(t => t.Namespace)
@@ -43,10 +40,10 @@ internal class AnalyzerAssertions : ReferenceTypeAssertions<DiagnosticAnalyzer,
// Append default imports to the source code
var sourceCodeWithUsings =
string.Join(Environment.NewLine, defaultSystemNamespaces.Select(n => $"using {n};")) +
string.Join(Environment.NewLine, defaultCliFxNamespaces.Select(n => $"using {n};")) +
Environment.NewLine +
sourceCode;
string.Join(Environment.NewLine, defaultSystemNamespaces.Select(n => $"using {n};"))
+ string.Join(Environment.NewLine, defaultCliFxNamespaces.Select(n => $"using {n};"))
+ Environment.NewLine
+ sourceCode;
// Parse the source code
var ast = SyntaxFactory.ParseSyntaxTree(
@@ -58,8 +55,9 @@ internal class AnalyzerAssertions : ReferenceTypeAssertions<DiagnosticAnalyzer,
var compilation = CSharpCompilation.Create(
"CliFxTests_DynamicAssembly_" + Guid.NewGuid(),
new[] { ast },
Net70.References.All
.Append(MetadataReference.CreateFromFile(typeof(ICommand).Assembly.Location)),
Net70.References.All.Append(
MetadataReference.CreateFromFile(typeof(ICommand).Assembly.Location)
),
// DLL to avoid having to define the Main() method
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
);
@@ -103,44 +101,46 @@ internal class AnalyzerAssertions : ReferenceTypeAssertions<DiagnosticAnalyzer,
var producedDiagnosticIds = producedDiagnostics.Select(d => d.Id).Distinct().ToArray();
var isSuccessfulAssertion =
expectedDiagnosticIds.Intersect(producedDiagnosticIds).Count() ==
expectedDiagnosticIds.Length;
expectedDiagnosticIds.Intersect(producedDiagnosticIds).Count()
== expectedDiagnosticIds.Length;
Execute.Assertion.ForCondition(isSuccessfulAssertion).FailWith(() =>
{
var buffer = new StringBuilder();
buffer.AppendLine("Expected and produced diagnostics do not match.");
buffer.AppendLine();
buffer.AppendLine("Expected diagnostics:");
foreach (var expectedDiagnostic in expectedDiagnostics)
Execute.Assertion
.ForCondition(isSuccessfulAssertion)
.FailWith(() =>
{
buffer.Append(" - ");
buffer.Append(expectedDiagnostic.Id);
var buffer = new StringBuilder();
buffer.AppendLine("Expected and produced diagnostics do not match.");
buffer.AppendLine();
}
buffer.AppendLine();
buffer.AppendLine("Expected diagnostics:");
buffer.AppendLine("Produced diagnostics:");
if (producedDiagnostics.Any())
{
foreach (var producedDiagnostic in producedDiagnostics)
foreach (var expectedDiagnostic in expectedDiagnostics)
{
buffer.Append(" - ");
buffer.Append(producedDiagnostic);
buffer.Append(expectedDiagnostic.Id);
buffer.AppendLine();
}
}
else
{
buffer.AppendLine(" < none >");
}
return new FailReason(buffer.ToString());
});
buffer.AppendLine();
buffer.AppendLine("Produced diagnostics:");
if (producedDiagnostics.Any())
{
foreach (var producedDiagnostic in producedDiagnostics)
{
buffer.Append(" - ");
buffer.Append(producedDiagnostic);
}
}
else
{
buffer.AppendLine(" < none >");
}
return new FailReason(buffer.ToString());
});
}
public void NotProduceDiagnostics(string sourceCode)
@@ -148,27 +148,29 @@ internal class AnalyzerAssertions : ReferenceTypeAssertions<DiagnosticAnalyzer,
var producedDiagnostics = GetProducedDiagnostics(sourceCode);
var isSuccessfulAssertion = !producedDiagnostics.Any();
Execute.Assertion.ForCondition(isSuccessfulAssertion).FailWith(() =>
{
var buffer = new StringBuilder();
buffer.AppendLine("Expected no produced diagnostics.");
buffer.AppendLine();
buffer.AppendLine("Produced diagnostics:");
foreach (var producedDiagnostic in producedDiagnostics)
Execute.Assertion
.ForCondition(isSuccessfulAssertion)
.FailWith(() =>
{
buffer.Append(" - ");
buffer.Append(producedDiagnostic);
}
var buffer = new StringBuilder();
return new FailReason(buffer.ToString());
});
buffer.AppendLine("Expected no produced diagnostics.");
buffer.AppendLine();
buffer.AppendLine("Produced diagnostics:");
foreach (var producedDiagnostic in producedDiagnostics)
{
buffer.Append(" - ");
buffer.Append(producedDiagnostic);
}
return new FailReason(buffer.ToString());
});
}
}
internal static class AnalyzerAssertionsExtensions
{
public static AnalyzerAssertions Should(this DiagnosticAnalyzer analyzer) => new(analyzer);
}
}