public void ExceptionTest()
 {
     var collection = new ObservableCollection<int>();
     AssertThrow<ArgumentNullException>(
         () => ((ObservableCollection<int>)null).AddChangeHandlers((int i, int j) => { }, (i, j) => { }, () => { }),
         () => collection.AddChangeHandlers(null, (int i, int j) => { }, () => { }),
         () => collection.AddChangeHandlers((int i, int j) => { }, null, () => { }),
         () => collection.AddChangeHandlers((int i, int j) => { }, (i, j) => { }, null),
         () => ((ObservableCollection<int>)null).Project((int i) => i),
         () => collection.Project((Func<int, int>)null));
 }
        private void AssertChange(Action<ObservableCollection<int>> change)
        {
            var o = new ObservableCollection<int>(Enumerable.Range(0, this.Random.Next(4, 10)));
            var c = new List<int>();
            var handler = o.AddChangeHandlers(
                (int index, int item) => c.Insert(index, item), (index, item) => c.RemoveAt(index), c.Clear);
            AssertChange(o, change, c, handler);

            using (var projection = o.Project((int i) => i))
            {
                AssertChange(o, change, projection);
            }
        }