From 073b4b4546de50bd2728d20a61f4f21a3ecd50f5 Mon Sep 17 00:00:00 2001 From: Shaun Lawrence Date: Tue, 7 Jul 2020 22:36:58 +0100 Subject: [PATCH 1/2] Comparisons now correctly handle nulls and are consistent with .NET. Added NUnit dependency to simplify test case writing. --- .../Expressive.Tests/ExpressionTests.cs | 21 --- .../Binary/Relational/EqualExpressionTests.cs | 96 +++---------- .../Relational/GreaterThanExpressionTests.cs | 117 ++++------------ .../GreaterThanOrEqualExpressionTests.cs | 126 ++++------------- .../Relational/LessThanExpressionTests.cs | 116 ++++------------ .../LessThanOrEqualExpressionTests.cs | 127 ++++-------------- .../Relational/NotEqualExpressionTests.cs | 96 +++---------- .../Expressive.Tests/Expressive.Tests.csproj | 11 +- .../Relational/GreaterThanExpression.cs | 18 +-- .../GreaterThanOrEqualExpression.cs | 18 +-- .../Binary/Relational/LessThanExpression.cs | 18 +-- .../Relational/LessThanOrEqualExpression.cs | 18 +-- 12 files changed, 166 insertions(+), 616 deletions(-) diff --git a/Source/CSharp/Expressive/Expressive.Tests/ExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/ExpressionTests.cs index 8d4bcba..1df084c 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/ExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/ExpressionTests.cs @@ -163,27 +163,6 @@ public void RelationalTests() // Dates can be parsed to string. Assert.AreEqual(true, new Expression("[date1] == '2016-01-01'").Evaluate(new Dictionary { ["date1"] = new DateTime(2016, 01, 01) })); Assert.AreEqual(true, new Expression("[date1] == '01/01/2016 00:00:00'").Evaluate(new Dictionary { ["date1"] = new DateTime(2016, 01, 01) })); - - // Null safety - Assert.AreEqual(true, new Expression("[number1] == null").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(false, new Expression("[number1] == null").Evaluate(new Dictionary { ["number1"] = 2 })); - Assert.AreEqual(false, new Expression("[number1] != null").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(true, new Expression("[number1] != null").Evaluate(new Dictionary { ["number1"] = 2 })); - Assert.AreEqual(true, new Expression("[number1] <> 2").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(null, new Expression("[number1] >= 2").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(null, new Expression("[number1] > 2").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(null, new Expression("[number1] <= 2").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(null, new Expression("[number1] < 2").Evaluate(new Dictionary { ["number1"] = null })); - - Assert.AreEqual(true, new Expression("null == [number1]").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(false, new Expression("null == [number1]").Evaluate(new Dictionary { ["number1"] = 2 })); - Assert.AreEqual(false, new Expression("null != [number1]").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(true, new Expression("null != [number1]").Evaluate(new Dictionary { ["number1"] = 2 })); - Assert.AreEqual(true, new Expression("2 <> [number1]").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(null, new Expression("2 >= [number1]").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(null, new Expression("2 > [number1]").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(null, new Expression("2 <= [number1]").Evaluate(new Dictionary { ["number1"] = null })); - Assert.AreEqual(null, new Expression("2 < [number1]").Evaluate(new Dictionary { ["number1"] = null })); } [TestMethod] diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/EqualExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/EqualExpressionTests.cs index b1c3590..fea24b2 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/EqualExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/EqualExpressionTests.cs @@ -1,89 +1,37 @@ using System.Collections.Generic; using Expressive.Expressions; using Expressive.Expressions.Binary.Relational; -using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using NUnit.Framework; namespace Expressive.Tests.Expressions.Binary.Relational { - [TestClass] - public class EqualExpressionTests + public static class EqualExpressionTests { - [TestMethod] - public void TestBothNull() + [TestCase(null, null, true)] + [TestCase(5, 5, true)] + [TestCase(5, 2, false)] + [TestCase(2, 5, false)] + [TestCase(null, "abc", false)] + [TestCase("abc", null, false)] + [TestCase("abc", "abc", true)] + [TestCase(null, false, false)] + [TestCase(false, null, false)] + [TestCase(true, false, false)] + [TestCase(true, true, true)] + [TestCase(false, false, true)] + [TestCase(false, true, false)] + [TestCase(1.001, 1, false)] + [TestCase(1, 1.001, false)] + [TestCase(1.001, 1.001, true)] + public static void TestEvaluate(object lhs, object rhs, object expectedValue) { var expression = new EqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), + Mock.Of(e => e.Evaluate(It.IsAny>()) == lhs), + Mock.Of(e => e.Evaluate(It.IsAny>()) == rhs), new Context(ExpressiveOptions.None)); - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestEqual() - { - var expression = new EqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLeftNull() - { - var expression = new EqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)"abc"), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestNotEqual() - { - var expression = new EqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestRightNull() - { - var expression = new EqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)false), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatUnequal() - { - var expression = new EqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatEqual() - { - var expression = new EqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.00), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); + Assert.That(expression.Evaluate(null), Is.EqualTo(expectedValue)); } } } diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanExpressionTests.cs index edbb37b..f1795ac 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanExpressionTests.cs @@ -1,102 +1,37 @@ using System.Collections.Generic; using Expressive.Expressions; using Expressive.Expressions.Binary.Relational; -using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using NUnit.Framework; namespace Expressive.Tests.Expressions.Binary.Relational { - [TestClass] - public class GreaterThanExpressionTests + public static class GreaterThanExpressionTests { - [TestMethod] - public void TestBothNull() - { - var expression = new GreaterThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestEqual() - { - var expression = new GreaterThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestGreaterThan() - { - var expression = new GreaterThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLeftNull() - { - var expression = new GreaterThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)"abc"), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLessThan() - { - var expression = new GreaterThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestRightNull() - { - var expression = new GreaterThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)false), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatTrue() - { - var expression = new GreaterThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatFalse() - { - var expression = new GreaterThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); + [TestCase(null, null, false)] + [TestCase(5, 5, false)] + [TestCase(5, 2, true)] + [TestCase(2, 5, false)] + [TestCase(null, "abc", false)] + [TestCase("abc", null, true)] + [TestCase("abc", "abc", false)] + [TestCase(null, false, false)] + [TestCase(false, null, true)] + [TestCase(true, false, true)] + [TestCase(true, true, false)] + [TestCase(false, false, false)] + [TestCase(false, true, false)] + [TestCase(1.001, 1, true)] + [TestCase(1, 1.001, false)] + [TestCase(1.001, 1.001, false)] + public static void TestEvaluate(object lhs, object rhs, object expectedValue) + { + var expression = new GreaterThanExpression( + Mock.Of(e => e.Evaluate(It.IsAny>()) == lhs), + Mock.Of(e => e.Evaluate(It.IsAny>()) == rhs), + new Context(ExpressiveOptions.None)); + + Assert.That(expression.Evaluate(null), Is.EqualTo(expectedValue)); } - - } } diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanOrEqualExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanOrEqualExpressionTests.cs index 93924a2..875959e 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanOrEqualExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanOrEqualExpressionTests.cs @@ -1,111 +1,37 @@ using System.Collections.Generic; using Expressive.Expressions; using Expressive.Expressions.Binary.Relational; -using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using NUnit.Framework; namespace Expressive.Tests.Expressions.Binary.Relational { - [TestClass] - public class GreaterThanOrEqualExpressionTests + public static class GreaterThanOrEqualExpressionTests { - [TestMethod] - public void TestBothNull() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestEqual() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestGreaterThan() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLeftNull() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)"abc"), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLessThan() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestRightNull() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)false), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatEqual() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.0), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatTrue() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatFalse() - { - var expression = new GreaterThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); + [TestCase(null, null, true)] + [TestCase(5, 5, true)] + [TestCase(5, 2, true)] + [TestCase(2, 5, false)] + [TestCase(null, "abc", false)] + [TestCase("abc", null, true)] + [TestCase("abc", "abc", true)] + [TestCase(null, false, false)] + [TestCase(false, null, true)] + [TestCase(true, false, true)] + [TestCase(true, true, true)] + [TestCase(false, false, true)] + [TestCase(false, true, false)] + [TestCase(1.001, 1, true)] + [TestCase(1, 1.001, false)] + [TestCase(1.001, 1.001, true)] + public static void TestEvaluate(object lhs, object rhs, object expectedValue) + { + var expression = new GreaterThanOrEqualExpression( + Mock.Of(e => e.Evaluate(It.IsAny>()) == lhs), + Mock.Of(e => e.Evaluate(It.IsAny>()) == rhs), + new Context(ExpressiveOptions.None)); + + Assert.That(expression.Evaluate(null), Is.EqualTo(expectedValue)); } } } diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanExpressionTests.cs index 09a6b19..d098156 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanExpressionTests.cs @@ -1,101 +1,37 @@ using System.Collections.Generic; using Expressive.Expressions; using Expressive.Expressions.Binary.Relational; -using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using NUnit.Framework; namespace Expressive.Tests.Expressions.Binary.Relational { - [TestClass] - public class LessThanExpressionTests + public static class LessThanExpressionTests { - [TestMethod] - public void TestBothNull() - { - var expression = new LessThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestEqual() - { - var expression = new LessThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestGreaterThan() - { - var expression = new LessThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLeftNull() - { - var expression = new LessThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)"abc"), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); + [TestCase(null, null, false)] + [TestCase(5, 5, false)] + [TestCase(5, 2, false)] + [TestCase(2, 5, true)] + [TestCase(null, "abc", true)] + [TestCase("abc", null, false)] + [TestCase("abc", "abc", false)] + [TestCase(null, false, true)] + [TestCase(false, null, false)] + [TestCase(true, false, false)] + [TestCase(true, true, false)] + [TestCase(false, false, false)] + [TestCase(false, true, true)] + [TestCase(1.001, 1, false)] + [TestCase(1, 1.001, true)] + [TestCase(1.001, 1.001, false)] + public static void TestEvaluate(object lhs, object rhs, object expectedValue) + { + var expression = new LessThanExpression( + Mock.Of(e => e.Evaluate(It.IsAny>()) == lhs), + Mock.Of(e => e.Evaluate(It.IsAny>()) == rhs), + new Context(ExpressiveOptions.None)); + + Assert.That(expression.Evaluate(null), Is.EqualTo(expectedValue)); } - - [TestMethod] - public void TestLessThan() - { - var expression = new LessThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestRightNull() - { - var expression = new LessThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)false), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatTrue() - { - var expression = new LessThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatFalse() - { - var expression = new LessThanExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - } } diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanOrEqualExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanOrEqualExpressionTests.cs index bca9cb2..311e0ed 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanOrEqualExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanOrEqualExpressionTests.cs @@ -1,112 +1,37 @@ using System.Collections.Generic; using Expressive.Expressions; using Expressive.Expressions.Binary.Relational; -using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using NUnit.Framework; namespace Expressive.Tests.Expressions.Binary.Relational { - [TestClass] - public class LessThanOrEqualExpressionTests + public static class LessThanOrEqualExpressionTests { - [TestMethod] - public void TestBothNull() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestEqual() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); + [TestCase(null, null, true)] + [TestCase(5, 5, true)] + [TestCase(5, 2, false)] + [TestCase(2, 5, true)] + [TestCase(null, "abc", true)] + [TestCase("abc", null, false)] + [TestCase("abc", "abc", true)] + [TestCase(null, false, true)] + [TestCase(false, null, false)] + [TestCase(true, false, false)] + [TestCase(true, true, true)] + [TestCase(false, false, true)] + [TestCase(false, true, true)] + [TestCase(1.001, 1, false)] + [TestCase(1, 1.001, true)] + [TestCase(1.001, 1.001, true)] + public static void TestEvaluate(object lhs, object rhs, object expectedValue) + { + var expression = new LessThanOrEqualExpression( + Mock.Of(e => e.Evaluate(It.IsAny>()) == lhs), + Mock.Of(e => e.Evaluate(It.IsAny>()) == rhs), + new Context(ExpressiveOptions.None)); + + Assert.That(expression.Evaluate(null), Is.EqualTo(expectedValue)); } - - [TestMethod] - public void TestGreaterThan() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLeftNull() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)"abc"), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLessThan() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestRightNull() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)false), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(null, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatEqual() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.0), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatTrue() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatFalse() - { - var expression = new LessThanOrEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - } } diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/NotEqualExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/NotEqualExpressionTests.cs index 56d5a9c..a8b0d64 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/NotEqualExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/NotEqualExpressionTests.cs @@ -1,89 +1,37 @@ using System.Collections.Generic; using Expressive.Expressions; using Expressive.Expressions.Binary.Relational; -using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using NUnit.Framework; namespace Expressive.Tests.Expressions.Binary.Relational { - [TestClass] - public class NotEqualExpressionTests + public static class NotEqualExpressionTests { - [TestMethod] - public void TestBothNull() + [TestCase(null, null, false)] + [TestCase(5, 5, false)] + [TestCase(5, 2, true)] + [TestCase(2, 5, true)] + [TestCase(null, "abc", true)] + [TestCase("abc", null, true)] + [TestCase("abc", "abc", false)] + [TestCase(null, false, true)] + [TestCase(false, null, true)] + [TestCase(true, false, true)] + [TestCase(true, true, false)] + [TestCase(false, false, false)] + [TestCase(false, true, true)] + [TestCase(1.001, 1, true)] + [TestCase(1, 1.001, true)] + [TestCase(1.001, 1.001, false)] + public static void TestEvaluate(object lhs, object rhs, object expectedValue) { var expression = new NotEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), + Mock.Of(e => e.Evaluate(It.IsAny>()) == lhs), + Mock.Of(e => e.Evaluate(It.IsAny>()) == rhs), new Context(ExpressiveOptions.None)); - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestEqual() - { - var expression = new NotEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestLeftNull() - { - var expression = new NotEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)"abc"), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestNotEqual() - { - var expression = new NotEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)5), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)2), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestRightNull() - { - var expression = new NotEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)false), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)null), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatEqual() - { - var expression = new NotEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.0), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(false, expression.Evaluate(null)); - } - - [TestMethod] - public void TestIntFloatNotEqual() - { - var expression = new NotEqualExpression( - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1.001), - Mock.Of(e => e.Evaluate(It.IsAny>()) == (object)1), - new Context(ExpressiveOptions.None)); - - Assert.AreEqual(true, expression.Evaluate(null)); + Assert.That(expression.Evaluate(null), Is.EqualTo(expectedValue)); } } } diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressive.Tests.csproj b/Source/CSharp/Expressive/Expressive.Tests/Expressive.Tests.csproj index a163b14..2dc99dc 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressive.Tests.csproj +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressive.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0;netcoreapp2.1;netcoreapp2.2;netcoreapp3.0;net45 + netcoreapp2.1;netcoreapp2.2;netcoreapp3.0;net45 false @@ -17,6 +17,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -25,6 +29,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/GreaterThanExpression.cs b/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/GreaterThanExpression.cs index 56aa218..d01b7fb 100644 --- a/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/GreaterThanExpression.cs +++ b/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/GreaterThanExpression.cs @@ -15,22 +15,8 @@ public GreaterThanExpression(IExpression lhs, IExpression rhs, Context context) #region BinaryExpressionBase Members - protected override object EvaluateImpl(object lhsResult, IExpression rightHandSide, IDictionary variables) - { - // Use the type of the left operand to make the comparison - if (lhsResult is null) - { - return null; - } - - var rhsResult = rightHandSide.Evaluate(variables); - if (rhsResult is null) - { - return null; - } - - return Comparison.CompareUsingMostPreciseType(lhsResult, rhsResult, this.context) > 0; - } + protected override object EvaluateImpl(object lhsResult, IExpression rightHandSide, IDictionary variables) => + Comparison.CompareUsingMostPreciseType(lhsResult, rightHandSide.Evaluate(variables), this.context) > 0; #endregion } diff --git a/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/GreaterThanOrEqualExpression.cs b/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/GreaterThanOrEqualExpression.cs index d5bed62..1129ce8 100644 --- a/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/GreaterThanOrEqualExpression.cs +++ b/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/GreaterThanOrEqualExpression.cs @@ -15,22 +15,8 @@ public GreaterThanOrEqualExpression(IExpression lhs, IExpression rhs, Context co #region BinaryExpressionBase Members - protected override object EvaluateImpl(object lhsResult, IExpression rightHandSide, IDictionary variables) - { - // Use the type of the left operand to make the comparison - if (lhsResult is null) - { - return null; - } - - var rhsResult = rightHandSide.Evaluate(variables); - if (rhsResult is null) - { - return null; - } - - return Comparison.CompareUsingMostPreciseType(lhsResult, rhsResult, this.context) >= 0; - } + protected override object EvaluateImpl(object lhsResult, IExpression rightHandSide, IDictionary variables) => + Comparison.CompareUsingMostPreciseType(lhsResult, rightHandSide.Evaluate(variables), this.context) >= 0; #endregion } diff --git a/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/LessThanExpression.cs b/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/LessThanExpression.cs index 12818d4..e855ce5 100644 --- a/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/LessThanExpression.cs +++ b/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/LessThanExpression.cs @@ -15,22 +15,8 @@ public LessThanExpression(IExpression lhs, IExpression rhs, Context context) : b #region BinaryExpressionBase Members - protected override object EvaluateImpl(object lhsResult, IExpression rightHandSide, IDictionary variables) - { - // Use the type of the left operand to make the comparison - if (lhsResult is null) - { - return null; - } - - var rhsResult = rightHandSide.Evaluate(variables); - if (rhsResult is null) - { - return null; - } - - return Comparison.CompareUsingMostPreciseType(lhsResult, rhsResult, this.context) < 0; - } + protected override object EvaluateImpl(object lhsResult, IExpression rightHandSide, IDictionary variables) => + Comparison.CompareUsingMostPreciseType(lhsResult, rightHandSide.Evaluate(variables), this.context) < 0; #endregion } diff --git a/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/LessThanOrEqualExpression.cs b/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/LessThanOrEqualExpression.cs index a0f106c..0cf605d 100644 --- a/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/LessThanOrEqualExpression.cs +++ b/Source/CSharp/Expressive/Expressive/Expressions/Binary/Relational/LessThanOrEqualExpression.cs @@ -15,22 +15,8 @@ public LessThanOrEqualExpression(IExpression lhs, IExpression rhs, Context conte #region BinaryExpressionBase Members - protected override object EvaluateImpl(object lhsResult, IExpression rightHandSide, IDictionary variables) - { - // Use the type of the left operand to make the comparison - if (lhsResult is null) - { - return null; - } - - var rhsResult = rightHandSide.Evaluate(variables); - if (rhsResult is null) - { - return null; - } - - return Comparison.CompareUsingMostPreciseType(lhsResult, rhsResult, this.context) <= 0; - } + protected override object EvaluateImpl(object lhsResult, IExpression rightHandSide, IDictionary variables) => + Comparison.CompareUsingMostPreciseType(lhsResult, rightHandSide.Evaluate(variables), this.context) <= 0; #endregion } From b5c949f7682ff7af32913a3f75ea06ead3574c27 Mon Sep 17 00:00:00 2001 From: Shaun Lawrence Date: Tue, 14 Jul 2020 23:00:10 +0100 Subject: [PATCH 2/2] Added additional test cases to handle equal int to float --- .../Expressions/Binary/Relational/EqualExpressionTests.cs | 2 ++ .../Expressions/Binary/Relational/GreaterThanExpressionTests.cs | 2 ++ .../Binary/Relational/GreaterThanOrEqualExpressionTests.cs | 2 ++ .../Expressions/Binary/Relational/LessThanExpressionTests.cs | 2 ++ .../Binary/Relational/LessThanOrEqualExpressionTests.cs | 2 ++ .../Expressions/Binary/Relational/NotEqualExpressionTests.cs | 2 ++ 6 files changed, 12 insertions(+) diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/EqualExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/EqualExpressionTests.cs index fea24b2..cd43dbb 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/EqualExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/EqualExpressionTests.cs @@ -24,6 +24,8 @@ public static class EqualExpressionTests [TestCase(1.001, 1, false)] [TestCase(1, 1.001, false)] [TestCase(1.001, 1.001, true)] + [TestCase(1, 1.00, true)] + [TestCase(1.00, 1, true)] public static void TestEvaluate(object lhs, object rhs, object expectedValue) { var expression = new EqualExpression( diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanExpressionTests.cs index f1795ac..5805284 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanExpressionTests.cs @@ -24,6 +24,8 @@ public static class GreaterThanExpressionTests [TestCase(1.001, 1, true)] [TestCase(1, 1.001, false)] [TestCase(1.001, 1.001, false)] + [TestCase(1, 1.00, false)] + [TestCase(1.00, 1, false)] public static void TestEvaluate(object lhs, object rhs, object expectedValue) { var expression = new GreaterThanExpression( diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanOrEqualExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanOrEqualExpressionTests.cs index 875959e..0bfaaf3 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanOrEqualExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/GreaterThanOrEqualExpressionTests.cs @@ -24,6 +24,8 @@ public static class GreaterThanOrEqualExpressionTests [TestCase(1.001, 1, true)] [TestCase(1, 1.001, false)] [TestCase(1.001, 1.001, true)] + [TestCase(1, 1.00, true)] + [TestCase(1.00, 1, true)] public static void TestEvaluate(object lhs, object rhs, object expectedValue) { var expression = new GreaterThanOrEqualExpression( diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanExpressionTests.cs index d098156..dbf874f 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanExpressionTests.cs @@ -24,6 +24,8 @@ public static class LessThanExpressionTests [TestCase(1.001, 1, false)] [TestCase(1, 1.001, true)] [TestCase(1.001, 1.001, false)] + [TestCase(1, 1.00, false)] + [TestCase(1.00, 1, false)] public static void TestEvaluate(object lhs, object rhs, object expectedValue) { var expression = new LessThanExpression( diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanOrEqualExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanOrEqualExpressionTests.cs index 311e0ed..7a73ce7 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanOrEqualExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/LessThanOrEqualExpressionTests.cs @@ -24,6 +24,8 @@ public static class LessThanOrEqualExpressionTests [TestCase(1.001, 1, false)] [TestCase(1, 1.001, true)] [TestCase(1.001, 1.001, true)] + [TestCase(1, 1.00, true)] + [TestCase(1.00, 1, true)] public static void TestEvaluate(object lhs, object rhs, object expectedValue) { var expression = new LessThanOrEqualExpression( diff --git a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/NotEqualExpressionTests.cs b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/NotEqualExpressionTests.cs index a8b0d64..811b5d8 100644 --- a/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/NotEqualExpressionTests.cs +++ b/Source/CSharp/Expressive/Expressive.Tests/Expressions/Binary/Relational/NotEqualExpressionTests.cs @@ -24,6 +24,8 @@ public static class NotEqualExpressionTests [TestCase(1.001, 1, true)] [TestCase(1, 1.001, true)] [TestCase(1.001, 1.001, false)] + [TestCase(1, 1.00, false)] + [TestCase(1.00, 1, false)] public static void TestEvaluate(object lhs, object rhs, object expectedValue) { var expression = new NotEqualExpression(