public void TestGrouping()
        {
            ObservableCollection <Item> items = new ObservableCollection <Item>(
                new Item[]
            {
                new Item(0, "0"),
                new Item(1, "0"),
                new Item(2, "2"),
                new Item(3, "3"),
                new Item(4, "3"),
                new Item(5, "3")
            });

            OcConsumer consumer = new OcConsumer();
            Grouping <Item, string> grouping =
                items.Grouping(i => i.Value).For(consumer);

            Action <Group <Item, string>, int, Item> groupingInsertItemIntoGroupRequestHandler = (group, index, item) =>
                                                                                                 items.Insert(index < @group.Count ? @group.SourceItemIndices[index] : @group.SourceItemIndices[@group.Count - 1] + 1, item);

            grouping.InsertItemIntoGroupRequestHandler = groupingInsertItemIntoGroupRequestHandler;
            Assert.IsTrue(grouping.InsertItemIntoGroupRequestHandler == groupingInsertItemIntoGroupRequestHandler);

            Action <Group <Item, string>, int> groupingRemoveItemFromGroupRequestHandler = (group, index) =>
                                                                                           items.RemoveAt(@group.SourceItemIndices[index]);

            grouping.RemoveItemFromGroupRequestHandler = groupingRemoveItemFromGroupRequestHandler;
            Assert.IsTrue(grouping.RemoveItemFromGroupRequestHandler == groupingRemoveItemFromGroupRequestHandler);

            Action <Group <Item, string>, int, int> groupingMoveItemInGroupRequestHandler = (group, oldIndex, newIndex) =>
            {
                Item item = @group[oldIndex];
                items.RemoveAt(@group.SourceItemIndices[oldIndex]);
                items.Insert(@group.SourceItemIndices[newIndex], item);
            };

            grouping.MoveItemInGroupRequestHandler = groupingMoveItemInGroupRequestHandler;
            Assert.IsTrue(grouping.MoveItemInGroupRequestHandler == groupingMoveItemInGroupRequestHandler);

            Action <Group <Item, string>, int, Item> groupingSetGroupItemRequestHandler = (group, index, item) =>
                                                                                          items[@group.SourceItemIndices[index]] = item;

            grouping.SetGroupItemRequestHandler = groupingSetGroupItemRequestHandler;
            Assert.IsTrue(grouping.SetGroupItemRequestHandler == groupingSetGroupItemRequestHandler);

            Action <Group <Item, string> > groupingClearGroupItemsRequestHandler = group =>
            {
                ReadOnlyCollection <int> groupSourceItemIndecies = @group.SourceItemIndices;
                for (int i = @group.Count - 1; i >= 0; i--)
                {
                    items.RemoveAt(groupSourceItemIndecies[i]);
                }
            };

            grouping.ClearGroupItemsRequestHandler = groupingClearGroupItemsRequestHandler;
            Assert.IsTrue(grouping.ClearGroupItemsRequestHandler == groupingClearGroupItemsRequestHandler);

            Assert.AreEqual(grouping[2].Grouping, grouping);
            Assert.AreEqual(grouping[2].Parent, grouping);
            Assert.AreEqual(grouping.GetGroup("3"), grouping[2]);

            grouping[2].Add(new Item(6, "3"));
            grouping.ValidateInternalConsistency();
            Assert.IsTrue(grouping[2].Remove(grouping[2][1]));
            grouping.ValidateInternalConsistency();
            Assert.IsFalse(grouping[2].Remove(new Item(0, "0")));
            grouping.ValidateInternalConsistency();
            grouping[2][0] = new Item(7, "3");
            grouping.ValidateInternalConsistency();
            grouping[2].Move(0, 1);
            grouping.ValidateInternalConsistency();
            grouping[2].Clear();
            grouping.ValidateInternalConsistency();
            consumer.Dispose();
        }