diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2016-08-10 05:51:33 -0600 |
---|---|---|
committer | Stephane Delcroix <stephane@delcroix.org> | 2016-08-10 13:51:33 +0200 |
commit | 1823c1ad1463aa30deb289bc9538a68a5316164b (patch) | |
tree | 1bfde6ef72b26311f728f507f750b5961483dec2 /Xamarin.Forms.Core.UnitTests | |
parent | 43e90a38840600a2556be38cc331de4a0d948834 (diff) | |
download | xamarin-forms-1823c1ad1463aa30deb289bc9538a68a5316164b.tar.gz xamarin-forms-1823c1ad1463aa30deb289bc9538a68a5316164b.tar.bz2 xamarin-forms-1823c1ad1463aa30deb289bc9538a68a5316164b.zip |
Unit tests for the PCL WeakEventManager (#280)
Diffstat (limited to 'Xamarin.Forms.Core.UnitTests')
-rw-r--r-- | Xamarin.Forms.Core.UnitTests/WeakEventManagerTests.cs | 189 | ||||
-rw-r--r-- | Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj | 1 |
2 files changed, 190 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/WeakEventManagerTests.cs b/Xamarin.Forms.Core.UnitTests/WeakEventManagerTests.cs new file mode 100644 index 00000000..8300613a --- /dev/null +++ b/Xamarin.Forms.Core.UnitTests/WeakEventManagerTests.cs @@ -0,0 +1,189 @@ +using System; +using NUnit.Framework; + +namespace Xamarin.Forms.Core.UnitTests +{ + [TestFixture] + public class WeakEventManagerTests + { + static int s_count; + + static void Handler(object sender, EventArgs eventArgs) + { + s_count++; + } + + internal class TestEventSource + { + readonly WeakEventManager _weakEventManager; + + public TestEventSource() + { + _weakEventManager = new WeakEventManager(); + } + + public void FireTestEvent() + { + OnTestEvent(); + } + + internal event EventHandler TestEvent + { + add { _weakEventManager.AddEventHandler(nameof(TestEvent), value); } + remove { _weakEventManager.RemoveEventHandler(nameof(TestEvent), value); } + } + + void OnTestEvent() + { + _weakEventManager.HandleEvent(this, EventArgs.Empty, nameof(TestEvent)); + } + } + + internal class TestSubscriber + { + public void Subscribe(TestEventSource source) + { + source.TestEvent += SourceOnTestEvent; + } + + void SourceOnTestEvent(object sender, EventArgs eventArgs) + { + Assert.Fail(); + } + } + + [Test] + public void AddHandlerWithEmptyEventNameThrowsException() + { + var wem = new WeakEventManager(); + Assert.Throws<ArgumentNullException>(() => wem.AddEventHandler("", (sender, args) => { })); + } + + [Test] + public void AddHandlerWithNullEventHandlerThrowsException() + { + var wem = new WeakEventManager(); + Assert.Throws<ArgumentNullException>(() => wem.AddEventHandler("test", null)); + } + + [Test] + public void AddHandlerWithNullEventNameThrowsException() + { + var wem = new WeakEventManager(); + Assert.Throws<ArgumentNullException>(() => wem.AddEventHandler(null, (sender, args) => { })); + } + + [Test] + public void CanRemoveStaticEventHandler() + { + int beforeRun = s_count; + + var source = new TestEventSource(); + source.TestEvent += Handler; + source.TestEvent -= Handler; + + source.FireTestEvent(); + + Assert.IsTrue(s_count == beforeRun); + } + + [Test] + public void EventHandlerCalled() + { + var called = false; + + var source = new TestEventSource(); + source.TestEvent += (sender, args) => { called = true; }; + + source.FireTestEvent(); + + Assert.IsTrue(called); + } + + [Test] + public void FiringEventWithoutHandlerShouldNotThrow() + { + var source = new TestEventSource(); + source.FireTestEvent(); + } + + [Test] + public void MultipleHandlersCalled() + { + var called1 = false; + var called2 = false; + + var source = new TestEventSource(); + source.TestEvent += (sender, args) => { called1 = true; }; + source.TestEvent += (sender, args) => { called2 = true; }; + source.FireTestEvent(); + + Assert.IsTrue(called1 && called2); + } + + [Test] + public void RemoveHandlerWithEmptyEventNameThrowsException() + { + var wem = new WeakEventManager(); + Assert.Throws<ArgumentNullException>(() => wem.RemoveEventHandler("", (sender, args) => { })); + } + + [Test] + public void RemoveHandlerWithNullEventHandlerThrowsException() + { + var wem = new WeakEventManager(); + Assert.Throws<ArgumentNullException>(() => wem.RemoveEventHandler("test", null)); + } + + [Test] + public void RemoveHandlerWithNullEventNameThrowsException() + { + var wem = new WeakEventManager(); + Assert.Throws<ArgumentNullException>(() => wem.RemoveEventHandler(null, (sender, args) => { })); + } + + [Test] + public void RemovingNonExistentHandlersShouldNotThrow() + { + var wem = new WeakEventManager(); + wem.RemoveEventHandler("fake", (sender, args) => { }); + wem.RemoveEventHandler("alsofake", Handler); + } + + [Test] + public void StaticHandlerShouldRun() + { + int beforeRun = s_count; + + var source = new TestEventSource(); + source.TestEvent += Handler; + + source.FireTestEvent(); + + Assert.IsTrue(s_count > beforeRun); + } + + [Test] + public void VerifySubscriberCanBeCollected() + { + WeakReference wr = null; + var source = new TestEventSource(); + new Action(() => + { + var ts = new TestSubscriber(); + wr = new WeakReference(ts); + ts.Subscribe(source); + })(); + + GC.Collect(); + GC.WaitForPendingFinalizers(); + + Assert.IsNotNull(wr); + Assert.IsFalse(wr.IsAlive); + + // The handler for this calls Assert.Fail, so if the subscriber has not been collected + // the handler will be called and the test will fail + source.FireTestEvent(); + } + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj b/Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj index 27fc07ee..4eae5d53 100644 --- a/Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj +++ b/Xamarin.Forms.Core.UnitTests/Xamarin.Forms.Core.UnitTests.csproj @@ -152,6 +152,7 @@ <Compile Include="TypeUnitTests.cs" /> <Compile Include="ViewCellTests.cs" /> <Compile Include="ViewUnitTests.cs" /> + <Compile Include="WeakEventManagerTests.cs" /> <Compile Include="WebViewUnitTests.cs" /> <Compile Include="ImageSourceTests.cs" /> <Compile Include="DataTemplateTests.cs" /> |