示例#1
0
        public void EndExpression_WhenInsideKleene_SetsExpression()
        {
            // Arrange:
            var stack = new Stack <IAstNode>();

            var kleeneToken = new Token {
                TokenKind = TokenKind.LeftBrace, Image = "{"
            };
            var kleene = new KleeneNode(kleeneToken, _tracerMock.Object);

            stack.Push(kleene);

            var exprToken = new Token {
                TokenKind = TokenKind.String, Image = "<T>"
            };
            var expr = _nodeFactoryMock.Object.Create(AstNodeType.Expression, exprToken);

            stack.Push(expr);

            var builder = new AstBuilder(null, null, stack, _tracerMock.Object);

            // Act:
            builder.EndExpression();

            // Assert:
            Assert.That(stack.Count, Is.EqualTo(1));
            Assert.That(stack.Peek(), Is.InstanceOf(typeof(IKleeneStarNode)));
            Assert.That((stack.Peek() as IKleeneStarNode)?.Expression, Is.Not.Null);
        }
示例#2
0
        public IAstNode BuildTree()
        {
            var kleeneNode = new KleeneNode(new Token(), _tracer);
            var exprNode   = _expr.BuildTree();

            kleeneNode.Expression = exprNode;
            return(kleeneNode);
        }
示例#3
0
        public void KleeneNode_WithExpression_ReturnsCorrectString()
        {
            // Arranged:
            var exprNodeMock = new Mock <IExpressionNode>();

            exprNodeMock.Setup(exprNode => exprNode.AstNodeType).Returns(AstNodeType.Expression);
            exprNodeMock.Setup(exprNode => exprNode.ToString()).Returns(() => "<T>");

            var node = new KleeneNode(new Token(TokenKind.LeftBrace, "("), _tracer)
            {
                Expression = exprNodeMock.Object
            };

            // Act:
            var actual = node.ToString();

            // Assert:
            Assert.That(actual, Is.EqualTo("{ <T> }"));
        }
示例#4
0
        private Mock <IAstNodeFactory> BuildNodeFactory()
        {
            var mock = new Mock <IAstNodeFactory>();

            // Syntax
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Syntax),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new SyntaxNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Statement
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Statement),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new StatementNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Expression
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Expression),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new ExpressionNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Term
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Term),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new TermNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Factor
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Factor),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new FactorNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Paren
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Paren),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new ParenNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Option
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Option),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new OptionNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Kleene
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.KleeneStar),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new KleeneNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // ProdRef
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.ProdRef),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new ProdRefNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Terminal
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Terminal),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new TerminalNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            });

            // Action
            mock.Setup(factory =>
                       factory.Create(It.Is <AstNodeType>(nodeType => nodeType == AstNodeType.Action),
                                      It.IsAny <IToken>()))
            .Returns((AstNodeType nodeType, IToken token) =>
            {
                var node = new ActionNode(token, _tracerMock.Object);
                _allNodes.Add(node);
                return(node);
            }); mock.Setup(factory => factory.AllNodes).Returns(_allNodes);

            return(mock);
        }