public void ShouldApplyMultipleMutations() { // Arrange var target = new RegexMutantOrchestrator(@"^[abc]\d?"); // Act var result = target.Mutate(); // Assert result.Count().ShouldBeGreaterThanOrEqualTo(4); }
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."); }
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."); }
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."); }
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."); }
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 }); } } } }