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); }
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); }
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"); }
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); }
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); }
/// <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); }