Improve tests output message.
This commit is contained in:
parent
4693dcfa55
commit
4706bc22ef
|
@ -0,0 +1,39 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
|
||||||
|
namespace MapTo.Tests.Extensions
|
||||||
|
{
|
||||||
|
internal static class RoslynExtensions
|
||||||
|
{
|
||||||
|
internal static string PrintSyntaxTree(this Compilation compilation)
|
||||||
|
{
|
||||||
|
var builder = new StringBuilder();
|
||||||
|
|
||||||
|
return string.Join(
|
||||||
|
Environment.NewLine,
|
||||||
|
compilation.SyntaxTrees
|
||||||
|
.Reverse()
|
||||||
|
.Select((s, i) =>
|
||||||
|
{
|
||||||
|
builder
|
||||||
|
.Clear()
|
||||||
|
.AppendLine("----------------------------------------")
|
||||||
|
.AppendFormat("File Path: \"{0}\"", s.FilePath).AppendLine()
|
||||||
|
.AppendFormat("Index: \"{0}\"", i).AppendLine()
|
||||||
|
.AppendLine();
|
||||||
|
|
||||||
|
var lines = s.ToString().Split(Environment.NewLine);
|
||||||
|
var lineNumber = 1;
|
||||||
|
foreach (var line in lines)
|
||||||
|
{
|
||||||
|
builder.AppendFormat("{0:00}: {1}", lineNumber, line).AppendLine();
|
||||||
|
lineNumber++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.ToString();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using Shouldly;
|
using Shouldly;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
@ -20,10 +21,32 @@ namespace MapTo.Tests.Extensions
|
||||||
syntax.ShouldBe(expectedSource, customMessage);
|
syntax.ShouldBe(expectedSource, customMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void ShouldBeSuccessful(this IEnumerable<Diagnostic> diagnostics, DiagnosticSeverity severity = DiagnosticSeverity.Warning)
|
internal static void ShouldBeSuccessful(this IEnumerable<Diagnostic> diagnostics, Compilation compilation = null)
|
||||||
{
|
{
|
||||||
var actual = diagnostics.Where(d => d.Severity >= severity).Select(c => $"{c.Severity}: {c.Location.GetLineSpan().StartLinePosition} - {c.GetMessage()}").ToArray();
|
var actual = diagnostics
|
||||||
Assert.False(actual.Any(), $"Failed: {Environment.NewLine}{string.Join(Environment.NewLine, actual.Select(c => $"- {c}"))}");
|
.Where(d => !d.Id.StartsWith("MT") && (d.Severity == DiagnosticSeverity.Warning || d.Severity == DiagnosticSeverity.Error))
|
||||||
|
.Select(c => $"{c.Severity}: {c.Location.GetLineSpan()} - {c.GetMessage()}").ToArray();
|
||||||
|
|
||||||
|
if (!actual.Any())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var builder = new StringBuilder();
|
||||||
|
builder.AppendLine("Failed");
|
||||||
|
|
||||||
|
foreach (var d in actual)
|
||||||
|
{
|
||||||
|
builder.AppendFormat("- {0}", d).AppendLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (compilation is not null)
|
||||||
|
{
|
||||||
|
builder.AppendLine("Generated Sources:");
|
||||||
|
builder.AppendLine(compilation.PrintSyntaxTree());
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.False(true, builder.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void ShouldBeUnsuccessful(this ImmutableArray<Diagnostic> diagnostics, Diagnostic expectedError)
|
internal static void ShouldBeUnsuccessful(this ImmutableArray<Diagnostic> diagnostics, Diagnostic expectedError)
|
||||||
|
|
|
@ -11,17 +11,19 @@ namespace MapTo.Tests.Infrastructure
|
||||||
{
|
{
|
||||||
internal static class CSharpGenerator
|
internal static class CSharpGenerator
|
||||||
{
|
{
|
||||||
internal static (Compilation compilation, ImmutableArray<Diagnostic> diagnostics) GetOutputCompilation(string source, bool assertCompilation = false, IDictionary<string, string> analyzerConfigOptions = null, NullableContextOptions nullableContextOptions = NullableContextOptions.Disable)
|
internal static (Compilation compilation, ImmutableArray<Diagnostic> diagnostics) GetOutputCompilation(string source, bool assertCompilation = false, IDictionary<string, string> analyzerConfigOptions = null, NullableContextOptions nullableContextOptions = NullableContextOptions.Disable) =>
|
||||||
|
GetOutputCompilation(new[] { source }, assertCompilation, analyzerConfigOptions, nullableContextOptions);
|
||||||
|
|
||||||
|
internal static (Compilation compilation, ImmutableArray<Diagnostic> diagnostics) GetOutputCompilation(IEnumerable<string> sources, bool assertCompilation = false, IDictionary<string, string> analyzerConfigOptions = null, NullableContextOptions nullableContextOptions = NullableContextOptions.Disable)
|
||||||
{
|
{
|
||||||
var syntaxTree = CSharpSyntaxTree.ParseText(source);
|
|
||||||
var references = AppDomain.CurrentDomain.GetAssemblies()
|
var references = AppDomain.CurrentDomain.GetAssemblies()
|
||||||
.Where(a => !a.IsDynamic && !string.IsNullOrWhiteSpace(a.Location))
|
.Where(a => !a.IsDynamic && !string.IsNullOrWhiteSpace(a.Location))
|
||||||
.Select(a => MetadataReference.CreateFromFile(a.Location))
|
.Select(a => MetadataReference.CreateFromFile(a.Location))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var compilation = CSharpCompilation.Create(
|
var compilation = CSharpCompilation.Create(
|
||||||
$"{typeof(CSharpGenerator).Assembly.GetName().Name}.Dynamic",
|
$"{typeof(CSharpGenerator).Assembly.GetName().Name}.Dynamic",
|
||||||
new[] { syntaxTree },
|
sources.Select((source, index) => CSharpSyntaxTree.ParseText(source, path: $"Test{index:00}.g.cs")),
|
||||||
references,
|
references,
|
||||||
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, nullableContextOptions: nullableContextOptions));
|
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, nullableContextOptions: nullableContextOptions));
|
||||||
|
|
||||||
|
@ -37,20 +39,9 @@ namespace MapTo.Tests.Infrastructure
|
||||||
);
|
);
|
||||||
|
|
||||||
driver.RunGeneratorsAndUpdateCompilation(compilation, out var outputCompilation, out var generateDiagnostics);
|
driver.RunGeneratorsAndUpdateCompilation(compilation, out var outputCompilation, out var generateDiagnostics);
|
||||||
|
|
||||||
var diagnostics = outputCompilation.GetDiagnostics()
|
generateDiagnostics.ShouldBeSuccessful();
|
||||||
.Where(d => d.Severity >= DiagnosticSeverity.Warning)
|
outputCompilation.GetDiagnostics().ShouldBeSuccessful(outputCompilation);
|
||||||
.Select(c => $"{c.Severity}: {c.Location.GetLineSpan().StartLinePosition} - {c.GetMessage()} [in \"{c.Location.SourceTree?.FilePath}\"]").ToArray();
|
|
||||||
|
|
||||||
if (diagnostics.Any())
|
|
||||||
{
|
|
||||||
Assert.False(diagnostics.Any(), $@"Failed:
|
|
||||||
{string.Join(Environment.NewLine, diagnostics.Select(c => $"- {c}"))}
|
|
||||||
|
|
||||||
Generated Sources:
|
|
||||||
{string.Join(Environment.NewLine, outputCompilation.SyntaxTrees.Reverse().Select(s => $"----------------------------------------{Environment.NewLine}File Path: \"{s.FilePath}\"{Environment.NewLine}{s}"))}
|
|
||||||
");
|
|
||||||
}
|
|
||||||
|
|
||||||
return (outputCompilation, generateDiagnostics);
|
return (outputCompilation, generateDiagnostics);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue