From 7115907bf7a835bb4fd682d861dee59a044bae15 Mon Sep 17 00:00:00 2001 From: Simon Schulze <57634354+SSchulze1989@users.noreply.github.com> Date: Sat, 11 Jun 2022 22:02:34 +0200 Subject: [PATCH] Add overload for Set() with custom IEqualityComparer (#113) --- .../ViewModel/ViewModelBase.cs | 10 ++++- .../ViewModel/ViewModelBaseTests.cs | 39 ++++++++++++++++++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/MvvmBlazor.Core/ViewModel/ViewModelBase.cs b/src/MvvmBlazor.Core/ViewModel/ViewModelBase.cs index a8f48ac..140a599 100644 --- a/src/MvvmBlazor.Core/ViewModel/ViewModelBase.cs +++ b/src/MvvmBlazor.Core/ViewModel/ViewModelBase.cs @@ -1,4 +1,4 @@ -namespace MvvmBlazor.ViewModel; +namespace MvvmBlazor.ViewModel; public abstract class ViewModelBase : INotifyPropertyChanged { @@ -10,7 +10,13 @@ public abstract class ViewModelBase : INotifyPropertyChanged protected bool Set(ref T field, T value, [CallerMemberName] string? propertyName = null) { - if (!EqualityComparer.Default.Equals(field, value)) + return Set(ref field, value, EqualityComparer.Default, propertyName); + } + + protected bool Set(ref T field, T value, IEqualityComparer equalityComparer, [CallerMemberName] string? propertyName = null) + { + ArgumentNullException.ThrowIfNull(equalityComparer); + if (!equalityComparer.Equals(field, value)) { field = value; OnPropertyChanged(propertyName!); diff --git a/src/MvvmBlazor.Tests/ViewModel/ViewModelBaseTests.cs b/src/MvvmBlazor.Tests/ViewModel/ViewModelBaseTests.cs index eebbbfd..bbfcdcd 100644 --- a/src/MvvmBlazor.Tests/ViewModel/ViewModelBaseTests.cs +++ b/src/MvvmBlazor.Tests/ViewModel/ViewModelBaseTests.cs @@ -1,4 +1,4 @@ -namespace MvvmBlazor.Tests.ViewModel; +namespace MvvmBlazor.Tests.ViewModel; public class ViewModelBaseTests { @@ -76,11 +76,48 @@ void TestField(ref T field, T value) TestField(ref double1, 2.3); } + [Fact] + public void Set_returns_False_with_custom_equality_comparer() + { + var mockEq= new StrictMock>(); + mockEq.Setup(x => x.Equals(It.IsAny(), It.IsAny())) + .Returns(true) + .Verifiable(); + + var vm = new TestViewModel(); + var int1 = 1; + var res = vm.SetProperty(ref int1, 2, mockEq.Object, "Foo"); + + res.ShouldBe(false); + mockEq.Verify(); + } + + [Fact] + public void Set_returns_true_with_custom_equality_comparer() + { + var mockEq= new StrictMock>(); + mockEq.Setup(x => x.Equals(It.IsAny(), It.IsAny())) + .Returns(false) + .Verifiable(); + + var vm = new TestViewModel(); + var int1 = 1; + var res = vm.SetProperty(ref int1, 1, mockEq.Object, "Foo"); + + res.ShouldBe(true); + mockEq.Verify(); + } + private class TestViewModel : ViewModelBase { public bool SetProperty(ref T field, T value, string? propertyName = null) { return Set(ref field, value, propertyName); } + + public bool SetProperty(ref T field, T value, IEqualityComparer equalityComparer, string? propertyName = null) + { + return Set(ref field, value, equalityComparer, propertyName); + } } } \ No newline at end of file