Skip to content

Commit 06d7065

Browse files
authored
Fix AddSignatures and SubtractSignatures (#739)
* Fix AddSignatures and SubtractSignatures * fix test
1 parent 06d4110 commit 06d7065

File tree

6 files changed

+177
-72
lines changed

6 files changed

+177
-72
lines changed

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -689,13 +689,13 @@ private Expression ParseShiftOperator()
689689
// +, - operators
690690
private Expression ParseAdditive()
691691
{
692-
Expression left = ParseMultiplicative();
692+
Expression left = ParseArithmetic();
693693
while (_textParser.CurrentToken.Id is TokenId.Plus or TokenId.Minus)
694694
{
695695
Token op = _textParser.CurrentToken;
696696
_textParser.NextToken();
697697

698-
Expression right = ParseMultiplicative();
698+
Expression right = ParseArithmetic();
699699
switch (op.Id)
700700
{
701701
case TokenId.Plus:
@@ -705,13 +705,13 @@ private Expression ParseAdditive()
705705
}
706706
else
707707
{
708-
CheckAndPromoteOperands(typeof(IAddAndSubtractSignatures), op.Id, op.Text, ref left, ref right, op.Pos);
708+
CheckAndPromoteOperands(typeof(IAddSignatures), op.Id, op.Text, ref left, ref right, op.Pos);
709709
left = _expressionHelper.GenerateAdd(left, right);
710710
}
711711
break;
712712

713713
case TokenId.Minus:
714-
CheckAndPromoteOperands(typeof(IAddAndSubtractSignatures), op.Id, op.Text, ref left, ref right, op.Pos);
714+
CheckAndPromoteOperands(typeof(ISubtractSignatures), op.Id, op.Text, ref left, ref right, op.Pos);
715715
left = _expressionHelper.GenerateSubtract(left, right);
716716
break;
717717
}
@@ -720,7 +720,7 @@ private Expression ParseAdditive()
720720
}
721721

722722
// *, /, %, mod operators
723-
private Expression ParseMultiplicative()
723+
private Expression ParseArithmetic()
724724
{
725725
Expression left = ParseUnary();
726726
while (_textParser.CurrentToken.Id is TokenId.Asterisk or TokenId.Slash or TokenId.Percent || TokenIdentifierIs("mod"))

src/System.Linq.Dynamic.Core/Parser/SupportedOperands/IAddAndSubtractSignatures.cs

-38
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace System.Linq.Dynamic.Core.Parser.SupportedOperands;
2+
3+
internal interface IAddSignatures : IArithmeticSignatures
4+
{
5+
void F(TimeSpan x, TimeSpan y);
6+
7+
void F(TimeSpan x, TimeSpan? y);
8+
9+
void F(TimeSpan? x, TimeSpan y);
10+
11+
void F(TimeSpan? x, TimeSpan? y);
12+
13+
void F(DateTime x, TimeSpan y);
14+
15+
void F(DateTime x, TimeSpan? y);
16+
17+
void F(DateTime? x, TimeSpan y);
18+
19+
void F(DateTime? x, TimeSpan? y);
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace System.Linq.Dynamic.Core.Parser.SupportedOperands;
2+
3+
internal interface ISubtractSignatures : IAddSignatures
4+
{
5+
void F(DateTime x, DateTime y);
6+
7+
void F(DateTime x, DateTime? y);
8+
9+
void F(DateTime? x, DateTime y);
10+
11+
void F(DateTime? x, DateTime? y);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
using FluentAssertions;
2+
using Xunit;
3+
4+
namespace System.Linq.Dynamic.Core.Tests;
5+
6+
public partial class ExpressionTests
7+
{
8+
[Fact]
9+
public void ExpressionTests_Add_Number()
10+
{
11+
// Arrange
12+
var values = new[] { -1, 2 }.AsQueryable();
13+
14+
// Act
15+
var result = values.Select<int>("it + 1");
16+
var expected = values.Select(i => i + 1);
17+
18+
// Assert
19+
result.Should().Contain(expected);
20+
}
21+
22+
[Fact]
23+
public void ExpressionTests_Add_String()
24+
{
25+
// Arrange
26+
var values = new[] { "a", "b" }.AsQueryable();
27+
28+
// Act
29+
var result = values.Select<string>("it + \"z\"");
30+
var expected = values.Select(i => i + "z");
31+
32+
// Assert
33+
result.Should().Contain(expected);
34+
}
35+
36+
[Fact]
37+
public void ExpressionTests_SupportedOperands_IAddAndSubtractSignatures_DateTime_Subtracts_DateTime()
38+
{
39+
// Arrange
40+
var values = new[]
41+
{
42+
new
43+
{
44+
Value1 = new DateTime(2023, 1, 4),
45+
Value2 = new DateTime(2023, 1, 3)
46+
}
47+
}.AsQueryable();
48+
49+
// Act
50+
var result = values.Select<TimeSpan>("Value1 - Value2");
51+
var expected = values.Select(x => x.Value1 - x.Value2);
52+
53+
// Assert
54+
result.Should().Contain(expected);
55+
}
56+
57+
[Fact]
58+
public void ExpressionTests_SupportedOperands_IAddAndSubtractSignatures_DateTime_Adds_TimeSpan()
59+
{
60+
// Arrange
61+
var values = new[]
62+
{
63+
new
64+
{
65+
Value1 = new DateTime(2023, 1, 4),
66+
Value2 = TimeSpan.FromDays(1)
67+
}
68+
}.AsQueryable();
69+
70+
// Act
71+
var result = values.Select<DateTime>("Value1 + Value2");
72+
var expected = values.Select(x => x.Value1 + x.Value2);
73+
74+
// Assert
75+
result.Should().Contain(expected);
76+
}
77+
78+
[Fact]
79+
public void ExpressionTests_SupportedOperands_IAddAndSubtractSignatures_DateTime_Subtracts_TimeSpan()
80+
{
81+
// Arrange
82+
var values = new[]
83+
{
84+
new
85+
{
86+
Value1 = new DateTime(2023, 1, 4),
87+
Value2 = TimeSpan.FromDays(1)
88+
}
89+
}.AsQueryable();
90+
91+
// Act
92+
var result = values.Select<DateTime>("Value1 - Value2");
93+
var expected = values.Select(x => x.Value1 - x.Value2);
94+
95+
// Assert
96+
result.Should().Contain(expected);
97+
}
98+
99+
[Fact]
100+
public void ExpressionTests_SupportedOperands_IAddAndSubtractSignatures_TimeSpan_Adds_TimeSpan()
101+
{
102+
// Arrange
103+
var values = new[]
104+
{
105+
new
106+
{
107+
Value1 = TimeSpan.FromDays(1),
108+
Value2 = TimeSpan.FromDays(1)
109+
}
110+
}.AsQueryable();
111+
112+
// Act
113+
var result = values.Select<TimeSpan>("Value1 + Value2");
114+
var expected = values.Select(x => x.Value1 + x.Value2);
115+
116+
// Assert
117+
result.Should().Contain(expected);
118+
}
119+
120+
[Fact]
121+
public void ExpressionTests_SupportedOperands_IAddAndSubtractSignatures_TimeSpan_Subtracts_TimeSpan()
122+
{
123+
// Arrange
124+
var values = new[]
125+
{
126+
new
127+
{
128+
Value1 = TimeSpan.FromDays(7),
129+
Value2 = TimeSpan.FromDays(1)
130+
}
131+
}.AsQueryable();
132+
133+
// Act
134+
var result = values.Select<TimeSpan>("Value1 - Value2");
135+
var expected = values.Select(x => x.Value1 - x.Value2);
136+
137+
// Assert
138+
result.Should().Contain(expected);
139+
}
140+
}

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

-29
Original file line numberDiff line numberDiff line change
@@ -85,35 +85,6 @@ public class TargetClass
8585
public TestEnum A { get; set; }
8686
}
8787

88-
[Fact]
89-
public void ExpressionTests_Add_Number()
90-
{
91-
// Arrange
92-
var values = new[] { -1, 2 }.AsQueryable();
93-
94-
// Act
95-
var result = values.Select<int>("it + 1");
96-
var expected = values.Select(i => i + 1);
97-
98-
// Assert
99-
Check.That(result).ContainsExactly(expected);
100-
}
101-
102-
[Fact]
103-
public void ExpressionTests_Add_String()
104-
{
105-
// Arrange
106-
var values = new[] { "a", "b" }.AsQueryable();
107-
108-
// Act
109-
var result = values.Select<string>("it + \"z\"");
110-
var expected = values.Select(i => i + "z");
111-
112-
// Assert
113-
Check.That(result).ContainsExactly(expected);
114-
}
115-
116-
11788
[Fact]
11889
public void ExpressionTests_AndAlso()
11990
{

0 commit comments

Comments
 (0)