From 04977e17b62e1207ac10af1eb090b79a20a4f853 Mon Sep 17 00:00:00 2001 From: Stefan Steinhilber Date: Mon, 21 Jun 2021 11:32:38 +0200 Subject: [PATCH 1/3] Fix register/unregister issues of WeakReferenceMessenger --- .../Messaging/WeakReferenceMessenger.cs | 4 +++- .../UnitTests.Shared/Mvvm/Test_Messenger.cs | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs b/Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs index 3f79f237373..19e14497b39 100644 --- a/Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs +++ b/Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs @@ -406,6 +406,8 @@ public bool MoveNext() while (node is not null) { + LinkedListNode>? nextNode = node.Next; + // Get the key and value for the current node if (node.Value.TryGetTarget(out TKey? target) && this.owner.table.TryGetValue(target!, out TValue? value)) @@ -421,7 +423,7 @@ public bool MoveNext() this.owner.keys.Remove(node); } - node = node.Next; + node = nextNode; } return false; diff --git a/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs b/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs index e5b4fd00fad..6b9009e0736 100644 --- a/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs +++ b/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs @@ -511,6 +511,29 @@ void Test() messenger.Cleanup(); } + [TestCategory("Mvvm")] + [TestMethod] + [DataRow(typeof(StrongReferenceMessenger))] + [DataRow(typeof(WeakReferenceMessenger))] + public void Test_Messenger_RegisterMultiple_UnregisterSingle(Type type) + { + var messenger = (IMessenger)Activator.CreateInstance(type); + + var recipient1 = new object(); + var recipient2 = new object(); + + int handlerCalledCount = 0; + + messenger.Register(recipient1, (r, m) => { handlerCalledCount++; }); + messenger.Register(recipient2, (r, m) => { handlerCalledCount++; }); + + messenger.UnregisterAll(recipient2); + + messenger.Send(new MessageA()); + + Assert.AreEqual(1, handlerCalledCount); + } + public sealed class RecipientWithNoMessages { public int Number { get; set; } From 05d95f8c3df0dae9605477acfa9abbf55410c484 Mon Sep 17 00:00:00 2001 From: steinhilber <86227735+steinhilber@users.noreply.github.com> Date: Wed, 23 Jun 2021 06:48:45 +0200 Subject: [PATCH 2/3] Update UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs Co-authored-by: Sergio Pedri --- UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs b/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs index 6b9009e0736..6108176a0dd 100644 --- a/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs +++ b/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs @@ -511,6 +511,7 @@ void Test() messenger.Cleanup(); } + // See https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/4081 [TestCategory("Mvvm")] [TestMethod] [DataRow(typeof(StrongReferenceMessenger))] @@ -573,4 +574,4 @@ public sealed class MessageB { } } -} \ No newline at end of file +} From 928fc47b4b2d29d2de5d72461d6a7aef1315149e Mon Sep 17 00:00:00 2001 From: steinhilber <86227735+steinhilber@users.noreply.github.com> Date: Wed, 23 Jun 2021 06:49:22 +0200 Subject: [PATCH 3/3] Update UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs Co-authored-by: Sergio Pedri --- UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs b/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs index 6108176a0dd..1ccc27af67d 100644 --- a/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs +++ b/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs @@ -523,16 +523,18 @@ public void Test_Messenger_RegisterMultiple_UnregisterSingle(Type type) var recipient1 = new object(); var recipient2 = new object(); - int handlerCalledCount = 0; + int handler1CalledCount = 0; + int handler2CalledCount = 0; - messenger.Register(recipient1, (r, m) => { handlerCalledCount++; }); - messenger.Register(recipient2, (r, m) => { handlerCalledCount++; }); + messenger.Register(recipient1, (r, m) => { handler1CalledCount++; }); + messenger.Register(recipient2, (r, m) => { handler2CalledCount++; }); messenger.UnregisterAll(recipient2); messenger.Send(new MessageA()); - Assert.AreEqual(1, handlerCalledCount); + Assert.AreEqual(1, handler1CalledCount); + Assert.AreEqual(0, handler2CalledCount); } public sealed class RecipientWithNoMessages