using System; using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; namespace Chernobyl.Collections.Generic.Event { [TestFixture, Description("Tests for SelectManyEventEnumerable type.")] public class SelectManyEventEnumerableTests : EnumerationTests { public SelectManyEventEnumerableTests() : base(false) {} //------------------------------------------------------------------ // Constructor Tests //------------------------------------------------------------------ [Test, Description("Ensures the SelectManyEventEnumerable(" + "IEventEnumerable, Func>) " + "constructor throws an ArgumentNullException if the first argument is null.")] public void ConstructorFirstArgumentNullException() { Assert.Throws(() => CreateSelectManyEventEnumerable(null, tester => tester.Items)); } [Test, Description("Ensures the SelectManyEventEnumerable(" + "IEventEnumerable, Func>) " + "constructor throws an ArgumentNullException if the second argument is null.")] public void ConstructorSecondArgumentNullException() { var source = new DecoratingEventList(); Assert.Throws(() => CreateSelectManyEventEnumerable(source, null)); } //------------------------------------------------------------------ // IEventEnumerable.ItemsAdded Tests //------------------------------------------------------------------ [Test, Description("Ensures the IEventEnumerable.ItemsAdded event " + "is raised with the proper event data when a TSource containing a " + "TResult is added.")] public void ItemsAddedEventRaisedWhenFilledSourceAdded() { DecoratingEventList testers = new DecoratingEventList(); const int firstItem = 1; const int secondItem = 2; SelectManyEventEnumerable enumerable = CreateSelectManyEventEnumerable(testers, tester => tester.Items); enumerable.ItemsAdded += (sender, e) => { Assert.AreEqual(2, e.Items.Count(), "unexpected number of items added."); Assert.AreEqual(firstItem, e.Items.ElementAt(0), "first item was an unexpected value."); Assert.AreEqual(secondItem, e.Items.ElementAt(1), "second item was an unexpected value."); Assert.Pass(); }; testers.Add(new Tester(firstItem, secondItem)); Assert.Fail("IEventEnumerable.ItemsAdded was not raised"); } [Test, Description("Ensures the IEventEnumerable.ItemsAdded event " + "is raised with the proper event data when a TResult is added.")] public void ItemsAddedEventRaisedWhenResultAdded() { DecoratingEventList testers = new DecoratingEventList(); Tester postTester = new Tester(); testers.Add(postTester); const int firstItem = 1; SelectManyEventEnumerable enumerable = CreateSelectManyEventEnumerable(testers, tester => tester.Items); enumerable.ItemsAdded += (sender, e) => { Assert.AreEqual(1, e.Items.Count(), "unexpected number of items added."); Assert.AreEqual(firstItem, e.Items.ElementAt(0), "first item was an unexpected value."); Assert.Pass(); }; postTester.Items.Add(firstItem); Assert.Fail("IEventEnumerable.ItemsAdded was not raised"); } [Test, Description("Ensures the IEventEnumerable.ItemsAdded event " + "is not raised when an empty TSource is added.")] public void ItemsAddedEventNotRaisedWhenEmptySourceAdded() { DecoratingEventList testers = new DecoratingEventList(); SelectManyEventEnumerable enumerable = CreateSelectManyEventEnumerable(testers, tester => tester.Items); enumerable.ItemsAdded += (sender, e) => Assert.Fail("IEventEnumerable.ItemsAdded was raised"); testers.Add(new Tester()); Assert.Pass(); } //------------------------------------------------------------------ // IEventEnumerable.ItemsRemoved Tests //------------------------------------------------------------------ [Test, Description("Ensures the IEventEnumerable.ItemsRemoved event " + "is raised with the proper event data when a TSource containing a " + "TResult is removed.")] public void ItemsRemovedEventRaisedWhenFilledSourceRemoved() { DecoratingEventList testers = new DecoratingEventList(); const int item = 1; Tester postTester = new Tester(item); testers.Add(postTester); SelectManyEventEnumerable enumerable = CreateSelectManyEventEnumerable(testers, tester => tester.Items); enumerable.ItemsRemoved += (sender, e) => { Assert.AreEqual(1, e.Items.Count(), "unexpected number of items removed."); Assert.AreEqual(item, e.Items.ElementAt(0), "first item was an unexpected value."); Assert.Pass(); }; testers.Remove(postTester); Assert.Fail("IEventEnumerable.ItemsRemoved was not raised"); } [Test, Description("Ensures the IEventEnumerable.ItemsRemoved event " + "is raised with the proper event data when a TResult is removed.")] public void ItemsRemovedEventRaisedWhenResultRemoved() { DecoratingEventList testers = new DecoratingEventList(); const int item = 1; Tester postTester = new Tester(item); testers.Add(postTester); SelectManyEventEnumerable enumerable = CreateSelectManyEventEnumerable(testers, tester => tester.Items); enumerable.ItemsRemoved += (sender, e) => { Assert.AreEqual(1, e.Items.Count(), "unexpected number of items removed."); Assert.AreEqual(item, e.Items.ElementAt(0), "first item was an unexpected value."); Assert.Pass(); }; postTester.Items.Remove(item); Assert.Fail("IEventEnumerable.ItemsRemoved was not raised"); } [Test, Description("Ensures the IEventEnumerable.ItemsRemoved event " + "is not raised when an empty TSource.")] public void ItemsRemovedEventNotRaisedWhenEmptySourceRemoved() { DecoratingEventList testers = new DecoratingEventList(); Tester postTester = new Tester(); testers.Add(postTester); SelectManyEventEnumerable enumerable = CreateSelectManyEventEnumerable(testers, tester => tester.Items); enumerable.ItemsRemoved += (sender, e) => Assert.Fail("IEventEnumerable.ItemsRemoved was raised"); testers.Remove(postTester); Assert.Pass(); } /// /// Creates the instance to be tested. This method should never return /// the same instance twice. /// /// A sequence of values to project. /// A transform function to apply to each element. protected virtual SelectManyEventEnumerable CreateSelectManyEventEnumerable(IEventEnumerable source, Func> selector) { return new SelectManyEventEnumerable(source, selector); } protected override IEnumerable CreateSingleItemEnumerable() { DecoratingEventList testers = new DecoratingEventList(); testers.Add(new Tester()); testers.Add(new Tester(1)); return CreateSelectManyEventEnumerable(testers, tester => tester.Items); } protected override IEnumerable CreateManyItemEnumerable() { DecoratingEventList testers = new DecoratingEventList(); // Test for sources added prior to being given to the // SelectManyEventEnumerable testers.Add(new Tester()); testers.Add(new Tester(1)); SelectManyEventEnumerable enumerable = CreateSelectManyEventEnumerable(testers, tester => tester.Items); // Test for sources added after to being given to the // SelectManyEventEnumerable testers.Add(new Tester(2, 3)); testers.Add(new Tester()); // Test for results added after being given to the // SelectManyEventEnumerable Tester postTester = new Tester(); testers.Add(postTester); postTester.Items.Add(4); postTester.Items.Add(5); return enumerable; } /// /// A utility type to help test the /// /// protected class Tester { public Tester(params int[] items) { Items = new DecoratingEventList(new List(items)); } public DecoratingEventList Items { get; private set; } } } }