public void GetInverse_ReturnsIntersectExpressionWithTwoSubexpressionsEachHavingRepeatIntervalNull_WhenOriginalExpressionContainsSingleSubExpressionWithRepeatIntervalFrom1To2() { var repeatInterval = new IntegerInterval(); repeatInterval.TrySetValue(1, 2); var inverseSubExpression = Substitute.For <IExpression>(); var subExpression = Substitute.For <IExpression>(); subExpression.GetInverse().Returns(inverseSubExpression); subExpression.RepeatRange.Returns(repeatInterval); subExpression.ExpansionLength.Returns(2); var concatExpression = new ConcatenationExpression(_randomGenerator); concatExpression.Append(subExpression); var result = concatExpression.GetInverse(); Assert.IsInstanceOf <IntersectionExpression>(result); var resultAsList = ((IntersectionExpression)result).ToConcatExpressionList(); Assert.AreEqual(2, resultAsList.Count); Assert.IsNull(resultAsList[0].RepeatRange); Assert.IsNull(resultAsList[1].RepeatRange); }
public void GetInverse_ReturnsIntersectExpressionWithTwoSubexpressionsOfLength3_WhenOriginalExpressionContains3SubExpressionsWithMiddleExpressionOfRepeatIntervalFrom1To2() { var repeatInterval = new IntegerInterval(); repeatInterval.TrySetValue(1, 2); var inverseSubExpression = Substitute.For <IExpression>(); inverseSubExpression.GetInverse().Returns(Substitute.For <IExpression>()); var subExpression = Substitute.For <IExpression>(); subExpression.GetInverse().Returns(inverseSubExpression); subExpression.RepeatRange.Returns(repeatInterval); subExpression.ExpansionLength.Returns(2); var concatExpression = new ConcatenationExpression(_randomGenerator); concatExpression.Append(inverseSubExpression).Append(subExpression).Append(inverseSubExpression); var result = concatExpression.GetInverse(); Assert.IsInstanceOf <IntersectionExpression>(result); var resultAsList = ((IntersectionExpression)result).ToConcatExpressionList(); Assert.AreEqual(2, resultAsList.Count); Assert.AreEqual(3, ((UnionExpression)resultAsList[0]).ToIntersectionExpressionList().Count); Assert.AreEqual(4, ((UnionExpression)resultAsList[1]).ToIntersectionExpressionList().Count); }
public void Expand_ReturnsListContaining3ElementsOfLength4_WhenOneExpandableExpressionWith3PossibleSubexpressionsIsContained() { var mockA = new StringBuilderMock(ToCharacterClassList("a")); var mock1 = new StringBuilderMock(ToCharacterClassList("1")); var mock2 = new StringBuilderMock(ToCharacterClassList("2")); var mock3 = new StringBuilderMock(ToCharacterClassList("3")); var simpleExpression = Substitute.For <IExpression>(); simpleExpression.RepeatRange = new IntegerInterval(1); simpleExpression.Expand().Returns(new List <IStringBuilder> { mockA }); var expandableExpression = Substitute.For <IExpression>(); expandableExpression.RepeatRange = new IntegerInterval(1); expandableExpression.Expand().Returns(new List <IStringBuilder> { mock1, mock2, mock3 }); var concat = new ConcatenationExpression(_random); concat.SetExpansionLength(4); concat.Append(simpleExpression).Append(expandableExpression).Append(simpleExpression).Append(simpleExpression); var result = concat.Expand(); Assert.AreEqual(3, result.Count); Assert.AreEqual("a1aa", result[0].GenerateString()); Assert.AreEqual("a2aa", result[1].GenerateString()); Assert.AreEqual("a3aa", result[2].GenerateString()); }
private void TestThatConcatenationYields(string left, string right, string expectedResult) { var leftExpr = new StringLiteral(left); var rightExpr = new StringLiteral(right); var concatExpr = new ConcatenationExpression(leftExpr, rightExpr); concatExpr.TryEvaluate(EmptyEnvironment, out string actualResult).Should().BeTrue(); actualResult.Should().Be(expectedResult); }
public void TestThatEvalFailsIfEitherExpressionCannotBeEvaluated() { var concat = new ConcatenationExpression(AnyUnevaluatableExpr, AnyEvaluatableExpr); concat.TryEvaluate(EmptyEnvironment, out string value).Should().BeFalse(); concat = new ConcatenationExpression(AnyEvaluatableExpr, AnyUnevaluatableExpr); concat.TryEvaluate(EmptyEnvironment, out value).Should().BeFalse(); }
public void TestThatInnerExpressionsCanBeRetrieved() { var left = new StringLiteral("left"); var right = new StringLiteral("right"); var concat = new ConcatenationExpression(left, right); concat.Left.Should().BeSameAs(left); concat.Right.Should().BeSameAs(right); }
public void GetInverse_ReturnsStringBuilderReturningComplementOfSingleCharacterClass_WhenIntersectionExpressionContainsSingleElementWithCharactersRA() { var concat1 = new ConcatenationExpression(_randomGenerator); concat1.Append(ToCharacterClass("r", "a")); var expression = new IntersectionExpressionTest(new List <IExpression> { concat1 }, _randomGenerator); var result = expression.GetInverse().ToStringBuilder().GenerateString(); Assert.IsNotNull(result); Assert.AreEqual("F", result); }
public void ToSingleStringBuilder_ReturnedStringBuilderReturnsIntersection_WhenTwoConcatExpressionsContainedInIntersectionExpression() { var concat1 = new ConcatenationExpression(_randomGenerator); concat1.Append(ToCharacterClass("F", "f")).Append(ToCharacterClass("R", "r")); var concat2 = new ConcatenationExpression(_randomGenerator); concat2.Append(ToCharacterClass("F")).Append(ToCharacterClass("r")); var expression = new IntersectionExpressionTest(new List <IExpression> { concat1, concat2 }, _randomGenerator); var result = expression.ToSingleStringBuilder().GenerateString(); Assert.IsNotNull(result); Assert.AreEqual("Fr", result); }
public override NFAModel ConvertConcatenation(ConcatenationExpression exp) { var leftNFA = Convert(exp.Left); var rightNFA = Convert(exp.Right); //connect left with right leftNFA.TailState.AddEdge(rightNFA.EntryEdge); var concatenationNfa = new NFAModel(); concatenationNfa.AddStates(leftNFA.States); concatenationNfa.AddStates(rightNFA.States); concatenationNfa.EntryEdge = leftNFA.EntryEdge; concatenationNfa.TailState = rightNFA.TailState; return(concatenationNfa); }
public void Clone_ReturnsNewConcatenationInstanceWithSameValues() { var expression = Substitute.For <IExpression>(); var concat = new ConcatenationExpression(_random) { RepeatRange = new IntegerInterval() }; concat.RepeatRange.TrySetValue(1, 3); concat.Append(expression); var result = concat.Clone(); Assert.AreNotEqual(concat, result); Assert.AreEqual(concat.RepeatRange.Start, result.RepeatRange.Start); Assert.AreEqual(concat.RepeatRange.End, result.RepeatRange.End); expression.Received(1).Clone(); }
public void Expand_DoesNotChangeRepeatRangeValue_WhenCalled() { var clone = Substitute.For <IExpression>(); clone.Expand().Returns(new List <IStringBuilder> { new StringBuilderMock(new List <CharacterClassExpression>()) }); var expression = Substitute.For <IExpression>(); expression.Clone().Returns(clone); expression.RepeatRange = new IntegerInterval(); expression.RepeatRange.TrySetValue(1, 3); var concat = new ConcatenationExpression(_random); concat.Append(expression); concat.Expand(); Assert.AreEqual(1, expression.RepeatRange.Start); Assert.AreEqual(3, expression.RepeatRange.End); }
public void Expand_ReturnsListContainingTwoElements_WhenSingleNotExpandableExpressionWithRepeatRangeFrom1To3IsContainedAndMaxExpansionLengthIs2() { var clone = Substitute.For <IExpression>(); clone.Expand().Returns(new List <IStringBuilder> { new StringBuilderMock(new List <CharacterClassExpression>()) }); clone.ExpansionLength.Returns(2); var expression = Substitute.For <IExpression>(); expression.Clone().Returns(clone); expression.RepeatRange = new IntegerInterval(); expression.RepeatRange.TrySetValue(1, 3); expression.ExpansionLength.Returns(2); var concat = new ConcatenationExpression(_random); concat.Append(expression); concat.SetExpansionLength(2); var result = concat.Expand(); Assert.AreEqual(2, result.Count); }
public abstract T ConvertConcatenation(ConcatenationExpression exp);