Files
VAR.ExpressionEvaluator/VAR.ExpressionEvaluator.Tests/ParserTests.cs

445 lines
14 KiB
C#

using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace VAR.ExpressionEvaluator.Tests
{
[TestClass()]
public class ParserTests
{
#region Plus and Minus
[TestMethod()]
public void PlusAndMinus__Ten_EqualsTen()
{
string expression = "10";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(10m, result);
}
[TestMethod()]
public void PlusAndMinus__OnePlusTwo_EqualsThree()
{
string expression = "1 + 2";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(3m, result);
}
[TestMethod()]
public void PlusAndMinus__OneMinusTwo_EqualsMinusOne()
{
string expression = "1 - 2";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(-1m, result);
}
[TestMethod()]
public void PlusAndMinus__OneMillionMinusHundredThousands_EqualsNineHundredThousands()
{
string expression = "1000000 - 100000";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(900000m, result);
}
#endregion Plus and minus
#region Number signs
[TestMethod()]
public void Signs__MinusTen()
{
string expression = "-10";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(-10m, result);
}
[TestMethod()]
public void Signs__PlusTen()
{
string expression = "+10";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(10m, result);
}
[TestMethod()]
public void Signs__MinusMinusTen()
{
string expression = "--10";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(10m, result);
}
[TestMethod()]
public void Signs__MinusPlusChainTen()
{
string expression = "--++-+-10";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(10m, result);
}
[TestMethod()]
public void Signs__10Minus20Minus30()
{
string expression = "10 + -20 - +30";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(-40m, result);
}
#endregion Number signs
#region Multiplication and division
[TestMethod()]
public void MultAndDiv__10MutiplyBy2()
{
string expression = "10 * 2";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(20m, result);
}
[TestMethod()]
public void MultAndDiv__10DividedBy2()
{
string expression = "10 / 2";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(5m, result);
}
[TestMethod()]
public void MultAndDiv__5DividedBy2()
{
string expression = "5 / 2";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(2.5m, result);
}
[TestMethod()]
public void MultAndDiv__5DividedBy2Plus1()
{
string expression = "5 / 2 + 1";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(3.5m, result);
}
[TestMethod()]
public void MultAndDiv__1Plus5DividedBy2()
{
string expression = "1 + 5 / 2";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(3.5m, result);
}
[TestMethod()]
public void MultAndDiv__5DividedByParen1Plus1()
{
string expression = "5 / (1 + 1)";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(2.5m, result);
}
[TestMethod()]
public void MultAndDiv__Paren2Plus2DividedByParen1Plus1()
{
string expression = "(2 + 2) / (1 + 1)";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(2m, result);
}
#endregion Multiplication and division
#region Variables
[TestMethod()]
public void Variables__Var1PlusVar2()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", 1);
evaluationContex.SetVariable("v2", 1);
string expression = "v1 + v2";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.AreEqual(2m, result);
}
[TestMethod()]
public void Variables__Var1MultiplyVar2()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", 10);
evaluationContex.SetVariable("v2", 5);
string expression = "v1 * v2";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.AreEqual(50m, result);
}
[TestMethod()]
public void Variables__Var1DivideVar2()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("_v1", 100);
evaluationContex.SetVariable("$v2", 20);
string expression = "_v1 / $v2";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.AreEqual(5m, result);
}
#endregion Variables
#region Funcitions
[TestMethod()]
public void Functions__MaxFunction()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetFunction("max", (parameters) =>
{
return parameters.Max(p => (decimal)p);
});
string expression = "max(1,2,10,5)";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.AreEqual(10m, result);
}
[TestMethod()]
public void Functions__NestedTest()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("linea1", 1);
evaluationContex.SetVariable("linea2", 1);
evaluationContex.SetVariable("linea4", 4);
evaluationContex.SetFunction("iif", (parameters) =>
{
if (((bool)parameters[0]) == true)
{
return parameters[1];
}
else
{
return parameters[2];
}
});
string expression = "iif(linea1>linea2,iif(linea1>linea4, linea1, iif(linea4>linea2,linea4,linea2)),iif(linea2>linea4,linea2,linea4))";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.AreEqual(4m, result);
}
#endregion Functions
#region Strings
[TestMethod()]
public void Strings__Contatenate_Hello_World()
{
string expression = "\"Hello\" + ' ' +\"World\"";
object result = Parser.EvaluateString(expression);
Assert.AreEqual("Hello World", result);
}
[TestMethod()]
public void Strings__Contatenate_Hello_World_WithVariables()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", "Hello");
evaluationContex.SetVariable("v2", " ");
evaluationContex.SetVariable("v3", "World");
string expression = "v1 + v2 + v3";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.AreEqual("Hello World", result);
}
[TestMethod()]
public void Strings__Fail_Minus()
{
string expression = "'Hello' - 'World'";
try
{
object result = Parser.EvaluateString(expression);
Assert.Fail();
}
catch (Exception)
{
}
}
[TestMethod()]
public void Strings__Fail_Multiply()
{
string expression = "'Hello' * 'World'";
try
{
object result = Parser.EvaluateString(expression);
Assert.Fail();
}
catch (Exception)
{
}
}
[TestMethod()]
public void Strings__Fail_Division()
{
string expression = "'Hello' / 'World'";
try
{
object result = Parser.EvaluateString(expression);
Assert.Fail();
}
catch (Exception)
{
}
}
#endregion Strings
#region Relations
[TestMethod()]
public void Relations_1GreatherThan2_EqualsFalse()
{
string expression = "1>2";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(false, result);
}
[TestMethod()]
public void Relations_1Equals1_EqualsTrue()
{
string expression = "1=1";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(true, result);
}
[TestMethod()]
public void Relations_10NotEquals1_EqualsTrue()
{
string expression = "10!=1";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(true, result);
}
[TestMethod()]
public void Relations_10LessThan1_EqualsFalse()
{
string expression = "10<1";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(false, result);
}
[TestMethod()]
public void Relations_1GreaterOrEqualThan1_EqualsTrue()
{
string expression = "1>=1";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(true, result);
}
[TestMethod()]
public void Relations_1LessOrEqualThan1_EqualsTrue()
{
string expression = "1<=1";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(true, result);
}
[TestMethod()]
public void Relations_1GreaterOrEqualThan10_EqualsFalse()
{
string expression = "1>=10";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(false, result);
}
[TestMethod()]
public void Relations_10LessOrEqualThan1_EqualsFalse()
{
string expression = "10<=1";
object result = Parser.EvaluateString(expression);
Assert.AreEqual(false, result);
}
#endregion Relations
#region BooleanOps
[TestMethod()]
public void BooleanOps_And()
{
Assert.AreEqual(false, Parser.EvaluateString("false and false"));
Assert.AreEqual(false, Parser.EvaluateString("false and true"));
Assert.AreEqual(false, Parser.EvaluateString("true and false"));
Assert.AreEqual(true, Parser.EvaluateString("true and true"));
Assert.AreEqual(false, Parser.EvaluateString("false && false"));
Assert.AreEqual(false, Parser.EvaluateString("false && true"));
Assert.AreEqual(false, Parser.EvaluateString("true && false"));
Assert.AreEqual(true, Parser.EvaluateString("true && true"));
}
[TestMethod()]
public void BooleanOps_Or()
{
Assert.AreEqual(false, Parser.EvaluateString("false or false"));
Assert.AreEqual(true, Parser.EvaluateString("false or true"));
Assert.AreEqual(true, Parser.EvaluateString("true or false"));
Assert.AreEqual(true, Parser.EvaluateString("true or true"));
Assert.AreEqual(false, Parser.EvaluateString("false || false"));
Assert.AreEqual(true, Parser.EvaluateString("false || true"));
Assert.AreEqual(true, Parser.EvaluateString("true || false"));
Assert.AreEqual(true, Parser.EvaluateString("true || true"));
}
[TestMethod()]
public void BooleanOps_Not()
{
Assert.AreEqual(true, Parser.EvaluateString("!false"));
Assert.AreEqual(false, Parser.EvaluateString("!true"));
Assert.AreEqual(true, Parser.EvaluateString("not false"));
Assert.AreEqual(false, Parser.EvaluateString("not true"));
}
#endregion BooleanOps
#region Null value
[TestMethod()]
public void NullValue_NullPlusAnything_EqualsNull()
{
Assert.AreEqual(null, Parser.EvaluateString("null + 1"));
Assert.AreEqual(null, Parser.EvaluateString("null + 100"));
Assert.AreEqual(null, Parser.EvaluateString("1 + null"));
Assert.AreEqual(null, Parser.EvaluateString("100 + null"));
Assert.AreEqual(null, Parser.EvaluateString("null + null"));
}
[TestMethod()]
public void NullValue_NullMinusAnything_EqualsNull()
{
Assert.AreEqual(null, Parser.EvaluateString("null - 1"));
Assert.AreEqual(null, Parser.EvaluateString("null - 100"));
Assert.AreEqual(null, Parser.EvaluateString("1 - null"));
Assert.AreEqual(null, Parser.EvaluateString("100 - null"));
Assert.AreEqual(null, Parser.EvaluateString("null - null"));
}
[TestMethod()]
public void NullValue_NullByAnything_EqualsNull()
{
Assert.AreEqual(null, Parser.EvaluateString("null * 1"));
Assert.AreEqual(null, Parser.EvaluateString("null * 100"));
Assert.AreEqual(null, Parser.EvaluateString("1 * null"));
Assert.AreEqual(null, Parser.EvaluateString("100 * null"));
Assert.AreEqual(null, Parser.EvaluateString("null * null"));
Assert.AreEqual(null, Parser.EvaluateString("null / 1"));
Assert.AreEqual(null, Parser.EvaluateString("null / 100"));
Assert.AreEqual(null, Parser.EvaluateString("1 / null"));
Assert.AreEqual(null, Parser.EvaluateString("100 / null"));
Assert.AreEqual(null, Parser.EvaluateString("null / null"));
}
#endregion
}
}