diff --git a/.editorconfig b/.editorconfig index 3656fd0..d812c3e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,7 +9,7 @@ indent_size = 4 # Microsoft .NET properties csharp_new_line_before_members_in_object_initializers = false csharp_new_line_before_open_brace = none -csharp_preferred_modifier_order = public, internal, protected, private, static, async, virtual, file, new, sealed, override, required, abstract, extern, volatile, unsafe, readonly:suggestion +csharp_preferred_modifier_order = public, internal, protected, private, static, override, async, virtual, file, new, sealed, required, abstract, extern, volatile, unsafe, readonly:suggestion csharp_style_prefer_utf8_string_literals = true:suggestion csharp_style_var_elsewhere = false:none csharp_style_var_for_built_in_types = false:suggestion diff --git a/src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsDiagnosticAssertCondition.cs b/src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsDiagnosticAssertCondition.cs index 5c80d19..560a745 100644 --- a/src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsDiagnosticAssertCondition.cs +++ b/src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsDiagnosticAssertCondition.cs @@ -10,16 +10,16 @@ namespace CodeOfChaos.Testing.TUnit.Conditions.Library; // --------------------------------------------------------------------------------------------------------------------- // Code // --------------------------------------------------------------------------------------------------------------------- -public class ContainsDiagnosticAssertCondition(Func> getDiagnosticsAction, string expectedId): ExpectedValueAssertCondition(expectedId) { +public class ContainsDiagnosticAssertCondition(Func>> getDiagnosticsAction, string expectedId): ExpectedValueAssertCondition(expectedId) { // ----------------------------------------------------------------------------------------------------------------- // Methods // ----------------------------------------------------------------------------------------------------------------- protected override string GetExpectation() => $"to have a diagnostic with Id \"{ExpectedValue}\""; - protected override Task GetResult(T? actualValue, string? expectedValue) { + protected override async Task GetResult(T? actualValue, string? expectedValue) { if (actualValue is null) return AssertionResult.Fail($"{nameof(T)} is null"); if (expectedValue is null) return AssertionResult.Fail("Expected value is null"); - ImmutableArray diagnostics = getDiagnosticsAction(actualValue); + ImmutableArray diagnostics = await getDiagnosticsAction(actualValue); if (!diagnostics.Any()) return FailWithMessage("No diagnostics"); if (diagnostics.Any(d => d.Id == expectedValue)) return AssertionResult.Passed; return FailWithMessage("No diagnostic with Id"); diff --git a/src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsDiagnosticsExclusivelyAssertCondition.cs b/src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsDiagnosticsExclusivelyAssertCondition.cs index e15d67e..810eca2 100644 --- a/src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsDiagnosticsExclusivelyAssertCondition.cs +++ b/src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsDiagnosticsExclusivelyAssertCondition.cs @@ -10,18 +10,18 @@ namespace CodeOfChaos.Testing.TUnit.Conditions.Library; // --------------------------------------------------------------------------------------------------------------------- // Code // --------------------------------------------------------------------------------------------------------------------- -public class ContainsDiagnosticsExclusivelyAssertCondition(Func> getDiagnosticsAction, string[] expectedIds) +public class ContainsDiagnosticsExclusivelyAssertCondition(Func>> getDiagnosticsAction, string[] expectedIds) : ExpectedValueAssertCondition(expectedIds) { // ----------------------------------------------------------------------------------------------------------------- // Methods // ----------------------------------------------------------------------------------------------------------------- protected override string GetExpectation() => $"to have a compilation output with the following Ids \"{ExpectedValue}\""; - protected override Task GetResult(T? actualValue, string[]? expectedValues) { + protected override async Task GetResult(T? actualValue, string[]? expectedValues) { if (actualValue is null) return AssertionResult.Fail($"{nameof(T)} is null"); if (expectedValues is null) return AssertionResult.Fail("Expected value is null"); - ImmutableArray diagnostics = getDiagnosticsAction(actualValue); + ImmutableArray diagnostics = await getDiagnosticsAction(actualValue); if (!diagnostics.Any() && expectedValues.Length == 0) return AssertionResult.Passed; if (!diagnostics.Any()) return FailWithMessage("No diagnostics"); if (expectedValues.Length != diagnostics.Length) return FailWithMessage("Wrong number of diagnostics"); diff --git a/src/CodeOfChaos.Testing.TUnit/Conditions/Library/DoesNotContainDiagnosticAssertCondition.cs b/src/CodeOfChaos.Testing.TUnit/Conditions/Library/DoesNotContainDiagnosticAssertCondition.cs index b8704d9..f3c486e 100644 --- a/src/CodeOfChaos.Testing.TUnit/Conditions/Library/DoesNotContainDiagnosticAssertCondition.cs +++ b/src/CodeOfChaos.Testing.TUnit/Conditions/Library/DoesNotContainDiagnosticAssertCondition.cs @@ -10,7 +10,7 @@ namespace CodeOfChaos.Testing.TUnit.Conditions.Library; // --------------------------------------------------------------------------------------------------------------------- // Code // --------------------------------------------------------------------------------------------------------------------- -public class DoesNotContainDiagnosticAssertCondition(Func> getDiagnosticsAction, string expectedId) +public class DoesNotContainDiagnosticAssertCondition(Func>> getDiagnosticsAction, string expectedId) : ExpectedValueAssertCondition(expectedId) { // ----------------------------------------------------------------------------------------------------------------- @@ -18,11 +18,11 @@ public class DoesNotContainDiagnosticAssertCondition(Func $"to not have a diagnostic with Id \"{ExpectedValue}\""; - protected override Task GetResult(T? actualValue, string? expectedValue) { + protected override async Task GetResult(T? actualValue, string? expectedValue) { if (actualValue is null) return AssertionResult.Fail($"{nameof(T)} is null"); if (expectedValue is null) return AssertionResult.Fail("Expected value is null"); - ImmutableArray diagnostics = getDiagnosticsAction(actualValue); + ImmutableArray diagnostics = await getDiagnosticsAction(actualValue); if (diagnostics.Any(d => d.Id == expectedValue)) return FailWithMessage("Diagnostic with Id"); diff --git a/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsCompilation.cs b/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsCompilation.cs index 50240c3..7c37b8b 100644 --- a/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsCompilation.cs +++ b/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsCompilation.cs @@ -19,7 +19,7 @@ public static class TUnitExtensionsCompilation { public static InvokableValueAssertionBuilder ContainsDiagnostic(this IValueSource valueSource, string expectedId, [CallerArgumentExpression(nameof(expectedId))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new ContainsDiagnosticAssertCondition( - static compilation => compilation.GetDiagnostics(), + static compilation => ValueTask.FromResult(compilation.GetDiagnostics()), expectedId ), argumentExpressions: [doNotPopulateThisValue1] @@ -29,7 +29,7 @@ public static InvokableValueAssertionBuilder ContainsDiagnostic(thi public static InvokableValueAssertionBuilder DoesNotContainDiagnostic(this IValueSource valueSource, string expectedId, [CallerArgumentExpression(nameof(expectedId))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new DoesNotContainDiagnosticAssertCondition( - static compilation => compilation.GetDiagnostics(), + static compilation => ValueTask.FromResult(compilation.GetDiagnostics()), expectedId ), argumentExpressions: [doNotPopulateThisValue1] @@ -39,7 +39,7 @@ public static InvokableValueAssertionBuilder DoesNotContainDiagnost public static InvokableValueAssertionBuilder ContainsDiagnosticsExclusively(this IValueSource valueSource, string[] expectedIds, [CallerArgumentExpression(nameof(expectedIds))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new ContainsDiagnosticsExclusivelyAssertCondition( - static compilation => compilation.GetDiagnostics(), + static compilation => ValueTask.FromResult(compilation.GetDiagnostics()), expectedIds ), argumentExpressions: [doNotPopulateThisValue1] diff --git a/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsCompilationWithAnalyzers.cs b/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsCompilationWithAnalyzers.cs new file mode 100644 index 0000000..6827ecf --- /dev/null +++ b/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsCompilationWithAnalyzers.cs @@ -0,0 +1,47 @@ +// --------------------------------------------------------------------------------------------------------------------- +// Imports +// --------------------------------------------------------------------------------------------------------------------- +using CodeOfChaos.Testing.TUnit.Conditions.Library; +using Microsoft.CodeAnalysis.Diagnostics; +using System.Runtime.CompilerServices; +using TUnit.Assertions.AssertConditions.Interfaces; +using TUnit.Assertions.AssertionBuilders; + +namespace CodeOfChaos.Testing.TUnit; + +// --------------------------------------------------------------------------------------------------------------------- +// Code +// --------------------------------------------------------------------------------------------------------------------- +// ReSharper disable once InconsistentNaming +public static class TUnitExtensionsCompilationWithAnalyzers { + public static InvokableValueAssertionBuilder ContainsDiagnostic(this IValueSource valueSource, string expectedId, [CallerArgumentExpression(nameof(expectedId))] string doNotPopulateThisValue1 = "") { + return valueSource.RegisterAssertion( + assertCondition: new ContainsDiagnosticAssertCondition( + async static compilation => await compilation.GetAllDiagnosticsAsync(), + expectedId + ), + argumentExpressions: [doNotPopulateThisValue1] + ); + } + + public static InvokableValueAssertionBuilder DoesNotContainDiagnostic(this IValueSource valueSource, string expectedId, [CallerArgumentExpression(nameof(expectedId))] string doNotPopulateThisValue1 = "") { + return valueSource.RegisterAssertion( + assertCondition: new DoesNotContainDiagnosticAssertCondition( + async static compilation => await compilation.GetAllDiagnosticsAsync(), + expectedId + ), + argumentExpressions: [doNotPopulateThisValue1] + ); + } + + public static InvokableValueAssertionBuilder ContainsDiagnosticsExclusively(this IValueSource valueSource, string[] expectedIds, [CallerArgumentExpression(nameof(expectedIds))] string doNotPopulateThisValue1 = "") { + return valueSource.RegisterAssertion( + assertCondition: new ContainsDiagnosticsExclusivelyAssertCondition( + async static compilation => await compilation.GetAllDiagnosticsAsync(), + expectedIds + ), + argumentExpressions: [doNotPopulateThisValue1] + ); + } + +} diff --git a/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsDiagnosticsImmutableArray.cs b/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsDiagnosticsImmutableArray.cs index 5411ad3..8bddd3c 100644 --- a/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsDiagnosticsImmutableArray.cs +++ b/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsDiagnosticsImmutableArray.cs @@ -18,7 +18,7 @@ public static class TUnitExtensionsDiagnosticsImmutableArray { public static InvokableValueAssertionBuilder> ContainsDiagnostic(this IValueSource> valueSource, string expectedId, [CallerArgumentExpression(nameof(expectedId))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new ContainsDiagnosticAssertCondition>( - static diagnostics => diagnostics, + static diagnostics => ValueTask.FromResult(diagnostics), expectedId ), argumentExpressions: [doNotPopulateThisValue1] @@ -28,7 +28,7 @@ public static InvokableValueAssertionBuilder> Contain public static InvokableValueAssertionBuilder> DoesNotContainDiagnostic(this IValueSource> valueSource, string expectedId, [CallerArgumentExpression(nameof(expectedId))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new DoesNotContainDiagnosticAssertCondition>( - static diagnostics => diagnostics, + static diagnostics => ValueTask.FromResult(diagnostics), expectedId ), argumentExpressions: [doNotPopulateThisValue1] @@ -38,7 +38,7 @@ public static InvokableValueAssertionBuilder> DoesNot public static InvokableValueAssertionBuilder> ContainsDiagnosticsExclusively(this IValueSource> valueSource, string[] expectedIds, [CallerArgumentExpression(nameof(expectedIds))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new ContainsDiagnosticsExclusivelyAssertCondition>( - static diagnostics => diagnostics, + static diagnostics => ValueTask.FromResult(diagnostics), expectedIds ), argumentExpressions: [doNotPopulateThisValue1] diff --git a/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsGeneratorResult.cs b/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsGeneratorResult.cs index 4ca5345..76c1f3e 100644 --- a/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsGeneratorResult.cs +++ b/src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsGeneratorResult.cs @@ -26,7 +26,7 @@ public static InvokableValueAssertionBuilder HasSource public static InvokableValueAssertionBuilder ContainsDiagnostic(this IValueSource valueSource, string expectedId, [CallerArgumentExpression(nameof(expectedId))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new ContainsDiagnosticAssertCondition( - static runResult => runResult.Diagnostics, + static runResult => ValueTask.FromResult(runResult.Diagnostics), expectedId ), argumentExpressions: [doNotPopulateThisValue1] @@ -36,7 +36,7 @@ public static InvokableValueAssertionBuilder ContainsD public static InvokableValueAssertionBuilder DoesNotContainDiagnostic(this IValueSource valueSource, string expectedId, [CallerArgumentExpression(nameof(expectedId))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new DoesNotContainDiagnosticAssertCondition( - static runResult => runResult.Diagnostics, + static runResult => ValueTask.FromResult(runResult.Diagnostics), expectedId ), argumentExpressions: [doNotPopulateThisValue1] @@ -46,7 +46,7 @@ public static InvokableValueAssertionBuilder DoesNotCo public static InvokableValueAssertionBuilder ContainsDiagnosticsExclusively(this IValueSource valueSource, string[] expectedIds, [CallerArgumentExpression(nameof(expectedIds))] string doNotPopulateThisValue1 = "") { return valueSource.RegisterAssertion( assertCondition: new ContainsDiagnosticsExclusivelyAssertCondition( - static runResult => runResult.Diagnostics, + static runResult => ValueTask.FromResult(runResult.Diagnostics), expectedIds ), argumentExpressions: [doNotPopulateThisValue1]