private static string GetNotInExpectedFileMessage(
     DiagnosticAnalyzer analyzer,
     Diagnostic diagnostic,
     DiagnosticResultLocation expected,
     FileLinePositionSpan actualSpan)
 {
     return($"Expected diagnostic to be in file \"{expected.Path}\" was actually in file \"{actualSpan.Path}\"{Environment.NewLine}{Environment.NewLine}Diagnostic:{Environment.NewLine}    {FormatDiagnostics(analyzer, new[] { diagnostic })}{Environment.NewLine}");
 }
 private static string GetNotInExpectedColumn(
     DiagnosticAnalyzer analyzer,
     Diagnostic diagnostic,
     DiagnosticResultLocation expected,
     LinePosition actualLinePosition)
 {
     return($"Expected diagnostic to start at column \"{expected.Column}\" was actually at column \"{actualLinePosition.Character + 1}\"{Environment.NewLine}{Environment.NewLine}Diagnostic:{Environment.NewLine}    {FormatDiagnostics(analyzer, new[] { diagnostic })}{Environment.NewLine}");
 }
 private static string GetNotInExpectedLineMessage(
     DiagnosticAnalyzer analyzer,
     Diagnostic diagnostic,
     DiagnosticResultLocation expected,
     LinePosition actualLinePosition)
 {
     return($"Expected diagnostic to be on line \"{expected.Line}\" was actually on line \"{actualLinePosition.Line + 1}\"{Environment.NewLine}{Environment.NewLine}Diagnostic:{Environment.NewLine}    {FormatDiagnostics(analyzer, new[] { diagnostic })}{Environment.NewLine}");
 }
        /// <summary>
        /// Helper method to VerifyDiagnosticResult that checks the location of a diagnostic and compares it with the location in the expected DiagnosticResult.
        /// </summary>
        /// <param name="analyzer">The analyzer that was being run on the sources</param>
        /// <param name="diagnostic">The diagnostic that was found in the code</param>
        /// <param name="actual">The Location of the Diagnostic found in the code</param>
        /// <param name="expected">The DiagnosticResultLocation that should have been found</param>
        private static VerifyDiagnosticAnalyzerResult VerifyDiagnosticLocation(
            DiagnosticAnalyzer analyzer,
            Diagnostic diagnostic,
            Location actual,
            DiagnosticResultLocation expected)
        {
            var actualSpan = actual.GetLineSpan();

            var isInExpectedFile = actualSpan.Path == expected.Path ||
                                   (actualSpan.Path != null &&
                                    actualSpan.Path.Contains("Test0.") &&
                                    expected.Path.Contains("Test."));

            if (!isInExpectedFile)
            {
                string msg = GetNotInExpectedFileMessage(analyzer, diagnostic, expected, actualSpan);
                return(VerifyDiagnosticAnalyzerResult.Fail(msg));
            }

            var actualLinePosition = actualSpan.StartLinePosition;

            // Only check line position if there is an actual line in the real diagnostic
            if (actualLinePosition.Line > 0)
            {
                if (actualLinePosition.Line + 1 != expected.Line)
                {
                    string msg = GetNotInExpectedLineMessage(analyzer, diagnostic, expected, actualLinePosition);
                    return(VerifyDiagnosticAnalyzerResult.Fail(msg));
                }
            }

            // Only check column position if there is an actual column position in the real diagnostic
            if (actualLinePosition.Character > 0)
            {
                if (actualLinePosition.Character + 1 != expected.Column)
                {
                    string msg = GetNotInExpectedColumn(analyzer, diagnostic, expected, actualLinePosition);
                    return(VerifyDiagnosticAnalyzerResult.Fail(msg));
                }
            }

            return(VerifyDiagnosticAnalyzerResult.Ok());
        }