From 4b6810f22e64eccf34a5b3ee5f6159ca1ce32e82 Mon Sep 17 00:00:00 2001 From: Koen Date: Mon, 1 Jun 2026 17:57:25 +0000 Subject: [PATCH] UnionBy stub had a wrong parameter type --- .../ExpressiveQueryableLinqExtensions.cs | 4 +- ....UnionBy_GeneratesInterceptor.verified.txt | 2 +- .../SetOperationTests.cs | 2 +- .../Tests/SetOperationInterceptorTests.cs | 60 +++++++++++++++++++ 4 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 tests/ExpressiveSharp.IntegrationTests/Tests/SetOperationInterceptorTests.cs diff --git a/src/ExpressiveSharp/Extensions/ExpressiveQueryableLinqExtensions.cs b/src/ExpressiveSharp/Extensions/ExpressiveQueryableLinqExtensions.cs index 03845371..ac71256b 100644 --- a/src/ExpressiveSharp/Extensions/ExpressiveQueryableLinqExtensions.cs +++ b/src/ExpressiveSharp/Extensions/ExpressiveQueryableLinqExtensions.cs @@ -408,7 +408,7 @@ public static IExpressiveQueryable IntersectBy( [EditorBrowsable(EditorBrowsableState.Never)] public static IExpressiveQueryable UnionBy( this IExpressiveQueryable source, - IEnumerable second, + IEnumerable second, Func keySelector) => throw new UnreachableException(InterceptedMessage); @@ -551,7 +551,7 @@ public static IExpressiveQueryable IntersectBy( [EditorBrowsable(EditorBrowsableState.Never)] public static IExpressiveQueryable UnionBy( this IExpressiveQueryable source, - IEnumerable second, + IEnumerable second, Func keySelector, IEqualityComparer? comparer) => throw new UnreachableException(InterceptedMessage); diff --git a/tests/ExpressiveSharp.Generator.Tests/PolyfillInterceptorGenerator/SetOperationTests.UnionBy_GeneratesInterceptor.verified.txt b/tests/ExpressiveSharp.Generator.Tests/PolyfillInterceptorGenerator/SetOperationTests.UnionBy_GeneratesInterceptor.verified.txt index 7242ba29..5c0e9508 100644 --- a/tests/ExpressiveSharp.Generator.Tests/PolyfillInterceptorGenerator/SetOperationTests.UnionBy_GeneratesInterceptor.verified.txt +++ b/tests/ExpressiveSharp.Generator.Tests/PolyfillInterceptorGenerator/SetOperationTests.UnionBy_GeneratesInterceptor.verified.txt @@ -8,7 +8,7 @@ namespace ExpressiveSharp.Generated.Interceptors [global::System.Runtime.CompilerServices.InterceptsLocationAttribute(/* scrubbed */)] internal static global::ExpressiveSharp.IExpressiveQueryable __Polyfill_UnionBy_361d_10_18( this global::ExpressiveSharp.IExpressiveQueryable source, - global::System.Collections.Generic.IEnumerable second, + global::System.Collections.Generic.IEnumerable second, global::System.Func __func) { // Source: o => o.Tag diff --git a/tests/ExpressiveSharp.Generator.Tests/PolyfillInterceptorGenerator/SetOperationTests.cs b/tests/ExpressiveSharp.Generator.Tests/PolyfillInterceptorGenerator/SetOperationTests.cs index 4323f73a..a0163c38 100644 --- a/tests/ExpressiveSharp.Generator.Tests/PolyfillInterceptorGenerator/SetOperationTests.cs +++ b/tests/ExpressiveSharp.Generator.Tests/PolyfillInterceptorGenerator/SetOperationTests.cs @@ -75,7 +75,7 @@ namespace TestNs class Order { public string Tag { get; set; } } class TestClass { - public void Run(System.Linq.IQueryable query, System.Collections.Generic.IEnumerable extra) + public void Run(System.Linq.IQueryable query, System.Collections.Generic.IEnumerable extra) { query.AsExpressive() .UnionBy(extra, o => o.Tag) diff --git a/tests/ExpressiveSharp.IntegrationTests/Tests/SetOperationInterceptorTests.cs b/tests/ExpressiveSharp.IntegrationTests/Tests/SetOperationInterceptorTests.cs new file mode 100644 index 00000000..e359f090 --- /dev/null +++ b/tests/ExpressiveSharp.IntegrationTests/Tests/SetOperationInterceptorTests.cs @@ -0,0 +1,60 @@ +using ExpressiveSharp.IntegrationTests.Scenarios.Store.Models; + +namespace ExpressiveSharp.IntegrationTests.Tests; + +[TestClass] +public class SetOperationInterceptorTests +{ + private static readonly List _orders = new() + { + new Order { Id = 1, Tag = "A", Price = 100, Quantity = 2 }, + new Order { Id = 2, Tag = "B", Price = 50, Quantity = 1 }, + new Order { Id = 3, Tag = "C", Price = 25, Quantity = 4 }, + }; + + [TestMethod] + public void UnionBy_WithElementSequence_CompilesAndRuns() + { + var source = _orders.AsQueryable(); + var extra = new List + { + new() { Id = 4, Tag = "B", Price = 999, Quantity = 9 }, + new() { Id = 5, Tag = "D", Price = 10, Quantity = 1 }, + }; + + var results = source.AsExpressive() + .UnionBy(extra, o => o.Tag) + .ToList(); + + var tags = results.Select(o => o.Tag).ToList(); + Assert.AreEqual(4, results.Count); + CollectionAssert.AreEquivalent(new[] { "A", "B", "C", "D" }, tags); + Assert.AreEqual(2, results.Single(o => o.Tag == "B").Id); + } + + [TestMethod] + public void ExceptBy_WithKeySequence_CompilesAndRuns() + { + var source = _orders.AsQueryable(); + var excluded = new[] { "B" }; + + var results = source.AsExpressive() + .ExceptBy(excluded, o => o.Tag) + .ToList(); + + CollectionAssert.AreEquivalent(new[] { "A", "C" }, results.Select(o => o.Tag).ToList()); + } + + [TestMethod] + public void IntersectBy_WithKeySequence_CompilesAndRuns() + { + var source = _orders.AsQueryable(); + var included = new[] { "B", "C", "X" }; + + var results = source.AsExpressive() + .IntersectBy(included, o => o.Tag) + .ToList(); + + CollectionAssert.AreEquivalent(new[] { "B", "C" }, results.Select(o => o.Tag).ToList()); + } +}