public void DefaultCollectionModificationRaisesChangeEvents()
        {
            var collection = new ItemsSourceCollection();

            // We want to test that the following methods raise the
            // PropertyChanged/CollectionChanged events.
            TestChangeEventsForAction(() => collection.Add(1));
            TestChangeEventsForAction(() =>
            {
                collection.Add(0);
                collection.Remove(0);
            });
            TestChangeEventsForAction(() =>
            {
                collection.Add(0);
                collection.RemoveAt(0);
            });
            TestChangeEventsForAction(() => collection.Clear());

            // Checks if the *Changed events are raised when executing changeAction().
            void TestChangeEventsForAction(Action changeAction)
            {
                Assert.PropertyChanged(
                    collection,
                    nameof(ItemsSourceCollection.Count),
                    changeAction);
                Assert.PropertyChanged(
                    collection,
                    "Items[]",
                    changeAction);
                AssertCollectionChanged(
                    collection,
                    changeAction);
            }
        }
        public void CanAddItemsNormally()
        {
            var collection = new ItemsSourceCollection();
            int itemToAdd  = 1;

            collection.Add(itemToAdd);
            Assert.Contains(itemToAdd, collection);
        }
        public void ProvidesItemsViaItemsSource()
        {
            var itemsSource = CreateIntItemsSource(5);
            var collection  = new ItemsSourceCollection();

            collection.ItemsSource = itemsSource;
            Assert.True(collection.Cast <int>().SequenceEqual(itemsSource));
        }
        public void CountWorksWithItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateIntItemsSource(5);

            collection.ItemsSource = itemsSource;
            Assert.Equal(itemsSource.Length, collection.Count);
        }
        public void CountWorksWithDefaultCollection()
        {
            var collection = new ItemsSourceCollection()
            {
                1, 2, 3, 4, 5
            };

            Assert.Equal(5, collection.Count);
        }
        public void IndexOfWorksWithNonEnumerableItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateNonEnumerableItemsSource();

            collection.ItemsSource = itemsSource;
            Assert.Equal(0, collection.IndexOf(itemsSource));
            Assert.Equal(-1, collection.IndexOf(new object()));
        }
        public void ContainsWorksWithNonEnumerableItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateNonEnumerableItemsSource();

            collection.ItemsSource = itemsSource;
            Assert.True(collection.Contains(itemsSource));
            Assert.False(collection.Contains(new object()));
        }
        public void IndexAccessorWorksWithDefaultCollection()
        {
            var collection = new ItemsSourceCollection();
            int itemToAdd  = 1;

            collection.Add(0); // Placeholder, so that the index exists.
            collection[0] = itemToAdd;

            Assert.Equal(itemToAdd, collection[0]);
        }
        public void ItemsSourceCanRaiseCollectionChanged()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateObservableIntItemsSource(5);

            collection.ItemsSource = itemsSource;
            AssertCollectionChanged(
                collection,
                () => itemsSource.Add(1));
        }
        public void IsUsingItemsSourceGetsSet()
        {
            var itemsSource     = CreateIntItemsSource(1);
            var emptyCollection = new ItemsSourceCollection();

            Assert.False(emptyCollection.IsUsingItemsSource);

            emptyCollection.ItemsSource = itemsSource;
            Assert.True(emptyCollection.IsUsingItemsSource);
        }
        public void CountWorksWithNonEnumerableItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateNonEnumerableItemsSource();

            collection.ItemsSource = itemsSource;

            var count = collection.Count();

            Assert.Single(collection);
        }
        public void IndexOfWorksWithItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateIntItemsSource(5);

            collection.ItemsSource = itemsSource;
            for (int i = 0; i < collection.Count; i++)
            {
                int currentItem = (int)collection[i];
                Assert.Equal(i, collection.IndexOf(currentItem));
            }
            Assert.Equal(-1, collection.IndexOf(-1));
        }
        public void CopyToWorksWithDefaultCollection()
        {
            var collection = new ItemsSourceCollection()
            {
                1, 2, 3, 4, 5
            };

            int[] dest = new int[collection.Count + 1];

            collection.CopyTo(dest, 1);
            Assert.Equal(0, dest[0]);
            Assert.True(collection.Cast <int>().SequenceEqual(dest.Skip(1)));
        }
        public void ThrowsWhenSwitchingItemsSourceInFilledCollection()
        {
            var itemsSource = CreateIntItemsSource(1);
            var collection  = new ItemsSourceCollection()
            {
                1, 2, 3
            };

            var ex = Record.Exception(() => collection.ItemsSource = itemsSource);

            Assert.NotNull(ex);
            Assert.IsType <InvalidOperationException>(ex);
        }
        public void CopyToWorksWithItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateIntItemsSource(5);

            int[] dest = new int[itemsSource.Length + 1];

            collection.ItemsSource = itemsSource;
            collection.CopyTo(dest, 1);

            Assert.Equal(0, dest[0]);
            Assert.True(collection.Cast <int>().SequenceEqual(dest.Skip(1)));
        }
        public void GetEnumeratorWorksWithItemsSource()
        {
            var         collection  = new ItemsSourceCollection();
            var         itemsSource = CreateIntItemsSource(5);
            IEnumerator collectionEnumerator;
            IEnumerator itemsEnumerator;

            collection.ItemsSource = itemsSource;
            collectionEnumerator   = collection.GetEnumerator();
            itemsEnumerator        = itemsSource.GetEnumerator();

            TestEnumeratorEquality(collectionEnumerator, itemsEnumerator);
        }
        public void CopyToWorksWithNonEnumerableItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateNonEnumerableItemsSource();
            var dest        = new object[3];

            collection.ItemsSource = itemsSource;
            collection.CopyTo(dest, 1);

            Assert.Equal(itemsSource, dest[1]);
            Assert.Null(dest[0]);
            Assert.Null(dest[2]);
        }
        public void ContainsWorksWithItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateIntItemsSource(5);

            collection.ItemsSource = itemsSource;
            for (int i = 0; i < collection.Count; i++)
            {
                int currentItem = (int)collection[i];
                Assert.True(collection.Contains(currentItem));
            }
            Assert.False(collection.Contains(-1));
        }
        public void IndexAccessorWorksWithItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateIntItemsSource(1);

            collection.ItemsSource = itemsSource;
            var firstValue = collection[0];
            var ex         = Record.Exception(() => collection[0] = 1); // Prop. should be read-only with an ItemsSource.

            Assert.Equal(firstValue, itemsSource.First());
            Assert.NotNull(ex);
            Assert.IsType <InvalidOperationException>(ex);
        }
        public void ContainsWorksWithDefaultCollection()
        {
            var collection = new ItemsSourceCollection()
            {
                1, 2, 3, 4, 5
            };

            for (int i = 0; i < collection.Count; i++)
            {
                int currentItem = (int)collection[i];
                Assert.True(collection.Contains(currentItem));
            }
            Assert.False(collection.Contains(-1));
        }
        public void IndexOfWorksWithDefaultCollection()
        {
            var collection = new ItemsSourceCollection()
            {
                1, 2, 3, 4, 5
            };

            for (int i = 0; i < collection.Count; i++)
            {
                int currentItem = (int)collection[i];
                Assert.Equal(i, collection.IndexOf(currentItem));
            }
            Assert.Equal(-1, collection.IndexOf(-1));
        }
        public void GetEnumeratorWorksWithDefaultCollection()
        {
            var         collection = new ItemsSourceCollection();
            var         items      = new int[] { 1, 2, 3, 4, 5 };
            IEnumerator collectionEnumerator;
            IEnumerator itemsEnumerator;

            foreach (var item in items)
            {
                collection.Add(item);
            }
            collectionEnumerator = collection.GetEnumerator();
            itemsEnumerator      = items.GetEnumerator();

            TestEnumeratorEquality(collectionEnumerator, itemsEnumerator);
        }
        public void IndexAccessorWorksWithNonEnumerableItemsSource()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateNonEnumerableItemsSource();

            collection.ItemsSource = itemsSource;
            var retrievedValue = collection[0];
            var outOfRangeEx   = Record.Exception(() => collection[1]);
            var readOnlyEx     = Record.Exception(() => collection[0] = "Unsettable");

            Assert.Same(itemsSource, retrievedValue);
            Assert.NotNull(outOfRangeEx);
            Assert.IsType <IndexOutOfRangeException>(outOfRangeEx);
            Assert.NotNull(readOnlyEx);
            Assert.IsType <InvalidOperationException>(readOnlyEx);
        }
        public void SwitchingToNonEnumerableItemsSourceRaisesChangeEvents()
        {
            var collection  = new ItemsSourceCollection();
            var itemsSource = CreateNonEnumerableItemsSource();

            AssertCollectionChanged(
                collection,
                () => collection.ItemsSource = itemsSource);
            AssertPropertiesChanged(
                collection,
                () => collection.ItemsSource = itemsSource,
                nameof(ItemsSourceCollection.ItemsSource),
                nameof(ItemsSourceCollection.IsUsingItemsSource),
                nameof(ItemsSourceCollection.IsReadOnly),
                nameof(ItemsSourceCollection.IsFixedSize),
                nameof(ItemsSourceCollection.SyncRoot));
        }
        public void ThrowsWhenModifyingCollectionWithItemsSource()
        {
            var itemsSource = CreateIntItemsSource(5);
            var collection  = new ItemsSourceCollection();

            collection.ItemsSource = itemsSource;
            TestForMethod(() => collection.Add(0));
            TestForMethod(() => collection.Remove(0));
            TestForMethod(() => collection.RemoveAt(0));
            TestForMethod(() => collection.Clear());
            Assert.True(collection.Cast <int>().SequenceEqual(itemsSource));

            void TestForMethod(Action method)
            {
                var ex = Record.Exception(method);

                Assert.NotNull(ex);
                Assert.IsType <InvalidOperationException>(ex);
            }
        }
        public void GetEnumeratorWorksWithNonEnumerableItemsSource()
        {
            var         collection  = new ItemsSourceCollection();
            var         itemsSource = CreateNonEnumerableItemsSource();
            IEnumerator enumerator;

            collection.ItemsSource = itemsSource;
            enumerator             = collection.GetEnumerator();

            var enumerationNotStartedEx = Record.Exception(() => enumerator.Current);

            Assert.IsType <InvalidOperationException>(enumerationNotStartedEx);

            Assert.True(enumerator.MoveNext());
            Assert.Same(itemsSource, enumerator.Current);

            Assert.False(enumerator.MoveNext());
            var enumerationStoppedEx = Record.Exception(() => enumerator.Current);

            Assert.IsType <InvalidOperationException>(enumerationStoppedEx);
        }