From 34676975520cd05584dc19f2d59bb29642c6fc05 Mon Sep 17 00:00:00 2001 From: "Valeriano A.R" Date: Sun, 1 Dec 2019 02:03:47 +0100 Subject: [PATCH] IExpressionNode basic implementations. --- .../ExpressionBinaryNodeTests.cs | 64 +++++++++++++++++++ .../ExpressionNumberNodeTests.cs | 29 +++++++++ .../ExpressionStringNodeTests.cs | 30 +++++++++ .../VAR.ExpressionEvaluator.Tests.csproj | 3 + .../ExpressionBinaryNode.cs | 27 ++++++++ .../ExpressionNumberNode.cs | 17 +++++ .../ExpressionStringNode.cs | 17 +++++ VAR.ExpressionEvaluator/IExpressionNode.cs | 7 ++ .../VAR.ExpressionEvaluator.csproj | 4 ++ 9 files changed, 198 insertions(+) create mode 100644 VAR.ExpressionEvaluator.Tests/ExpressionBinaryNodeTests.cs create mode 100644 VAR.ExpressionEvaluator.Tests/ExpressionNumberNodeTests.cs create mode 100644 VAR.ExpressionEvaluator.Tests/ExpressionStringNodeTests.cs create mode 100644 VAR.ExpressionEvaluator/ExpressionBinaryNode.cs create mode 100644 VAR.ExpressionEvaluator/ExpressionNumberNode.cs create mode 100644 VAR.ExpressionEvaluator/ExpressionStringNode.cs create mode 100644 VAR.ExpressionEvaluator/IExpressionNode.cs diff --git a/VAR.ExpressionEvaluator.Tests/ExpressionBinaryNodeTests.cs b/VAR.ExpressionEvaluator.Tests/ExpressionBinaryNodeTests.cs new file mode 100644 index 0000000..b6f259e --- /dev/null +++ b/VAR.ExpressionEvaluator.Tests/ExpressionBinaryNodeTests.cs @@ -0,0 +1,64 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace VAR.ExpressionEvaluator.Tests +{ + [TestClass()] + public class ExpressionBinaryNodeTests + { + [TestMethod()] + public void ExpressionBinaryNode__Plus() + { + var expr = new ExpressionBinaryNode( + leftNode: new ExpressionNumberNode(10), + rightNode: new ExpressionNumberNode(20), + operation: (a, b) => (decimal)a + (decimal)b + ); + + var result = expr.Eval(); + + Assert.AreEqual(30m, result); + } + + [TestMethod()] + public void ExpressionBinaryNode__Minus() + { + var expr = new ExpressionBinaryNode( + leftNode: new ExpressionNumberNode(10), + rightNode: new ExpressionNumberNode(20), + operation: (a, b) => (decimal)a - (decimal)b + ); + + var result = expr.Eval(); + + Assert.AreEqual(-10m, result); + } + + [TestMethod()] + public void ExpressionBinaryNode__Multiply() + { + var expr = new ExpressionBinaryNode( + leftNode: new ExpressionNumberNode(10), + rightNode: new ExpressionNumberNode(20), + operation: (a, b) => (decimal)a * (decimal)b + ); + + var result = expr.Eval(); + + Assert.AreEqual(200m, result); + } + + [TestMethod()] + public void ExpressionBinaryNode__Division() + { + var expr = new ExpressionBinaryNode( + leftNode: new ExpressionNumberNode(10), + rightNode: new ExpressionNumberNode(5), + operation: (a, b) => (decimal)a / (decimal)b + ); + + var result = expr.Eval(); + + Assert.AreEqual(2m, result); + } + } +} \ No newline at end of file diff --git a/VAR.ExpressionEvaluator.Tests/ExpressionNumberNodeTests.cs b/VAR.ExpressionEvaluator.Tests/ExpressionNumberNodeTests.cs new file mode 100644 index 0000000..930a740 --- /dev/null +++ b/VAR.ExpressionEvaluator.Tests/ExpressionNumberNodeTests.cs @@ -0,0 +1,29 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace VAR.ExpressionEvaluator.Tests +{ + [TestClass()] + public class ExpressionNumberNodeTests + { + [TestMethod()] + public void ExpressionNumberNode__One() + { + IExpressionNode node = new ExpressionNumberNode(1); + Assert.AreEqual(1m, node.Eval()); + } + + [TestMethod()] + public void ExpressionNumberNode__Two() + { + IExpressionNode node = new ExpressionNumberNode(2); + Assert.AreEqual(2m, node.Eval()); + } + + [TestMethod()] + public void ExpressionNumberNode__OneHundredDotFortyFive() + { + IExpressionNode node = new ExpressionNumberNode(100.45m); + Assert.AreEqual(100.45m, node.Eval()); + } + } +} \ No newline at end of file diff --git a/VAR.ExpressionEvaluator.Tests/ExpressionStringNodeTests.cs b/VAR.ExpressionEvaluator.Tests/ExpressionStringNodeTests.cs new file mode 100644 index 0000000..fc2c5e2 --- /dev/null +++ b/VAR.ExpressionEvaluator.Tests/ExpressionStringNodeTests.cs @@ -0,0 +1,30 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace VAR.ExpressionEvaluator.Tests +{ + [TestClass()] + public class ExpressionStringNodeTests + { + [TestMethod()] + public void ExpressionNumberNode__Hello() + { + IExpressionNode node = new ExpressionStringNode("Hello"); + Assert.AreEqual("Hello", node.Eval()); + } + + [TestMethod()] + public void ExpressionNumberNode__World() + { + IExpressionNode node = new ExpressionStringNode("World"); + Assert.AreEqual("World", node.Eval()); + } + + [TestMethod()] + public void ExpressionNumberNode__Hello_World() + { + IExpressionNode node = new ExpressionStringNode("Hello World"); + Assert.AreEqual("Hello World", node.Eval()); + } + + } +} \ No newline at end of file diff --git a/VAR.ExpressionEvaluator.Tests/VAR.ExpressionEvaluator.Tests.csproj b/VAR.ExpressionEvaluator.Tests/VAR.ExpressionEvaluator.Tests.csproj index 2954f8f..b0f1dfe 100644 --- a/VAR.ExpressionEvaluator.Tests/VAR.ExpressionEvaluator.Tests.csproj +++ b/VAR.ExpressionEvaluator.Tests/VAR.ExpressionEvaluator.Tests.csproj @@ -51,6 +51,9 @@ + + + diff --git a/VAR.ExpressionEvaluator/ExpressionBinaryNode.cs b/VAR.ExpressionEvaluator/ExpressionBinaryNode.cs new file mode 100644 index 0000000..e6fd432 --- /dev/null +++ b/VAR.ExpressionEvaluator/ExpressionBinaryNode.cs @@ -0,0 +1,27 @@ +using System; + +namespace VAR.ExpressionEvaluator +{ + public class ExpressionBinaryNode : IExpressionNode + { + private IExpressionNode _leftNode; + private IExpressionNode _rightNode; + private readonly Func _operation; + + public ExpressionBinaryNode(IExpressionNode leftNode, IExpressionNode rightNode, Func operation) + { + _leftNode = leftNode; + _rightNode = rightNode; + _operation = operation; + } + + public object Eval() + { + object leftValue = _leftNode.Eval(); + object rightValue = _rightNode.Eval(); + + object result = _operation(leftValue, rightValue); + return result; + } + } +} diff --git a/VAR.ExpressionEvaluator/ExpressionNumberNode.cs b/VAR.ExpressionEvaluator/ExpressionNumberNode.cs new file mode 100644 index 0000000..804f4e3 --- /dev/null +++ b/VAR.ExpressionEvaluator/ExpressionNumberNode.cs @@ -0,0 +1,17 @@ +namespace VAR.ExpressionEvaluator +{ + public class ExpressionNumberNode : IExpressionNode + { + private readonly decimal _number; + + public ExpressionNumberNode(decimal number) + { + _number = number; + } + + public object Eval() + { + return _number; + } + } +} diff --git a/VAR.ExpressionEvaluator/ExpressionStringNode.cs b/VAR.ExpressionEvaluator/ExpressionStringNode.cs new file mode 100644 index 0000000..6553c6e --- /dev/null +++ b/VAR.ExpressionEvaluator/ExpressionStringNode.cs @@ -0,0 +1,17 @@ +namespace VAR.ExpressionEvaluator +{ + public class ExpressionStringNode : IExpressionNode + { + private readonly string _string; + + public ExpressionStringNode(string str) + { + _string = str; + } + + public object Eval() + { + return _string; + } + } +} diff --git a/VAR.ExpressionEvaluator/IExpressionNode.cs b/VAR.ExpressionEvaluator/IExpressionNode.cs new file mode 100644 index 0000000..6b30ac4 --- /dev/null +++ b/VAR.ExpressionEvaluator/IExpressionNode.cs @@ -0,0 +1,7 @@ +namespace VAR.ExpressionEvaluator +{ + public interface IExpressionNode + { + object Eval(); + } +} diff --git a/VAR.ExpressionEvaluator/VAR.ExpressionEvaluator.csproj b/VAR.ExpressionEvaluator/VAR.ExpressionEvaluator.csproj index 6d97afc..49d1738 100644 --- a/VAR.ExpressionEvaluator/VAR.ExpressionEvaluator.csproj +++ b/VAR.ExpressionEvaluator/VAR.ExpressionEvaluator.csproj @@ -41,6 +41,10 @@ + + + +