Skip to content

Commit 8224f13

Browse files
authored
Add more unittests for issue 645 (#646)
1 parent e470f24 commit 8224f13

File tree

4 files changed

+88
-12
lines changed

4 files changed

+88
-12
lines changed

src/System.Linq.Dynamic.Core/Parser/ConstantExpressionWrapper.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ private static MemberExpression WrappedConstant<TValue>(TValue value)
193193
{
194194
var wrapper = new WrappedValue<TValue>(value);
195195

196-
return Expression.Property(Expression.Constant(wrapper), typeof(WrappedValue<TValue>).GetProperty("Value"));
196+
return Expression.Property(Expression.Constant(wrapper), typeof(WrappedValue<TValue>).GetProperty("Value")!);
197197
}
198198
}
199-
}
199+
}

src/System.Linq.Dynamic.Core/Parser/TypeHelper.cs

+3
Original file line numberDiff line numberDiff line change
@@ -186,17 +186,20 @@ public static bool IsCompatibleWith(Type source, Type target)
186186
{
187187
return true;
188188
}
189+
189190
if (!target.GetTypeInfo().IsValueType)
190191
{
191192
return target.IsAssignableFrom(source);
192193
}
194+
193195
Type st = GetNonNullableType(source);
194196
Type tt = GetNonNullableType(target);
195197

196198
if (st != source && tt == target)
197199
{
198200
return false;
199201
}
202+
200203
Type sc = st.GetTypeInfo().IsEnum ? typeof(object) : st;
201204
Type tc = tt.GetTypeInfo().IsEnum ? typeof(object) : tt;
202205

test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs

+76-9
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ public Type ResolveTypeBySimpleName(string typeName)
279279
}
280280

281281
[Fact]
282-
public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_false()
282+
public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_false_String()
283283
{
284284
// Assign
285285
var config = new ParsingConfig
@@ -291,14 +291,33 @@ public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQu
291291
var expression = DynamicExpressionParser.ParseLambda<string, bool>(config, true, "s => s == \"x\"");
292292

293293
// Assert
294-
dynamic constantExpression = (ConstantExpression)(expression.Body as BinaryExpression).Right;
295-
string value = constantExpression.Value;
294+
ConstantExpression constantExpression = (ConstantExpression)((BinaryExpression)expression.Body).Right;
295+
object value = constantExpression.Value;
296296

297297
Check.That(value).IsEqualTo("x");
298298
}
299299

300300
[Fact]
301-
public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true()
301+
public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_false_DateTime()
302+
{
303+
// Assign
304+
var config = new ParsingConfig
305+
{
306+
UseParameterizedNamesInDynamicQuery = false
307+
};
308+
309+
// Act
310+
var expression = DynamicExpressionParser.ParseLambda<Person, bool>(config, true, "D == \"2022-03-02\"");
311+
312+
// Assert
313+
ConstantExpression constantExpression = (ConstantExpression)((BinaryExpression)expression.Body).Right;
314+
object value = constantExpression.Value;
315+
316+
Check.That(value).IsEqualTo(new DateTime(2022, 3, 2));
317+
}
318+
319+
[Fact]
320+
public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true_Int()
302321
{
303322
// Assign
304323
var config = new ParsingConfig
@@ -311,17 +330,42 @@ public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQu
311330
var expressionAsString = expression.ToString();
312331

313332
// Assert
314-
Check.That(expressionAsString).IsEqualTo("Param_0 => (Param_0.Id == value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.Int32]).Value)");
333+
expressionAsString.Should().Be("Param_0 => (Param_0.Id == value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.Int32]).Value)");
315334

316-
dynamic constantExpression = ((MemberExpression)(expression.Body as BinaryExpression).Right).Expression as ConstantExpression;
317-
var wrappedObj = constantExpression.Value;
335+
ConstantExpression constantExpression = (ConstantExpression)((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;
336+
var wrappedObj = constantExpression!.Value;
318337

319-
var propertyInfo = wrappedObj.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
320-
var value = (int)propertyInfo.GetValue(wrappedObj);
338+
PropertyInfo propertyInfo = wrappedObj!.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
339+
object value = propertyInfo!.GetValue(wrappedObj);
321340

322341
Check.That(value).IsEqualTo(42);
323342
}
324343

344+
[Fact(Skip = "Issue 645")]
345+
public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true_DateTime()
346+
{
347+
// Assign
348+
var config = new ParsingConfig
349+
{
350+
UseParameterizedNamesInDynamicQuery = true
351+
};
352+
353+
// Act
354+
var expression = DynamicExpressionParser.ParseLambda<Person, bool>(config, false, "D = \"2022-11-16\"");
355+
var expressionAsString = expression.ToString();
356+
357+
// Assert
358+
expressionAsString.Should().Be("Param_0 => (Param_0.D == value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.DateTime]).Value)");
359+
360+
ConstantExpression constantExpression = (ConstantExpression)((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;
361+
var wrappedObj = constantExpression!.Value;
362+
363+
PropertyInfo propertyInfo = wrappedObj!.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
364+
object value = propertyInfo!.GetValue(wrappedObj);
365+
366+
Check.That(value).IsEqualTo(new DateTime(2022, 11, 16));
367+
}
368+
325369
[Theory]
326370
[InlineData("NullableIntValue", "42")]
327371
[InlineData("NullableDoubleValue", "42.23")]
@@ -1013,6 +1057,29 @@ public void DynamicExpressionParser_ParseLambda_With_Null_Equals_Guid()
10131057
Assert.True(result);
10141058
}
10151059

1060+
[Fact]
1061+
public void DynamicExpressionParser_ParseLambda_With_DateTime_Equals_String()
1062+
{
1063+
// Arrange
1064+
var someDateTime = "2022-03-02";
1065+
var user = new Person
1066+
{
1067+
D = new DateTime(2022, 3, 2)
1068+
};
1069+
var expressionText = $"D == \"{someDateTime}\"";
1070+
1071+
// Act
1072+
var lambda = DynamicExpressionParser.ParseLambda(typeof(Person), null, expressionText, user);
1073+
var dtLambda = lambda as Expression<Func<Person, bool>>;
1074+
Assert.NotNull(dtLambda);
1075+
1076+
var del = lambda.Compile();
1077+
var result = (bool)del.DynamicInvoke(user);
1078+
1079+
// Assert
1080+
Assert.True(result);
1081+
}
1082+
10161083
[Fact]
10171084
public void DynamicExpressionParser_ParseLambda_With_Guid_Equals_String()
10181085
{

test/System.Linq.Dynamic.Core.Tests/Helpers/Models/Person.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ namespace System.Linq.Dynamic.Core.Tests.Helpers.Models
44
public class Person
55
{
66
public int Id { get; set; }
7+
78
public int? NullableId { get; set; }
9+
810
public string Name { get; set; }
11+
12+
public DateTime D { get; set; }
13+
14+
public DateTimeOffset O { get; set; }
915
}
10-
}
16+
}

0 commit comments

Comments
 (0)