public void Grab_UnresolvedRuleRef_ThrowsException() { var ruleRef = new RuleRef <string>(); var index = new TokenStreamIndex(new TokenStream(StaticLexer.FromWords()), 0); ruleRef.Invoking(r => index.OperationsMock().Evaluate(r)).Should().Throw <InvalidOperationException>(); }
private void AssertLookahead(IRule rule, TokenStreamIndex index, bool expectedSuccess) { var opsMock = index.OperationsMock().Evaluate(rule); opsMock.Result.IsSuccess.Should().Be(expectedSuccess); opsMock.Result.Index.Index.Should().Be(0); if (expectedSuccess && rule is And) { opsMock.ConcatTokens().Should().Be("A"); } }
public void RuleRef_GrabWithRule_GrabsTargetRule() { var mockRule = new MockRule(nameof(MockRule)); var ruleRef = new RuleRef <string>(mockRule); var index = new TokenStreamIndex(new TokenStream(StaticLexer.FromWords()), 0); index.OperationsMock().Evaluate(ruleRef); mockRule.DidGrab.Should().BeTrue(); }
public void AbbaSequence_GivenParseTextAndStart_BehavesCorrectly(string text, int start, string expectedMatch) { var stream = new TokenStream(new CharacterLexer(text)); var index = new TokenStreamIndex(stream, start); var rule = CreateAbbaRule(); var opsMock = index.OperationsMock().Evaluate(rule); opsMock.Result.IsSuccess.Should().Be(expectedMatch.Length == 4); opsMock.Result.Index.Index.Should().Be(opsMock.Result.IsSuccess ? start + expectedMatch.Length : start); opsMock.ConcatTokens().Should().Be(expectedMatch); }
public void ARepeated3to5_GivenParseTextAndStart_BehavesCorrectly(string text, bool expectedSuccess, string expectedMatch) { var stream = new TokenStream(new CharacterLexer(text)); var index = new TokenStreamIndex(stream, 0); var rule = CreateARepeatedRule(3, 5); var opsMock = index.OperationsMock().Evaluate(rule); opsMock.Result.IsSuccess.Should().Be(expectedSuccess); opsMock.Result.Index.Index.Should().Be(expectedSuccess ? expectedMatch.Length : 0); opsMock.ConcatTokens().Should().Be(expectedMatch); }
public void ARepeated_GivenArbitraryNumberOfAs_BehavesCorrectly(int count, string text) { var stream = new TokenStream(new CharacterLexer(text)); var index = new TokenStreamIndex(stream, 0); var rule = CreateARepeatedRule(); var opsMock = index.OperationsMock().Evaluate(rule); opsMock.Result.IsSuccess.Should().BeTrue(); opsMock.Result.Index.Index.Should().Be(count); opsMock.Tokens.Count.Should().Be(count); opsMock.Tokens.All(t => t.Value == "A").Should().BeTrue(); }
public void AnyTerminal_WithAnyCharacter_Succeeds(string text) { var stream = new TokenStream(new CharacterLexer(text)); var rule = new AnyTerminal("TEST"); TokenStreamIndex index; RuleOperationsMock opsMock; for (int i = 0; i < text.Length; i++) { index = new TokenStreamIndex(stream, i); opsMock = index.OperationsMock().Evaluate(rule); opsMock.Result.IsSuccess.Should().BeTrue(); opsMock.Result.Index.Index.Should().Be(i + 1); opsMock.ConcatTokens().Should().Be(text.Substring(i, 1)); } index = new TokenStreamIndex(stream, text.Length); opsMock = index.OperationsMock().Evaluate(rule); opsMock.Result.IsSuccess.Should().BeFalse(); opsMock.Result.Index.Index.Should().Be(index.Index); opsMock.ConcatTokens().Should().Be(String.Empty); }