blob: 6f46366e64445038d8fab3b2375ea4e5b9f2f3fc [file] [log] [blame]
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml.FormulaParsing.ExpressionGraph;
using ExpGraph = OfficeOpenXml.FormulaParsing.ExpressionGraph.ExpressionGraph;
using OfficeOpenXml.FormulaParsing.Excel.Operators;
namespace EPPlusTest.FormulaParsing.ExpressionGraph
{
[TestClass]
public class ExpressionCompilerTests
{
private IExpressionCompiler _expressionCompiler;
private ExpGraph _graph;
[TestInitialize]
public void Setup()
{
_expressionCompiler = new ExpressionCompiler();
_graph = new ExpGraph();
}
[TestMethod]
public void ShouldCompileTwoInterExpressionsToCorrectResult()
{
var exp1 = new IntegerExpression("2");
exp1.Operator = Operator.Plus;
_graph.Add(exp1);
var exp2 = new IntegerExpression("2");
_graph.Add(exp2);
var result = _expressionCompiler.Compile(_graph.Expressions);
Assert.AreEqual(4d, result.Result);
}
[TestMethod]
public void CompileShouldMultiplyGroupExpressionWithFollowingIntegerExpression()
{
var groupExpression = new GroupExpression(false);
groupExpression.AddChild(new IntegerExpression("2"));
groupExpression.Children.First().Operator = Operator.Plus;
groupExpression.AddChild(new IntegerExpression("3"));
groupExpression.Operator = Operator.Multiply;
_graph.Add(groupExpression);
_graph.Add(new IntegerExpression("2"));
var result = _expressionCompiler.Compile(_graph.Expressions);
Assert.AreEqual(10d, result.Result);
}
[TestMethod]
public void CompileShouldCalculateMultipleExpressionsAccordingToPrecedence()
{
var exp1 = new IntegerExpression("2");
exp1.Operator = Operator.Multiply;
_graph.Add(exp1);
var exp2 = new IntegerExpression("2");
exp2.Operator = Operator.Plus;
_graph.Add(exp2);
var exp3 = new IntegerExpression("2");
exp3.Operator = Operator.Multiply;
_graph.Add(exp3);
var exp4 = new IntegerExpression("2");
_graph.Add(exp4);
var result = _expressionCompiler.Compile(_graph.Expressions);
Assert.AreEqual(8d, result.Result);
}
}
}