From b5f580a87bd2a6df5f3e94c6ef00f7c62cc06fa0 Mon Sep 17 00:00:00 2001 From: Martin Hans Date: Thu, 19 Mar 2026 14:55:53 +0100 Subject: [PATCH 1/2] Fix nullable target overloads for SetIfNotNull and Update - Change Update(TProperty?, Action) visibility from public to protected to match base class convention - Add TestAggregator wrappers for Action overloads - Disambiguate test call sites with explicit Action casts --- .../Aggregation/EventAggregatorBase.cs | 29 +++ .../EventAggregatorBaseTests.cs | 166 ++++++++++++++++-- 2 files changed, 182 insertions(+), 13 deletions(-) diff --git a/src/Papst.EventStore/Aggregation/EventAggregatorBase.cs b/src/Papst.EventStore/Aggregation/EventAggregatorBase.cs index 72503fc..6465962 100644 --- a/src/Papst.EventStore/Aggregation/EventAggregatorBase.cs +++ b/src/Papst.EventStore/Aggregation/EventAggregatorBase.cs @@ -42,6 +42,20 @@ protected void Update(TProperty? value, Action setter) whe } } + /// + /// Executes the action when .HasValue is true + /// + /// + /// + /// + protected void Update(TProperty? value, Action setter) where TProperty : struct + { + if (value.HasValue) + { + setter.Invoke(value); + } + } + /// /// Executes the action when is not null /// @@ -71,6 +85,21 @@ protected void SetIfNotNull(Action setter, TProperty? valu } } + /// + /// This overload is for nullable value types. + /// Executes the action when .HasValue is true. + /// + /// + /// + /// + protected void SetIfNotNull(Action setter, TProperty? value) where TProperty : struct + { + if (value.HasValue) + { + setter(value); + } + } + /// /// Returns the given Entity wrapped in a Task /// diff --git a/tests/Papst.EventStore.Tests/EventAggregatorBaseTests.cs b/tests/Papst.EventStore.Tests/EventAggregatorBaseTests.cs index 8be9c84..b75e262 100644 --- a/tests/Papst.EventStore.Tests/EventAggregatorBaseTests.cs +++ b/tests/Papst.EventStore.Tests/EventAggregatorBaseTests.cs @@ -17,7 +17,7 @@ public void SetIfNotNull_ShouldInvokeSetter_WhenNullableStructHasValue() int result = 0; int? value = 42; - _sut.CallSetIfNotNull(v => result = v, value); + _sut.CallSetIfNotNull(v => result = v, value); result.ShouldBe(42); } @@ -28,7 +28,7 @@ public void SetIfNotNull_ShouldNotInvokeSetter_WhenNullableStructIsNull() int result = 0; int? value = null; - _sut.CallSetIfNotNull(v => result = v, value); + _sut.CallSetIfNotNull(v => result = v, value); result.ShouldBe(0); } @@ -39,7 +39,7 @@ public void SetIfNotNull_ShouldInvokeSetter_WhenNullableDateTimeHasValue() DateTime result = default; DateTime? value = new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc); - _sut.CallSetIfNotNull(v => result = v, value); + _sut.CallSetIfNotNull(v => result = v, value); result.ShouldBe(new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)); } @@ -50,7 +50,7 @@ public void SetIfNotNull_ShouldNotInvokeSetter_WhenNullableDateTimeIsNull() DateTime result = default; DateTime? value = null; - _sut.CallSetIfNotNull(v => result = v, value); + _sut.CallSetIfNotNull(v => result = v, value); result.ShouldBe(default(DateTime)); } @@ -62,7 +62,7 @@ public void SetIfNotNull_ShouldInvokeSetter_WhenNullableGuidHasValue() Guid expected = Guid.NewGuid(); Guid? value = expected; - _sut.CallSetIfNotNull(v => result = v, value); + _sut.CallSetIfNotNull(v => result = v, value); result.ShouldBe(expected); } @@ -73,7 +73,74 @@ public void SetIfNotNull_ShouldNotInvokeSetter_WhenNullableGuidIsNull() Guid result = Guid.Empty; Guid? value = null; - _sut.CallSetIfNotNull(v => result = v, value); + _sut.CallSetIfNotNull(v => result = v, value); + + result.Should().Be(Guid.Empty); + } + + [Fact] + public void SetIfNotNull_ShouldInvokeSetterForNullable_WhenNullableStructHasValue() + { + int? result = 0; + int? value = 42; + + _sut.CallSetIfNotNull((Action)(v => result = v), value); + + result.Should().Be(42); + } + + [Fact] + public void SetIfNotNull_ShouldNotInvokeSetterForNullable_WhenNullableStructIsNull() + { + int? result = 0; + int? value = null; + + _sut.CallSetIfNotNull((Action)(v => result = v), value); + + result.Should().Be(0); + } + + [Fact] + public void SetIfNotNull_ShouldInvokeSetterForNullable_WhenNullableDateTimeHasValue() + { + DateTime? result = null; + DateTime? value = new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + _sut.CallSetIfNotNull((Action)(v => result = v), value); + + result.Should().Be(new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)); + } + + [Fact] + public void SetIfNotNull_ShouldNotInvokeSetterForNullable_WhenNullableDateTimeIsNull() + { + DateTime? result = default(DateTime); + DateTime? value = null; + + _sut.CallSetIfNotNull((Action)(v => result = v), value); + + result.Should().Be(default(DateTime)); + } + + [Fact] + public void SetIfNotNull_ShouldInvokeSetterForNullable_WhenNullableGuidHasValue() + { + Guid? result = Guid.Empty; + Guid expected = new Guid(); + Guid? value = expected; + + _sut.CallSetIfNotNull((Action)(v => result = v), value); + + result.Should().Be(expected); + } + + [Fact] + public void SetIfNotNull_ShouldNotInvokeSetterForNullable_WhenNullableGuidIsNull() + { + Guid? result = Guid.Empty; + Guid? value = null; + + _sut.CallSetIfNotNull((Action)(v => result = v), value); result.ShouldBe(Guid.Empty); } @@ -84,7 +151,7 @@ public void Update_ShouldInvokeSetter_WhenNullableStructHasValue() int result = 0; int? value = 42; - _sut.CallUpdate(value, v => result = v); + _sut.CallUpdate(value, v => result = v); result.ShouldBe(42); } @@ -95,7 +162,7 @@ public void Update_ShouldNotInvokeSetter_WhenNullableStructIsNull() int result = 0; int? value = null; - _sut.CallUpdate(value, v => result = v); + _sut.CallUpdate(value, v => result = v); result.ShouldBe(0); } @@ -106,7 +173,7 @@ public void Update_ShouldInvokeSetter_WhenNullableDateTimeHasValue() DateTime result = default; DateTime? value = new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc); - _sut.CallUpdate(value, v => result = v); + _sut.CallUpdate(value, v => result = v); result.ShouldBe(new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)); } @@ -117,7 +184,7 @@ public void Update_ShouldNotInvokeSetter_WhenNullableDateTimeIsNull() DateTime result = default; DateTime? value = null; - _sut.CallUpdate(value, v => result = v); + _sut.CallUpdate(value, v => result = v); result.ShouldBe(default(DateTime)); } @@ -129,7 +196,7 @@ public void Update_ShouldInvokeSetter_WhenNullableGuidHasValue() Guid expected = Guid.NewGuid(); Guid? value = expected; - _sut.CallUpdate(value, v => result = v); + _sut.CallUpdate(value, v => result = v); result.ShouldBe(expected); } @@ -140,7 +207,74 @@ public void Update_ShouldNotInvokeSetter_WhenNullableGuidIsNull() Guid result = Guid.Empty; Guid? value = null; - _sut.CallUpdate(value, v => result = v); + _sut.CallUpdate(value, v => result = v); + + result.Should().Be(Guid.Empty); + } + + [Fact] + public void Update_ShouldInvokeSetterForNullable_WhenNullableStructHasValue() + { + int? result = 0; + int? value = 42; + + _sut.CallUpdate(value,(Action)(v => result = v)); + + result.Should().Be(42); + } + + [Fact] + public void Update_ShouldNotInvokeSetterForNullable_WhenNullableStructIsNull() + { + int? result = 0; + int? value = null; + + _sut.CallUpdate(value, (Action)(v => result = v)); + + result.Should().Be(0); + } + + [Fact] + public void Update_ShouldInvokeSetterForNullable_WhenNullableDateTimeHasValue() + { + DateTime? result = null; + DateTime? value = new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + _sut.CallUpdate(value, (Action)(v => result = v)); + + result.Should().Be(new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)); + } + + [Fact] + public void Update_ShouldNotInvokeSetterForNullable_WhenNullableDateTimeIsNull() + { + DateTime? result = default(DateTime); + DateTime? value = null; + + _sut.CallUpdate(value, (Action)(v => result = v)); + + result.Should().Be(default(DateTime)); + } + + [Fact] + public void Update_ShouldInvokeSetterForNullable_WhenNullableGuidHasValue() + { + Guid? result = Guid.Empty; + Guid expected = Guid.NewGuid(); + Guid? value = expected; + + _sut.CallUpdate(value, (Action)(v => result = v)); + + result.Should().Be(expected); + } + + [Fact] + public void Update_ShouldNotInvokeSetterForNullable_WhenNullableGuidIsNull() + { + Guid? result = Guid.Empty; + Guid? value = null; + + _sut.CallUpdate(value, (Action)(v => result = v)); result.ShouldBe(Guid.Empty); } @@ -159,8 +293,14 @@ private class TestAggregator : EventAggregatorBase public void CallSetIfNotNull(Action setter, T? value) where T : struct => SetIfNotNull(setter, value); - + + public void CallSetIfNotNull(Action setter, T? value) where T : struct + => SetIfNotNull(setter, value); + public void CallUpdate(T? value, Action setter) where T : struct => Update(value, setter); + + public void CallUpdate(T? value, Action setter) where T : struct + => Update(value, setter); } } From 5ce1e2208a90ad619edec03c5c2e3a5b08a988eb Mon Sep 17 00:00:00 2001 From: Marco Papst Date: Sun, 12 Apr 2026 23:40:51 +0200 Subject: [PATCH 2/2] After rebase, refactor to use Shouldly --- .../EventAggregatorBaseTests.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/Papst.EventStore.Tests/EventAggregatorBaseTests.cs b/tests/Papst.EventStore.Tests/EventAggregatorBaseTests.cs index b75e262..67f753d 100644 --- a/tests/Papst.EventStore.Tests/EventAggregatorBaseTests.cs +++ b/tests/Papst.EventStore.Tests/EventAggregatorBaseTests.cs @@ -75,7 +75,7 @@ public void SetIfNotNull_ShouldNotInvokeSetter_WhenNullableGuidIsNull() _sut.CallSetIfNotNull(v => result = v, value); - result.Should().Be(Guid.Empty); + result.ShouldBe(Guid.Empty); } [Fact] @@ -86,7 +86,7 @@ public void SetIfNotNull_ShouldInvokeSetterForNullable_WhenNullableStructHasValu _sut.CallSetIfNotNull((Action)(v => result = v), value); - result.Should().Be(42); + result.ShouldBe(42); } [Fact] @@ -97,7 +97,7 @@ public void SetIfNotNull_ShouldNotInvokeSetterForNullable_WhenNullableStructIsNu _sut.CallSetIfNotNull((Action)(v => result = v), value); - result.Should().Be(0); + result.ShouldBe(0); } [Fact] @@ -108,7 +108,7 @@ public void SetIfNotNull_ShouldInvokeSetterForNullable_WhenNullableDateTimeHasVa _sut.CallSetIfNotNull((Action)(v => result = v), value); - result.Should().Be(new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)); + result.ShouldBe(new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)); } [Fact] @@ -119,7 +119,7 @@ public void SetIfNotNull_ShouldNotInvokeSetterForNullable_WhenNullableDateTimeIs _sut.CallSetIfNotNull((Action)(v => result = v), value); - result.Should().Be(default(DateTime)); + result.ShouldBe(default(DateTime)); } [Fact] @@ -131,7 +131,7 @@ public void SetIfNotNull_ShouldInvokeSetterForNullable_WhenNullableGuidHasValue( _sut.CallSetIfNotNull((Action)(v => result = v), value); - result.Should().Be(expected); + result.ShouldBe(expected); } [Fact] @@ -209,7 +209,7 @@ public void Update_ShouldNotInvokeSetter_WhenNullableGuidIsNull() _sut.CallUpdate(value, v => result = v); - result.Should().Be(Guid.Empty); + result.ShouldBe(Guid.Empty); } [Fact] @@ -220,7 +220,7 @@ public void Update_ShouldInvokeSetterForNullable_WhenNullableStructHasValue() _sut.CallUpdate(value,(Action)(v => result = v)); - result.Should().Be(42); + result.ShouldBe(42); } [Fact] @@ -231,7 +231,7 @@ public void Update_ShouldNotInvokeSetterForNullable_WhenNullableStructIsNull() _sut.CallUpdate(value, (Action)(v => result = v)); - result.Should().Be(0); + result.ShouldBe(0); } [Fact] @@ -242,7 +242,7 @@ public void Update_ShouldInvokeSetterForNullable_WhenNullableDateTimeHasValue() _sut.CallUpdate(value, (Action)(v => result = v)); - result.Should().Be(new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)); + result.ShouldBe(new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)); } [Fact] @@ -253,7 +253,7 @@ public void Update_ShouldNotInvokeSetterForNullable_WhenNullableDateTimeIsNull() _sut.CallUpdate(value, (Action)(v => result = v)); - result.Should().Be(default(DateTime)); + result.ShouldBe(default(DateTime)); } [Fact] @@ -265,7 +265,7 @@ public void Update_ShouldInvokeSetterForNullable_WhenNullableGuidHasValue() _sut.CallUpdate(value, (Action)(v => result = v)); - result.Should().Be(expected); + result.ShouldBe(expected); } [Fact]