private static (ImmutableArray <Diagnostic>, string) GetGeneratedOutput(string source) { var syntaxTree = CSharpSyntaxTree.ParseText(source); var references = new List <MetadataReference>(); Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assembly in assemblies) { if (!assembly.IsDynamic) { references.Add(MetadataReference.CreateFromFile(assembly.Location)); } } var compilation = CSharpCompilation.Create("foo", new SyntaxTree[] { syntaxTree }, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); //ImmutableArray<Diagnostic> diagnostics = compilation.GetDiagnostics(); //if (diagnostics.Any()) //{ // return (diagnostics, ""); //} ISourceGenerator generator = new EnumValidationGenerator(); var driver = CSharpGeneratorDriver.Create(generator); driver.RunGeneratorsAndUpdateCompilation(compilation, out var outputCompilation, out var diagnostics); return(diagnostics, string.Join(Environment.NewLine, outputCompilation.SyntaxTrees.Skip(1))); }
private void VerifyGeneratedMethodLines(string source, string expectedEnumName, string expectedBody) { SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source); List <MetadataReference> references = new List <MetadataReference>(); Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { if (!assembly.IsDynamic) { references.Add(MetadataReference.CreateFromFile(assembly.Location)); } } CSharpCompilation compilation = CSharpCompilation.Create("original", new SyntaxTree[] { syntaxTree }, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); ISourceGenerator generator = new EnumValidationGenerator(); CSharpGeneratorDriver driver = CSharpGeneratorDriver.Create(generator); driver.RunGeneratorsAndUpdateCompilation(compilation, out Compilation outputCompilation, out ImmutableArray <Diagnostic> diagnostics); Assert.False(diagnostics.Any(d => d.Severity == DiagnosticSeverity.Error), "Failed: " + diagnostics.FirstOrDefault()?.GetMessage()); string output = outputCompilation.SyntaxTrees.Skip(1).First().ToString(); List <string> lines = output.Split("\r\n").ToList(); AssertFirstLineAndRemove(lines, "// <auto-generated />"); AssertFirstLineAndRemove(lines, "namespace SourceGenerated"); AssertFirstLineAndRemove(lines, "{"); AssertFirstLineAndRemove(lines, "internal static partial class EnumValidator"); AssertFirstLineAndRemove(lines, "{"); AssertFirstLineAndRemove(lines, "/// <summary>Validates that the enum value passed in is valid for the enum type.</summary>"); AssertFirstLineAndRemove(lines, $"public static void Validate({expectedEnumName} enumToValidate, string parameterName = \"value\")"); AssertFirstLineAndRemove(lines, "{"); AssertFirstLineAndRemove(lines, "int intValue = (int)enumToValidate;"); foreach (string line in expectedBody.Split("\r\n")) { AssertFirstLineAndRemove(lines, line.Trim()); } AssertFirstLineAndRemove(lines, $"ReportEnumValidationError(parameterName, intValue, typeof({expectedEnumName}));"); AssertFirstLineAndRemove(lines, "}");