protected void ShouldVerifyTest(TestUnityProject <TAnalyzer> testProject)
        {
            if (string.IsNullOrWhiteSpace(_version))
            {
                return;
            }

            testProject.DisableVerifierOn(_version, _comparision);
        }
        protected async Task VerifyAnalyzerAsync(string source, params DiagnosticResult[] expected)
        {
            var testProject = new TestUnityProject <TAnalyzer>(expected.Select(w => w.Id).Distinct().ToArray());

            ShouldVerifyTest(testProject);
            ParseSource(testProject, source, expected);

            await testProject.RunAnalyzerAsync(CancellationToken.None);
        }
        protected async Task VerifyCodeFixAsync(string source, DiagnosticResult[] expected, string fixedSource)
        {
            var testProject = new TestUnityProject <TAnalyzer>(expected.Select(w => w.Id).Distinct().ToArray());

            ParseSource(testProject, source, expected);

            await testProject.RunAnalyzerAsync(CancellationToken.None);

            await testProject.RunCodeFixAsync <TCodeFix>(fixedSource, CancellationToken.None);
        }
        protected void ParseSource(TestUnityProject <TAnalyzer> testProject, string source, DiagnosticResult[] expected)
        {
            var sb          = new StringBuilder();
            var diagnostics = expected.ToList();

            var line           = 1;
            var column         = 1;
            var expectedLine   = 0;
            var expectedColumn = 0;
            var isReading      = false;
            var i = 0;

            using var sr = new StringReader(source);
            while (sr.Peek() > -1)
            {
                var c = sr.Read();
                switch (c)
                {
                case '\n':
                    sb.Append((char)c);
                    line++;
                    column = 1;
                    break;

                case '[' when sr.Peek() == '|':
                    sr.Read();

                    expectedLine   = line;
                    expectedColumn = column;
                    isReading      = true;
                    break;

                case '|' when isReading && sr.Peek() == ']':
                    sr.Read();

                    diagnostics[i] = diagnostics[i].WithSpan(expectedLine, expectedColumn, line, column);
                    i++;
                    isReading = false;
                    break;

                default:
                    sb.Append((char)c);
                    column++;
                    break;
                }
            }

            testProject.ExpectedDiagnostics.AddRange(diagnostics);
            testProject.SourceCode = sb.ToString();
        }