public void TestNoBubbling()
        {
            var o = new CollectionChangedAspectTestClass();
 
            var changeCount = 0;
            Post.Cast<CollectionChangedAspectTestClass, INotifyCollectionChanged>(o).CollectionChanged +=
                delegate { changeCount++; };
            
            o.NoBubblingIntegers.Add(5);

            Assert.AreEqual(0, changeCount);
        }
        public void BubbleEventFromContainingList()
        {
            var o = new CollectionChangedAspectTestClass();

            var changeCount = 0;
            Post.Cast<CollectionChangedAspectTestClass, INotifyCollectionChanged>(o).CollectionChanged +=
                delegate(object sender, NotifyCollectionChangedEventArgs e)
                    {
                        Assert.AreEqual(5, e.Item);
                        changeCount++;
                    };
            
            o.Integers.Add(5);

            Assert.AreEqual(1, changeCount);
        }
        public void BubblingOfCollectionChangedEventAfterObjectsListIsChanged()
        {
            var o = new CollectionChangedAspectTestClass();

            var element = new CollectionChangedAspectTestClass();
            o.ListContainers.Add(element);

            var changeCount = 0;
            Post.Cast<CollectionChangedAspectTestClass, INotifyCollectionChanged>(o).CollectionChanged +=
                delegate {
                             changeCount++;
                };

            o.ListContainers.Remove(element);

            Assert.AreEqual(1, changeCount); 
        }
        public void BubblingWorksWhenPropertyOfContainerIsResetWithAnotherEventedList()
        {
            var o = new CollectionChangedAspectTestClass();

            var oldIntegers = o.Integers;
            o.Integers = new EventedList<int>(); // <- reset list property to a new value

            var changeCount = 0;
            Post.Cast<CollectionChangedAspectTestClass, INotifyCollectionChanged>(o).CollectionChanged +=
                delegate {
                             changeCount++;
                };
         
            oldIntegers.Add(0); // <- shouldn't generate event in o anymore
            o.Integers.Add(100);

            Assert.AreEqual(1, changeCount);
        }
        public void BubblingOfCollectionChangedEventAfterListPropertyIsChanged()
        {
            var o = new CollectionChangedAspectTestClass();

            var changeCount = 0;
            Post.Cast<CollectionChangedAspectTestClass, INotifyCollectionChanged>(o).CollectionChanged +=
                delegate {
                             changeCount++;
                };

            o.Integers = new EventedList<int>();

            o.Integers.Add(1);
            Assert.AreEqual(1, changeCount);            
            
            o.Integers[0] = 11;
            Assert.AreEqual(2, changeCount);            

            o.Integers.Remove(11);
            Assert.AreEqual(3, changeCount);

            // the list is empty so add one item again and use clear to get 
            // a (single) change event notification
            o.Integers.Add(1);
            o.Integers.Clear();
            Assert.AreEqual(5, changeCount);

            // the list is empty so clear should not fire another change event
            o.Integers.Clear();
            Assert.AreEqual(5, changeCount);         
        }
        public void BubblingWorksWhenUsingEventedListsAsElementsInEventedList()
        {
            var o = new CollectionChangedAspectTestClass();

            var changeCount = 0;
            Post.Cast<CollectionChangedAspectTestClass, INotifyCollectionChanged>(o).CollectionChanged +=
                delegate {
                             changeCount++;
                };

            o.Lists.Add(new EventedList<int>(new int[] {1,2,3}));
            o.Lists[0][0] = 4;

            Assert.AreEqual(2, changeCount);
        }