public void FlipsNegativeLookAheadToPositiveLookAhead()
        {
            // Arrange
            var foo = new List <RegexNode>
            {
                new CharacterNode('f'),
                new CharacterNode('o'),
                new CharacterNode('o')
            };
            var lookaroundGroupNode = new LookaroundGroupNode(true, false, foo);
            var rootNode            = new ConcatenationNode(lookaroundGroupNode);
            var target = new LookAroundMutator();

            // Act
            var result = target.ApplyMutations(lookaroundGroupNode, rootNode).ToList();

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

            mutation.OriginalNode.ShouldBe(lookaroundGroupNode);
            mutation.ReplacementNode.ToString().ShouldBe("(?=foo)");
            mutation.ReplacementPattern.ShouldBe("(?=foo)");
            mutation.DisplayName.ShouldBe("Regex greedy quantifier quantity mutation");
            mutation.Description.ShouldBe("Quantifier \"(?!foo)\" was replaced with \"(?=foo)\" at offset 0.");
        }
        public void ToStringOnLookaroundGroupWithLookaheadFalseAndPossitiveFalseShouldReturnPossitiveLookahead()
        {
            // Arrange
            var target = new LookaroundGroupNode(false, false);

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

            // Assert
            result.ShouldBe("(?<!)");
        }
        public void ToStringOnLookaroundGroupWithLookaheadTrueAndPossitiveTrueShouldReturnPossitiveLookahead()
        {
            // Arrange
            var target = new LookaroundGroupNode(true, true);

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

            // Assert
            result.ShouldBe("(?=)");
        }
        public void ToStringOnLookaroundGroupChildNodeShouldReturnLookaroundWithChildNode()
        {
            // Arrange
            var childNode = new CharacterNode('a');
            var target    = new LookaroundGroupNode(true, true, childNode);

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

            // Assert
            result.ShouldBe("(?=a)");
        }
        public void ToStringOnLookaroundGroupWithLookaheadTrueAndPossitiveTruedShouldReturnPossitiveLookahead()
        {
            // Arrange
            var childNodes = new List <RegexNode> {
                new CharacterNode('a'), new CharacterNode('b'), new CharacterNode('c')
            };
            var target = new LookaroundGroupNode(true, true, childNodes);

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

            // Assert
            result.ShouldBe("(?=abc)");
        }
        public void CopyingLookaroundGroupNodeShouldCopyLookaheadAndPossitive()
        {
            // Arrange
            var target = new LookaroundGroupNode(true, true);

            // Act
            // AddNode returns a copy of the current node.
            var result = target.AddNode(new CharacterNode('a'));

            // Assert
            LookaroundGroupNode lookaroundGroupNode = result.ShouldBeOfType <LookaroundGroupNode>();

            lookaroundGroupNode.Lookahead.ShouldBe(target.Lookahead);
            lookaroundGroupNode.Possitive.ShouldBe(target.Possitive);
        }
        public void ToStringOnLookaroundGroupNodeWithprefixShouldReturnPrefixBeforeLookaroundGroupNode()
        {
            // Arrange
            var comment = new CommentGroupNode("This is a comment.");
            var target  = new LookaroundGroupNode(true, true)
            {
                Prefix = comment
            };

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

            // Assert
            result.ShouldBe("(?#This is a comment.)(?=)");
        }
        public void ChildNodesGetSpanShouldReturnTupleWithStartEqualToPreviousChildsStartPlusLengthStartingAt4IfLookaheadIsTrue()
        {
            // Arrange
            var childNodes = new List <RegexNode> {
                new CharacterNode('a'), new CharacterNode('b'), new CharacterNode('c')
            };
            var target = new LookaroundGroupNode(true, false, childNodes);

            // Act
            var(Start, Length)   = target.ChildNodes.First().GetSpan();
            var(Start2, Length2) = target.ChildNodes.ElementAt(1).GetSpan();
            var(Start3, _)       = target.ChildNodes.ElementAt(2).GetSpan();

            // Assert
            Start.ShouldBe(4);
            Start2.ShouldBe(Start + Length);
            Start3.ShouldBe(Start2 + Length2);
        }