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