public void SimpleCompilerDiagnostics() { var source = @" public class C { private int x; }"; var sourceFile = Temp.CreateFile().WriteAllText(source).Path; var errorLogDir = Temp.CreateDirectory(); var errorLogFile = Path.Combine(errorLogDir.Path, "ErrorLog.txt"); var cmd = new MockCSharpCompiler(null, _baseDirectory, new[] { "/nologo", sourceFile, "/preferreduilang:en", $"/errorlog:{errorLogFile}" }); var outWriter = new StringWriter(CultureInfo.InvariantCulture); var exitCode = cmd.Run(outWriter); var actualConsoleOutput = outWriter.ToString().Trim(); Assert.Contains("CS0169", actualConsoleOutput); Assert.Contains("CS5001", actualConsoleOutput); Assert.NotEqual(0, exitCode); var actualOutput = File.ReadAllText(errorLogFile).Trim(); var expectedHeader = GetExpectedErrorLogHeader(actualOutput, cmd); var expectedIssues = string.Format(@" ""results"": [ {{ ""ruleId"": ""CS0169"", ""kind"": ""warning"", ""locations"": [ {{ ""analysisTarget"": [ {{ ""uri"": ""{0}"", ""region"": {{ ""startLine"": 4, ""startColumn"": 17, ""endLine"": 4, ""endColumn"": 18 }} }} ] }} ], ""fullMessage"": ""The field 'C.x' is never used"", ""isSuppressedInSource"": false, ""tags"": [ ""Compiler"", ""Telemetry"" ], ""properties"": {{ ""severity"": ""Warning"", ""warningLevel"": ""3"", ""defaultSeverity"": ""Warning"", ""title"": ""Field is never used"", ""category"": ""Compiler"", ""isEnabledByDefault"": ""True"" }} }}, {{ ""ruleId"": ""CS5001"", ""kind"": ""error"", ""locations"": [ ], ""fullMessage"": ""Program does not contain a static 'Main' method suitable for an entry point"", ""isSuppressedInSource"": false, ""tags"": [ ""Compiler"", ""Telemetry"", ""NotConfigurable"" ], ""properties"": {{ ""severity"": ""Error"", ""defaultSeverity"": ""Error"", ""category"": ""Compiler"", ""isEnabledByDefault"": ""True"" }} }} ] }} ] }}", AnalyzerForErrorLogTest.GetEscapedUriForPath(sourceFile)); var expectedText = expectedHeader + expectedIssues; Assert.Equal(expectedText, actualOutput); CleanupAllGeneratedFiles(sourceFile); CleanupAllGeneratedFiles(errorLogFile); }