From 219250eaef4beedaedcb2f0e865ffd4aefe5d435 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 15 May 2025 12:38:55 +0200 Subject: [PATCH 1/2] Add extra unittests for NullPropagation / ToString / AllowEqualsAndToStringMethodsOnObject is true --- .../Parser/ExpressionHelper.cs | 2 +- .../Parser/ExpressionParserTests.cs | 3 +- .../QueryableTests.Where.cs | 52 +++++++++++++++++++ 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/System.Linq.Dynamic.Core/Parser/ExpressionHelper.cs b/src/System.Linq.Dynamic.Core/Parser/ExpressionHelper.cs index cc1ef839..05b26969 100644 --- a/src/System.Linq.Dynamic.Core/Parser/ExpressionHelper.cs +++ b/src/System.Linq.Dynamic.Core/Parser/ExpressionHelper.cs @@ -328,7 +328,7 @@ public bool TryGenerateAndAlsoNotNullExpression(Expression sourceExpression, boo { var expressions = CollectExpressions(addSelf, sourceExpression); - if (expressions.Count == 1 && !(expressions[0] is MethodCallExpression)) + if (expressions.Count == 1 && expressions[0] is not MethodCallExpression) { generatedExpression = sourceExpression; return false; diff --git a/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs b/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs index 7c8d7e43..f6696720 100644 --- a/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs @@ -390,8 +390,7 @@ public void Parse_When_PrioritizePropertyOrFieldOverTheType_IsTrue(string expres CustomTypeProvider = _dynamicTypeProviderMock.Object, AllowEqualsAndToStringMethodsOnObject = true }; - ParameterExpression[] parameters = [ParameterExpressionHelper.CreateParameterExpression(typeof(Company), "company") - ]; + ParameterExpression[] parameters = [ ParameterExpressionHelper.CreateParameterExpression(typeof(Company), "company") ]; var sut = new ExpressionParser(parameters, expression, null, config); // Act diff --git a/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs b/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs index 1622a54e..0596318a 100644 --- a/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs +++ b/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs @@ -389,6 +389,58 @@ public void Where_Dynamic_CompareObjectToInt_ConvertObjectToSupportComparisonIsF act.Should().Throw().And.Message.Should().MatchRegex("The binary operator .* is not defined for the types"); } + [Fact] + public void Where_Dynamic_NullPropagation_Test1_On_NullableDoubleToString_When_AllowEqualsAndToStringMethodsOnObject_True() + { + // Arrange + var config = new ParsingConfig + { + AllowEqualsAndToStringMethodsOnObject = true + }; + var queryable = new[] + { + new { id = "1", d = (double?) null }, + new { id = "2", d = (double?) 5 }, + new { id = "3", d = (double?) 50 }, + new { id = "4", d = (double?) 40 } + }.AsQueryable(); + + // Act + var result = queryable + .Where(config, """np(it.d, 0).ToString().StartsWith("5", StringComparison.OrdinalIgnoreCase)""") + .Select("d") + .ToArray(); + + // Assert + result.Should().ContainInConsecutiveOrder(5, 50); + } + + [Fact] + public void Where_Dynamic_NullPropagation_Test2_On_NullableDoubleToString_When_AllowEqualsAndToStringMethodsOnObject_True() + { + // Arrange + var config = new ParsingConfig + { + AllowEqualsAndToStringMethodsOnObject = true + }; + var queryable = new[] + { + new { id = "1", d = (double?) null }, + new { id = "2", d = (double?) 5 }, + new { id = "3", d = (double?) 50 }, + new { id = "4", d = (double?) 40 } + }.AsQueryable(); + + // Act + var result = queryable + .Where(config, """np(it.d.ToString(), "").StartsWith("5", StringComparison.OrdinalIgnoreCase)""") + .Select("d") + .ToArray(); + + // Assert + result.Should().ContainInConsecutiveOrder(5, 50); + } + [ExcludeFromCodeCoverage] private class PersonWithObject { From f9a8029bb963a603b04c2415e7e484e4b71aff83 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 15 May 2025 12:44:01 +0200 Subject: [PATCH 2/2] ContainInOrder --- test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs b/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs index 0596318a..8c3b84d2 100644 --- a/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs +++ b/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs @@ -412,7 +412,7 @@ public void Where_Dynamic_NullPropagation_Test1_On_NullableDoubleToString_When_A .ToArray(); // Assert - result.Should().ContainInConsecutiveOrder(5, 50); + result.Should().ContainInOrder(5, 50); } [Fact] @@ -438,7 +438,7 @@ public void Where_Dynamic_NullPropagation_Test2_On_NullableDoubleToString_When_A .ToArray(); // Assert - result.Should().ContainInConsecutiveOrder(5, 50); + result.Should().ContainInOrder(5, 50); } [ExcludeFromCodeCoverage]