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(); }