Skip to content

Commit 451d137

Browse files
committed
Cache substituted lambdas
See #135
1 parent bb03a23 commit 451d137

File tree

4 files changed

+156
-41
lines changed

4 files changed

+156
-41
lines changed

src/DelegateDecompiler.Tests/DecompilerTestsBase.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace DelegateDecompiler.Tests
77
{
88
public class DecompilerTestsBase
99
{
10-
private static readonly Func<Expression, string> debugView = BuildDebugView();
10+
static readonly Func<Expression, string> DebugView = BuildDebugView();
1111

1212
private static Func<Expression, string> BuildDebugView()
1313
{
@@ -25,7 +25,7 @@ protected static void Test<T>(Expression<T> expected, T compiled)
2525
var y = decompiled.Body.ToString();
2626
Console.WriteLine(y);
2727
Assert.AreEqual(x, y);
28-
Assert.AreEqual(debugView(expected.Body), debugView(decompiled.Body));
28+
Assert.AreEqual(DebugView(expected.Body), DebugView(decompiled.Body));
2929
}
3030

3131
protected static void Test<T>(Expression<T> expected, MethodInfo compiled)
@@ -38,7 +38,7 @@ protected static void Test<T>(Expression<T> expected, MethodInfo compiled)
3838
var y = decompiled.Body.ToString();
3939
Console.WriteLine(y);
4040
Assert.AreEqual(x, y);
41-
Assert.AreEqual(debugView(expected.Body), debugView(decompiled.Body));
41+
Assert.AreEqual(DebugView(expected.Body), DebugView(decompiled.Body));
4242
}
4343

4444
protected static void Test<T>(Expression<T> expected1, Expression<T> expected2, T compiled)
@@ -53,7 +53,13 @@ protected static void Test<T>(Expression<T> expected1, Expression<T> expected2,
5353
var y = decompiled.Body.ToString();
5454
Console.WriteLine(y);
5555
Assert.That(y, Is.EqualTo(x1).Or.EqualTo(x2));
56-
Assert.That(debugView(decompiled.Body), Is.EqualTo(debugView(expected1.Body)).Or.EqualTo(debugView(expected2.Body)));
56+
Assert.That(DebugView(decompiled.Body), Is.EqualTo(DebugView(expected1.Body)).Or.EqualTo(DebugView(expected2.Body)));
57+
}
58+
59+
protected static void AssertAreEqual(Expression expected, Expression actual)
60+
{
61+
Assert.AreEqual(expected.ToString(), actual.ToString());
62+
Assert.AreEqual(DebugView(expected), DebugView(actual));
5763
}
5864
}
5965
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using NUnit.Framework;
4+
5+
namespace DelegateDecompiler.Tests
6+
{
7+
[TestFixture]
8+
public class Issue135 : DecompilerTestsBase
9+
{
10+
public class Post {
11+
public bool IsActive { get; set; }
12+
}
13+
14+
public class Blog
15+
{
16+
public bool HasBar { get; }
17+
public bool HasBaz { get; }
18+
19+
public IEnumerable<Post> Posts { get; }
20+
21+
22+
[Decompile]
23+
public bool HasFoo
24+
{
25+
get { return (HasBar || HasBaz) && Posts.Any(x => x.IsActive); }
26+
}
27+
28+
[Decompile]
29+
public bool HasFoo2
30+
{
31+
get { return (HasBar && Posts.Any(x => x.IsActive)) || (HasBaz && Posts.Any(x => x.IsActive)); }
32+
}
33+
34+
[Decompile]
35+
public bool HasFoo3
36+
{
37+
get { return Posts.Any(x => x.IsActive) && (HasBar || HasBaz); }
38+
}
39+
}
40+
41+
[Test, Ignore("Not fixed")]
42+
public void Test1()
43+
{
44+
var blogs = new[] {new Blog()}.AsQueryable();
45+
46+
var expected = (
47+
from b in blogs
48+
where (b.HasBar || b.HasBaz) && b.Posts.Any(x => x.IsActive)
49+
select b);
50+
51+
var actual = (
52+
from b in blogs
53+
where b.HasFoo
54+
select b).Decompile();
55+
56+
AssertAreEqual(expected.Expression, actual.Expression);
57+
}
58+
59+
[Test, Ignore("Not fixed")]
60+
public void Test2()
61+
{
62+
var blogs = new[] {new Blog()}.AsQueryable();
63+
64+
var expected = (
65+
from b in blogs
66+
where (b.HasBar && b.Posts.Any(x => x.IsActive)) || (b.HasBaz && b.Posts.Any(x => x.IsActive))
67+
select b);
68+
69+
var actual = (
70+
from b in blogs
71+
where b.HasFoo2
72+
select b).Decompile();
73+
74+
AssertAreEqual(expected.Expression, actual.Expression);
75+
}
76+
77+
[Test]
78+
public void Test3()
79+
{
80+
var blogs = new[] {new Blog()}.AsQueryable();
81+
82+
var expected = (
83+
from b in blogs
84+
where b.Posts.Any(x => x.IsActive) && (b.HasBar || b.HasBaz)
85+
select b);
86+
87+
var actual = (
88+
from b in blogs
89+
where b.HasFoo3
90+
select b).Decompile();
91+
92+
AssertAreEqual(expected.Expression, actual.Expression);
93+
}
94+
}
95+
}

