Parser: Variables and functions.

This commit is contained in:
2019-12-01 18:44:10 +01:00
parent 0fe4e54bcb
commit b82500492f
18 changed files with 219 additions and 29 deletions

View File

@@ -14,7 +14,7 @@ namespace VAR.ExpressionEvaluator.Tests
operation: (a, b) => (decimal)a + (decimal)b
);
var result = expr.Eval();
var result = expr.Eval(null);
Assert.AreEqual(30m, result);
}
@@ -28,7 +28,7 @@ namespace VAR.ExpressionEvaluator.Tests
operation: (a, b) => (decimal)a - (decimal)b
);
var result = expr.Eval();
var result = expr.Eval(null);
Assert.AreEqual(-10m, result);
}
@@ -42,7 +42,7 @@ namespace VAR.ExpressionEvaluator.Tests
operation: (a, b) => (decimal)a * (decimal)b
);
var result = expr.Eval();
var result = expr.Eval(null);
Assert.AreEqual(200m, result);
}
@@ -56,7 +56,7 @@ namespace VAR.ExpressionEvaluator.Tests
operation: (a, b) => (decimal)a / (decimal)b
);
var result = expr.Eval();
var result = expr.Eval(null);
Assert.AreEqual(2m, result);
}

View File

@@ -9,21 +9,21 @@ namespace VAR.ExpressionEvaluator.Tests
public void ExpressionNumberNode__One()
{
IExpressionNode node = new ExpressionNumberNode(1);
Assert.AreEqual(1m, node.Eval());
Assert.AreEqual(1m, node.Eval(null));
}
[TestMethod()]
public void ExpressionNumberNode__Two()
{
IExpressionNode node = new ExpressionNumberNode(2);
Assert.AreEqual(2m, node.Eval());
Assert.AreEqual(2m, node.Eval(null));
}
[TestMethod()]
public void ExpressionNumberNode__OneHundredDotFortyFive()
{
IExpressionNode node = new ExpressionNumberNode(100.45m);
Assert.AreEqual(100.45m, node.Eval());
Assert.AreEqual(100.45m, node.Eval(null));
}
}
}

View File

@@ -9,22 +9,21 @@ namespace VAR.ExpressionEvaluator.Tests
public void ExpressionNumberNode__Hello()
{
IExpressionNode node = new ExpressionStringNode("Hello");
Assert.AreEqual("Hello", node.Eval());
Assert.AreEqual("Hello", node.Eval(null));
}
[TestMethod()]
public void ExpressionNumberNode__World()
{
IExpressionNode node = new ExpressionStringNode("World");
Assert.AreEqual("World", node.Eval());
Assert.AreEqual("World", node.Eval(null));
}
[TestMethod()]
public void ExpressionNumberNode__Hello_World()
{
IExpressionNode node = new ExpressionStringNode("Hello World");
Assert.AreEqual("Hello World", node.Eval());
Assert.AreEqual("Hello World", node.Eval(null));
}
}
}

View File

@@ -1,4 +1,5 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Linq;
namespace VAR.ExpressionEvaluator.Tests
{
@@ -145,5 +146,48 @@ namespace VAR.ExpressionEvaluator.Tests
#endregion Multiplication and division
#region Variables
[TestMethod()]
public void ParseString__Var1PlusVar2()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", 1m);
evaluationContex.SetVariable("v2", 1m);
string expression = "v1 + v2";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.AreEqual(2m, result);
}
[TestMethod()]
public void ParseString__Var1MultiplyVar2()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", 10m);
evaluationContex.SetVariable("v2", 5m);
string expression = "v1 * v2";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.AreEqual(50m, result);
}
#endregion Variables
#region Funcitions
[TestMethod()]
public void ParseString__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);
}
#endregion Functions
}
}

View File

@@ -96,17 +96,17 @@ namespace VAR.ExpressionEvaluator.Tests
var t = new Tokenizer(new StringReader(testString));
// "null"
Assert.AreEqual(t.Token, Token.Keyword);
Assert.AreEqual(t.Token, Token.Identifier);
Assert.AreEqual(t.Text, "null");
t.NextToken();
// "true"
Assert.AreEqual(t.Token, Token.Keyword);
Assert.AreEqual(t.Token, Token.Identifier);
Assert.AreEqual(t.Text, "true");
t.NextToken();
// "false"
Assert.AreEqual(t.Token, Token.Keyword);
Assert.AreEqual(t.Token, Token.Identifier);
Assert.AreEqual(t.Text, "false");
t.NextToken();
@@ -168,7 +168,7 @@ namespace VAR.ExpressionEvaluator.Tests
t.NextToken();
// "false"
Assert.AreEqual(t.Token, Token.Keyword);
Assert.AreEqual(t.Token, Token.Identifier);
Assert.AreEqual(t.Text, "false");
t.NextToken();