Esempio n. 1
0
        void ProcessCallExpression_returns_returnType_when_ok()
        {
            var scope = new SymbolScope();

            var name = new IdentifierToken("print", default);

            var funcSymbol = new FunctionSymbol(name.Value, DataType.Long,                            // return
                                                new DataType[] { DataType.Double, DataType.Double }); // need

            scope.AddSymbol(funcSymbol);

            var param1        = new Mock <ExpressionAst>().Object;
            var param2        = new Mock <ExpressionAst>().Object;
            var callParamList = new CallParamListAst(new[] { param1, param2 });

            var ast = new CallExpressionAst(
                name, new OperatorToken(Operator.LeftParen, default), callParamList,
                new OperatorToken(Operator.RightParen, default));

            var generator = ConfigureGenerator(scope, mock =>
            {
                mock.Setup(p => p.ProcessExpression(param1)).Returns(DataType.Double); // provide
                mock.Setup(p => p.ProcessExpression(param2)).Returns(DataType.Double); // provide
            });

            Assert.Equal(DataType.Long, generator.ProcessCallExpression(ast));
        }
Esempio n. 2
0
        void ProcessCallExpression_throw_when_param_number_not_match()
        {
            var scope = new SymbolScope();

            var name = new IdentifierToken("print", default);

            var funcSymbol = new FunctionSymbol(name.Value, DataType.Long, new DataType[] { DataType.Long });

            scope.AddSymbol(funcSymbol);

            var param1        = new Mock <ExpressionAst>().Object;
            var param2        = new Mock <ExpressionAst>().Object;
            var callParamList = new CallParamListAst(new[] { param1, param2 });

            var ast = new CallExpressionAst(
                name, new OperatorToken(Operator.LeftParen, default), callParamList,
                new OperatorToken(Operator.RightParen, default));

            var generator = ConfigureGenerator(scope, mock =>
            {
                mock.Setup(p => p.ProcessExpression(param1)).Returns(DataType.Long);
                mock.Setup(p => p.ProcessExpression(param2)).Returns(DataType.Long);
            });

            Assert.Throws <SemanticException>(() => generator.ProcessCallExpression(ast));
        }