src/DelegateDecompiler.Tests/QueryableExtensionsTests.cs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace DelegateDecompiler.Tests
66
{
77
[TestFixture]
8-
public class QueryableExtensionsTests
8+
public class QueryableExtensionsTests : DecompilerTestsBase
99
{
1010
[Test]
1111
public void InlinePropertyWithoutAttribute()
@@ -20,7 +20,7 @@ public void InlinePropertyWithoutAttribute()
2020
where employee.FullNameWithoutAttribute.Computed() == "Test User"
2121
select employee).Decompile();
2222

23-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
23+
AssertAreEqual(expected.Expression, actual.Expression);
2424
}
2525

2626
[Test]
@@ -36,7 +36,7 @@ public void InlineProperty()
3636
where employee.FullName == "Test User"
3737
select employee).Decompile();
3838

39-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
39+
AssertAreEqual(expected.Expression, actual.Expression);
4040
}
4141

4242
[Test]
@@ -52,7 +52,7 @@ public void ConcatNonStringInlineProperty()
5252
where employee.FromTo == "0-100"
5353
select employee).Decompile();
5454

55-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
55+
AssertAreEqual(expected.Expression, actual.Expression);
5656
}
5757

5858
[Test]
@@ -70,7 +70,7 @@ public void InlinePropertyOrderBy()
7070
orderby employee.FullName
7171
select employee);
7272

73-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
73+
AssertAreEqual(expected.Expression, actual.Expression);
7474
}
7575

7676
[Test]
@@ -88,7 +88,7 @@ public void InlinePropertyOrderByThenBy()
8888
orderby employee.FullName
8989
select employee).ThenBy(x => x.IsActive);
9090

91-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
91+
AssertAreEqual(expected.Expression, actual.Expression);
9292
}
9393

9494
[Test]
@@ -104,7 +104,7 @@ where true
104104
where employee.IsActive
105105
select employee).Decompile();
106106

107-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
107+
AssertAreEqual(expected.Expression, actual.Expression);
108108
}
109109

110110
[Test]
@@ -120,7 +120,7 @@ public void TestLdflda()
120120
where employee.Count == 0
121121
select employee).Decompile();
122122

123-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
123+
AssertAreEqual(expected.Expression, actual.Expression);
124124
}
125125

126126
[Test]
@@ -136,7 +136,7 @@ public void InlineTooDeepProperty()
136136
where employee.TooDeepName == "Test User"
137137
select employee).Decompile();
138138

