# HG changeset patch # User Steven Robbins # Date 1268589033 0 # Branch messenger # Node ID a767d2a87f0f8e5fffff9f3e8148fa3404c8a73f # Parent 4a3e11ca644d49e8c0b96f8f851c657c075c426f Added basic generic cancellable message type diff -r 4a3e11ca644d49e8c0b96f8f851c657c075c426f -r a767d2a87f0f8e5fffff9f3e8148fa3404c8a73f TinyIoC.Tests/TinyMessengerTests.cs --- a/TinyIoC.Tests/TinyMessengerTests.cs Sun Mar 14 17:31:56 2010 +0000 +++ b/TinyIoC.Tests/TinyMessengerTests.cs Sun Mar 14 17:50:33 2010 +0000 @@ -277,7 +277,7 @@ { var messenger = UtilityMethods.GetMessenger(); var output = string.Empty; - messenger.Subscribe>((m) => { output = m._Content; }); + messenger.Subscribe>((m) => { output = m.Content; }); } [TestMethod] @@ -292,7 +292,7 @@ { var messenger = UtilityMethods.GetMessenger(); var output = string.Empty; - messenger.Subscribe>((m) => { output = m._Content; }); + messenger.Subscribe>((m) => { output = m.Content; }); messenger.Publish(new GenericTinyMessage(this, "Testing")); Assert.AreEqual("Testing", output); @@ -381,5 +381,45 @@ Assert.IsTrue(received); } + [TestMethod] + public void CancellableGenericTinyMessage_Publish_DoesNotThrow() + { + var messenger = UtilityMethods.GetMessenger(); + messenger.Publish>(new CancellableGenericTinyMessage(this, "Testing", () => { bool test = true; })); + } + + [TestMethod] + [ExpectedException(typeof(ArgumentNullException))] + public void CancellableGenericTinyMessage_PublishWithNullAction_Throws() + { + var messenger = UtilityMethods.GetMessenger(); + messenger.Publish>(new CancellableGenericTinyMessage(this, "Testing", null)); + } + + [TestMethod] + public void CancellableGenericTinyMessage_SubscriberCancels_CancelActioned() + { + var messenger = UtilityMethods.GetMessenger(); + bool cancelled = false; + messenger.Subscribe>((m) => { m.Cancel(); }); + + messenger.Publish>(new CancellableGenericTinyMessage(this, "Testing", () => { cancelled = true; })); + + Assert.IsTrue(cancelled); + } + + [TestMethod] + public void CancellableGenericTinyMessage_SeveralSubscribersOneCancels_CancelActioned() + { + var messenger = UtilityMethods.GetMessenger(); + bool cancelled = false; + messenger.Subscribe>((m) => { var test = 1; }); + messenger.Subscribe>((m) => { m.Cancel(); }); + messenger.Subscribe>((m) => { var test = 1; }); + + messenger.Publish>(new CancellableGenericTinyMessage(this, "Testing", () => { cancelled = true; })); + + Assert.IsTrue(cancelled); + } } } \ No newline at end of file diff -r 4a3e11ca644d49e8c0b96f8f851c657c075c426f -r a767d2a87f0f8e5fffff9f3e8148fa3404c8a73f TinyIoC/TinyMessenger.cs --- a/TinyIoC/TinyMessenger.cs Sun Mar 14 17:31:56 2010 +0000 +++ b/TinyIoC/TinyMessenger.cs Sun Mar 14 17:50:33 2010 +0000 @@ -65,13 +65,13 @@ /// /// Generic message with user specified content /// - /// Content to store + /// Content type to store public class GenericTinyMessage : TinyMessageBase { /// /// Contents of the message /// - public TContent _Content { get; protected set; } + public TContent Content { get; protected set; } /// /// Create a new instance of the GenericTinyMessage class. @@ -81,7 +81,40 @@ public GenericTinyMessage(object sender, TContent content) : base(sender) { - _Content = content; + Content = content; + } + } + + /// + /// Basic "cancellable" generic message + /// + /// Content type to store + public class CancellableGenericTinyMessage : TinyMessageBase + { + /// + /// Cancel action + /// + public Action Cancel { get; protected set; } + + /// + /// Contents of the message + /// + public TContent Content { get; protected set; } + + /// + /// Create a new instance of the CancellableGenericTinyMessage class. + /// + /// Message sender (usually "this") + /// Contents of the message + /// Action to call for cancellation + public CancellableGenericTinyMessage(object sender, TContent content, Action cancelAction) + : base(sender) + { + if (cancelAction == null) + throw new ArgumentNullException("cancelAction"); + + Content = content; + Cancel = cancelAction; } }