private static void HandleCompilationStart(CompilationStartAnalysisContext context)
        {
            AnalyzersSettings settings       = SettingsProvider.GetSettings(context);
            IUnitTestParser   unitTestParser = UnitTestParserFactory.Create(settings);

            context.RegisterSyntaxNodeAction(c => AnalyzeNode(c, unitTestParser, settings), SyntaxKind.MethodDeclaration);
        }
Exemplo n.º 2
0
        private static void AnalyzeNode(SyntaxNodeAnalysisContext context, IUnitTestParser parser, AnalyzersSettings settings)
        {
            if (!parser.IsUnitTestMethod(context))
            {
                return;
            }

            MethodDeclarationSyntax methodDeclaration = (MethodDeclarationSyntax)context.Node;

            Match match = settings.TestMethodNameFormatRegex.Match(methodDeclaration.Identifier.ToString());

            string memberUnderTest = match?.Groups[AnalyzersSettings.MemberUnderTestRegexGroupName].Value;

            if (string.IsNullOrWhiteSpace(memberUnderTest))
            {
                return;
            }

            IEnumerable <SyntaxNode> descendantNodes = methodDeclaration.Body.DescendantNodes();

            if (!descendantNodes?.Any() ?? true)
            {
                return;
            }

            IEnumerable <MemberAccessExpressionSyntax>   memberAccessExpressions = descendantNodes.OfType <MemberAccessExpressionSyntax>();
            IEnumerable <ObjectCreationExpressionSyntax> ctorExpressions         = descendantNodes.OfType <ObjectCreationExpressionSyntax>();

            if (!memberAccessExpressions.Any() && !ctorExpressions.Any())
            {
                return;
            }

            if (memberAccessExpressions.Any(memberAccess => string.Equals(memberUnderTest, memberAccess.Name.Identifier.ToString(), StringComparison.Ordinal)))
            {
                return;
            }

            if (ctorExpressions.Any(ctorExpression => string.Equals(memberUnderTest, ctorExpression.Type.ToString(), StringComparison.Ordinal)))
            {
                return;
            }

            var diagnostic = Diagnostic.Create(Rule, methodDeclaration.Identifier.GetLocation(), methodDeclaration.Identifier.ToString(), memberUnderTest);

            context.ReportDiagnostic(diagnostic);
        }
        private static void AnalyzeNode(SyntaxNodeAnalysisContext context, IUnitTestParser parser)
        {
            if (!parser.IsUnitTestClass(context))
            {
                return;
            }

            ClassDeclarationSyntax classDeclaration = (ClassDeclarationSyntax)context.Node;

            if (classDeclaration.Identifier.ToString().EndsWith("UnitTests"))
            {
                return;
            }

            var diagnostic = Diagnostic.Create(Rule, classDeclaration.Identifier.GetLocation(), classDeclaration.Identifier.ToString());

            context.ReportDiagnostic(diagnostic);
        }
        private static void AnalyzeNode(SyntaxNodeAnalysisContext context, IUnitTestParser parser, AnalyzersSettings settings)
        {
            if (!parser.IsUnitTestMethod(context))
            {
                return;
            }

            MethodDeclarationSyntax methodDeclaration = (MethodDeclarationSyntax)context.Node;

            var identifier = methodDeclaration.Identifier;
            var name       = identifier.ToString();

            if (settings.TestMethodNameFormatRegex.IsMatch(name))
            {
                return;
            }

            string testNameFormatExamples = settings.TestMethodNameFormatExamples.Any() ? string.Join(", ", settings.TestMethodNameFormatExamples) : AnalyzersSettings.NoTestMethodNameExamplesProvided;
            var    diagnostic             = Diagnostic.Create(Rule, methodDeclaration.Identifier.GetLocation(), methodDeclaration.Identifier.ToString(), settings.TestMethodNameFormat, testNameFormatExamples);

            context.ReportDiagnostic(diagnostic);
        }
        private static void AnalyzeNode(SyntaxNodeAnalysisContext context, IUnitTestParser parser)
        {
            if (!parser.IsUnitTestMethod(context))
            {
                return;
            }

            MethodDeclarationSyntax methodDeclaration = (MethodDeclarationSyntax)context.Node;

            IEnumerable <SyntaxNode> descendantNodes = methodDeclaration.Body.DescendantNodes();

            if (!descendantNodes?.Any() ?? true)
            {
                return;
            }

            IEnumerable <MemberAccessExpressionSyntax>   memberAccessExpressions = descendantNodes.OfType <MemberAccessExpressionSyntax>();
            IEnumerable <ObjectCreationExpressionSyntax> ctorExpressions         = descendantNodes.OfType <ObjectCreationExpressionSyntax>();

            if (!memberAccessExpressions.Any() && !ctorExpressions.Any())
            {
                return;
            }

            IEnumerable <SyntaxTrivia> singleLineComments = methodDeclaration.Body.DescendantTrivia().Where(trivia => trivia.IsKind(SyntaxKind.SingleLineCommentTrivia));

            IEnumerable <SyntaxTrivia> arrangeComments = singleLineComments.Where(comment => string.Equals("// Arrange.", comment.ToFullString()));
            IEnumerable <SyntaxTrivia> actComments     = singleLineComments.Where(comment => string.Equals("// Act.", comment.ToFullString()));
            IEnumerable <SyntaxTrivia> assertComments  = singleLineComments.Where(comment => string.Equals("// Assert.", comment.ToFullString()));

            Diagnostic   diagnostic         = null;
            LinePosition arrangeCommentLine = default(LinePosition);

            if (arrangeComments.Any())
            {
                arrangeCommentLine = arrangeComments.First().GetLocation().GetLineSpan().StartLinePosition;
            }

            // Check to see whether each comment exists. Only a single instance of each comment should exist.
            if (arrangeComments.Count() != 1 || actComments.Count() != 1 || assertComments.Count() != 1)
            {
                diagnostic = Diagnostic.Create(AAACommentsRule, methodDeclaration.Identifier.GetLocation(), methodDeclaration.Identifier.ToString());
            }
            else
            {
                // Check whether the comments appear with the expected order.
                LinePosition actCommentLine    = actComments.First().GetLocation().GetLineSpan().StartLinePosition;
                LinePosition assertCommentLine = assertComments.First().GetLocation().GetLineSpan().StartLinePosition;

                if (arrangeCommentLine > actCommentLine || actCommentLine > assertCommentLine)
                {
                    diagnostic = Diagnostic.Create(AAACommentsRule, methodDeclaration.Identifier.GetLocation(), methodDeclaration.Identifier.ToString());
                }
            }

            if (diagnostic != null)
            {
                context.ReportDiagnostic(diagnostic);
            }

            var methodOpenBrace = methodDeclaration.Body.ChildTokens().FirstOrDefault(token => token.IsKind(SyntaxKind.OpenBraceToken));

            LinePosition openBraceLinePosition = methodOpenBrace.GetLocation().GetLineSpan().EndLinePosition;

            if (arrangeCommentLine.Line != openBraceLinePosition.Line + 1)
            {
                diagnostic = Diagnostic.Create(FirstLineArrangeRule, methodDeclaration.Identifier.GetLocation(), methodDeclaration.Identifier.ToString());
                context.ReportDiagnostic(diagnostic);
            }
        }