Esempio n. 1
0
        public void SpanLengthShouldBeEqualToToStringLength()
        {
            // Arrange
            var start  = new CharacterNode('a');
            var end    = new CharacterNode('z');
            var target = new CharacterClassRangeNode(start, end);

            // Act
            var(_, Length) = target.GetSpan();

            // Assert
            Length.ShouldBe(3);
        }
Esempio n. 2
0
        public void EndShouldReturnOriginalEnd()
        {
            // Arrange
            var start  = new CharacterNode('a');
            var end    = new CharacterNode('z');
            var target = new CharacterClassRangeNode(start, end);

            // Act
            var result = target.End;

            // Assert
            result.ShouldBe(end);
        }
Esempio n. 3
0
        public void ToStringOnCharacterClassRangeNodeShouldReturnRangeWithStartAndEndSeperatedByDash()
        {
            // Arrange
            var start  = new CharacterNode('a');
            var end    = new CharacterNode('z');
            var target = new CharacterClassRangeNode(start, end);

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

            // Assert
            result.ShouldBe("a-z");
        }
Esempio n. 4
0
        public void EndSpanShouldStartAfterStartAndDash()
        {
            // Arrange
            var start = new CharacterNode('a');
            var end   = new CharacterNode('z');

            _ = new CharacterClassRangeNode(start, end);

            // Act
            var(Start, Length) = end.GetSpan();

            // Assert
            Start.ShouldBe(2);
            Length.ShouldBe(1);
        }
Esempio n. 5
0
        public void StartSpanShouldStartBe0()
        {
            // Arrange
            var start = new CharacterNode('a');
            var end   = new CharacterNode('z');

            _ = new CharacterClassRangeNode(start, end);

            // Act
            var(Start, Length) = start.GetSpan();

            // Assert
            Start.ShouldBe(0);
            Length.ShouldBe(1);
        }
Esempio n. 6
0
        /// <summary>
        /// Parse a character range [x-y] inside a character class.
        /// Throws an exception if the end of the range is a shorthand or unicode category or if start > end.
        /// </summary>
        /// <param name="startNode">The start of the range. Should be a CharacterNode or EscapeCharacterNode.</param>
        private CharacterClassRangeNode ParseCharacterRange(RegexNode startNode)
        {
            RegexNode rangeEnd;
            char      rangeEndChar;
            char      ch = RightCharMoveRight();

            // End of range is an escape character
            if (ch == '\\')
            {
                rangeEnd = ParseBasicBackslash();

                // Don't allow shorthand or unicode category/block in a character range.
                if (!(rangeEnd is EscapeCharacterNode escapeChar))
                {
                    throw MakeException(RegexParseError.BadClassInCharacterRange, rangeEnd);
                }

                rangeEndChar = escapeChar.Character;
            }

            // End of range is a literal character
            else
            {
                rangeEnd     = new CharacterNode(ch);
                rangeEndChar = ch;
            }

            char rangeStartChar = startNode is CharacterNode characterNode ? characterNode.Character : ((EscapeCharacterNode)startNode).Character;

            // The end of a character range should be greater than or equal to the start.
            if (rangeStartChar > rangeEndChar)
            {
                throw MakeException(RegexParseError.ReverseCharacterRange);
            }

            var range = new CharacterClassRangeNode(startNode, rangeEnd);

            return(range);
        }