139-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
139+
AssertAreEqual(expected.Expression, actual.Expression);
140140
}
141141

142142
[Test]
@@ -154,7 +154,7 @@ public void InlinePropertyWithVariableClosure()
154154
select employee).Decompile();
155155

156156
Console.WriteLine(expected);
157-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
157+
AssertAreEqual(expected.Expression, actual.Expression);
158158
}
159159

160160
[Test]
@@ -170,7 +170,7 @@ public void InlineMethod()
170170
where employee.FullNameMethod() == "Test User"
171171
select employee).Decompile();
172172

173-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
173+
AssertAreEqual(expected.Expression, actual.Expression);
174174
}
175175

176176
[Test]
@@ -186,7 +186,7 @@ public void InlineMethodWithArg()
186186
where employee.FullNameMethod("Mr ") == "Mr Test User"
187187
select employee).Decompile();
188188

189-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
189+
AssertAreEqual(expected.Expression, actual.Expression);
190190
}
191191

192192
[Test]
@@ -202,7 +202,7 @@ public void InlineMethodWithTwoArgs()
202202
where employee.FullNameMethod("Mr ", " Jr.") == "Mr Test User Jr."
203203
select employee).Decompile();
204204

205-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
205+
AssertAreEqual(expected.Expression, actual.Expression);
206206
}
207207

208208
[Test, Ignore("Minor differences")]
@@ -218,7 +218,7 @@ public void Issue39()
218218
where employee.Test
219219
select employee).Decompile();
220220

221-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
221+
AssertAreEqual(expected.Expression, actual.Expression);
222222
}
223223

224224
[Test]
@@ -230,7 +230,7 @@ public void Issue58()
230230

231231
var actual = employees.AsQueryable().Where(_ => _.ComplexProperty == 1).Decompile();
232232

233-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
233+
AssertAreEqual(expected.Expression, actual.Expression);
234234
}
235235

236236
[Test]
@@ -246,7 +246,7 @@ public void InlineExtensionMethod()
246246
where employee.FullName().Computed() == "Test User"
247247
select employee).Decompile();
248248

249-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
249+
AssertAreEqual(expected.Expression, actual.Expression);
250250
}
251251

252252
[Test]
@@ -264,7 +264,7 @@ where employee.FullName().Computed() == "Test User"
264264
orderby employee.FullName ().Computed()
265265
select employee);
266266

267-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
267+
AssertAreEqual(expected.Expression, actual.Expression);
268268
}
269269

270270
[Test]
@@ -282,7 +282,7 @@ where employee.FullName().Computed() == "Test User"
282282
orderby employee.FullName().Computed()
283283
select employee).ThenBy(x => x.IsActive);
284284

285-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
285+
AssertAreEqual(expected.Expression, actual.Expression);
286286
}
287287

288288
[Test]
@@ -298,7 +298,7 @@ public void InlinePropertyNullableShortColeasce1()
298298
where employee.TheBad > (short)0
299299
select employee);
300300

301-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
301+
AssertAreEqual(expected.Expression, actual.Expression);
302302
}
303303

304304
[Test]
@@ -314,7 +314,7 @@ public void InlinePropertyNullableShortColeasce2()
314314
where (employee.MyField.HasValue ? (short)0 : (short)1) > 0
315315
select employee);
316316

317-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
317+
AssertAreEqual(expected.Expression, actual.Expression);
318318
}
319319

320320
[Test, Ignore("Minor differences")]
@@ -328,7 +328,7 @@ public void Issue78()
328328

329329
var actual = employees.AsQueryable().Select(e => e.TotalHoursDb).Decompile();
330330

331-
Assert.AreEqual(expected.Expression.ToString(), actual.Expression.ToString());
331+
AssertAreEqual(expected.Expression, actual.Expression);
332332
}
333333
}
334334
}

0 commit comments

Comments
 (0)