Пример #1
0
        public void ShouldApplyMultipleMutations()
        {
            // Arrange
            var target = new RegexMutantOrchestrator(@"^[abc]\d?");

            // Act
            var result = target.Mutate();

            // Assert
            result.Count().ShouldBeGreaterThanOrEqualTo(4);
        }
Пример #2
0
        public void ShouldRemoveAnchor()
        {
            // Arrange
            var target = new RegexMutantOrchestrator("^abc");

            // Act
            var result = target.Mutate();

            // Assert
            var mutation = result.ShouldHaveSingleItem();

            mutation.OriginalNode.ToString().ShouldBe("^");
            mutation.ReplacementNode.ShouldBeNull();
            mutation.ReplacementPattern.ShouldBe("abc");
            mutation.DisplayName.ShouldBe("Regex anchor removal mutation");
            mutation.Description.ShouldBe("Anchor \"^\" was removed at offset 0.");
        }
Пример #3
0
        public void ShouldUnnegateNegatedCharacterClass()
        {
            // Arrange
            var target = new RegexMutantOrchestrator("abc[^XY]");

            // Act
            var result = target.Mutate();

            // Assert
            var mutation = result.ShouldHaveSingleItem();

            mutation.OriginalNode.ToString().ShouldBe("[^XY]");
            mutation.ReplacementNode.ToString().ShouldBe("[XY]");
            mutation.ReplacementPattern.ShouldBe("abc[XY]");
            mutation.DisplayName.ShouldBe("Regex character class negation mutation");
            mutation.Description.ShouldBe("Character class \"[^XY]\" was replaced with \"[XY]\" at offset 3.");
        }
Пример #4
0
        public void ShouldRemoveLazyQuantifier()
        {
            // Arrange
            var target = new RegexMutantOrchestrator("abcX??");

            // Act
            var result = target.Mutate();

            // Assert
            var mutation = result.ShouldHaveSingleItem();

            mutation.OriginalNode.ToString().ShouldBe("X??");
            mutation.ReplacementNode.ToString().ShouldBe("X");
            mutation.ReplacementPattern.ShouldBe("abcX");
            mutation.DisplayName.ShouldBe("Regex quantifier removal mutation");
            mutation.Description.ShouldBe("Quantifier \"??\" was removed at offset 4.");
        }
Пример #5
0
        public void ShouldNegateUnnegatedCharacterClassShorthand()
        {
            // Arrange
            var target = new RegexMutantOrchestrator(@"abc\d");

            // Act
            var result = target.Mutate();

            // Assert
            var mutation = result.ShouldHaveSingleItem();

            mutation.OriginalNode.ToString().ShouldBe("\\d");
            mutation.ReplacementNode.ToString().ShouldBe("\\D");
            mutation.ReplacementPattern.ShouldBe("abc\\D");
            mutation.DisplayName.ShouldBe("Regex character class shorthand negation mutation");
            mutation.Description.ShouldBe("Character class shorthand \"\\d\" was replaced with \"\\D\" at offset 3.");
        }
Пример #6
0
        public override IEnumerable <Mutation> ApplyMutations(ObjectCreationExpressionSyntax node)
        {
            string name = node.Type.ToString();

            if (name == typeof(Regex).Name || name == typeof(Regex).FullName)
            {
                var arguments         = node.ArgumentList.Arguments;
                var namedArgument     = arguments.Where(argument => argument.NameColon?.Name.Identifier.ValueText == PatternArgumentName).FirstOrDefault();
                var patternArgument   = namedArgument ?? node.ArgumentList.Arguments.FirstOrDefault();
                var patternExpression = patternArgument?.Expression;

                if (patternExpression?.Kind() == SyntaxKind.StringLiteralExpression)
                {
                    var currentValue            = ((LiteralExpressionSyntax)patternExpression).Token.ValueText;
                    var regexMutantOrchestrator = new RegexMutantOrchestrator(currentValue);
                    var replacementValues       = regexMutantOrchestrator.Mutate();
                    foreach (RegexMutation regexMutation in replacementValues)
                    {
                        try
                        {
                            _ = new Regex(regexMutation.ReplacementPattern);
                        }
                        catch (ArgumentException exception)
                        {
                            Logger.LogDebug($"RegexMutator created mutation {currentValue} -> {regexMutation.ReplacementPattern} which is an invalid regular expression:\n{exception.Message}");
                            continue;
                        }

                        yield return(new Mutation()
                        {
                            OriginalNode = patternExpression,
                            ReplacementNode = SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(regexMutation.ReplacementPattern)),
                            DisplayName = regexMutation.DisplayName,
                            Type = Mutator.Regex,
                            Description = regexMutation.Description
                        });
                    }
                }
            }
        }