using System; using Developpez.Dotnet.Windows.Service; using NUnit.Framework; namespace Developpez.Dotnet.Windows.Tests.Service { [TestFixture] public class MediatorTests { [Test] public void Test_Mediator() { bool foo1Received = false; bool foo2Received = false; Foo foo1 = new Foo(m => foo1Received = true); Foo foo2 = new Foo(m => foo2Received = true); foo1.SendMessage("Hello"); Assert.AreEqual(false, foo1Received); Assert.AreEqual(true, foo2Received); foo1Received = false; foo2Received = false; foo2.SendMessage("World"); Assert.AreEqual(true, foo1Received); Assert.AreEqual(false, foo2Received); foo1Received = false; foo2Received = false; Mediator.Instance.Post(this, new Message("42")); Assert.AreEqual(true, foo1Received); Assert.AreEqual(true, foo2Received); foo1Received = false; foo2Received = false; foo1 = null; GC.Collect(); Mediator.Instance.Post(this, new Message("42")); // foo1 should have been collected, so it shouldn't receive the message Assert.AreEqual(false, foo1Received); Assert.AreEqual(true, foo2Received); // Prevent premature garbage collection of foo2 GC.KeepAlive(foo2); } class Foo { public Foo(Action receiveAction) { _receiveAction = receiveAction; Mediator.Instance.Subscribe(ReceiveMessage); } private readonly Action _receiveAction; public void SendMessage(string text) { Mediator.Instance.Post(this, new Message(text)); } private void ReceiveMessage(object sender, Message m) { if (sender != this) { _receiveAction(m); } } } class Message { public Message(string text) { this.Text = text; } public string Text { get; private set; } } } }