public void ElementAtOrDefault_WhenGroupDoesNotExist_ShouldReturnDefaultValue()
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            groupedCollection.AddGroup("A", 23);

            var result = groupedCollection.ElementAtOrDefault("I do not exist", 0);

            result.Should().Be(0);
        }
        public void ElementAt_WhenGroupDoesNotExist_ShouldThrow()
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            groupedCollection.AddGroup("A", 23);

            Action action = () => groupedCollection.ElementAt("I do not exist", 0);

            action.Should().Throw <InvalidOperationException>();
        }
        public void FirstOrDefault_WhenGroupDoesNotExist_ShouldReturnNull()
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            groupedCollection.AddGroup("A", 23);

            var result = groupedCollection.FirstOrDefault("I do not exist");

            result.Should().BeNull();
        }
        public void RemoveGroup_WhenSeveralGroupsExist_ShouldRemoveFirstGroup()
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            groupedCollection.AddGroup("A", 1, 2, 3);
            groupedCollection.AddGroup("B", 4, 5, 6);
            groupedCollection.AddGroup("B", 7, 8);

            groupedCollection.RemoveGroup("B");

            groupedCollection.Should().HaveCount(2);
            groupedCollection.ElementAt(0).Key.Should().Be("A");
            groupedCollection.ElementAt(0).Should().HaveCount(3);
            groupedCollection.ElementAt(0).Should().ContainInOrder(1, 2, 3);

            groupedCollection.ElementAt(1).Key.Should().Be("B");
            groupedCollection.ElementAt(1).Should().HaveCount(2);
            groupedCollection.ElementAt(1).Should().ContainInOrder(7, 8);
        }
        public void SetItem_WhenIndexOutOfRange_ShoudThrow(int index)
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            groupedCollection.AddGroup("A", 1, 2, 3);

            Action action = () => groupedCollection.SetItem("A", index, 23);

            action.Should().Throw <ArgumentOutOfRangeException>();
        }
        public void InsertItem_WhenGroupDoesNotExist_ShoudThrow()
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            groupedCollection.AddGroup("A", 1, 2, 3);

            Action action = () => groupedCollection.InsertItem("I do not exist", 0, 23);

            action.Should().Throw <InvalidOperationException>();
        }
        public void RemoveItem_WhenRemovingLastItem_ShouldRemoveGroupIfRequired(bool removeGroupIfEmpty, bool expectGroupRemoved)
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            groupedCollection.AddGroup("A", 1, 2, 3);
            groupedCollection.AddGroup("B", 4);

            groupedCollection.RemoveItem("B", 4, removeGroupIfEmpty);

            groupedCollection.Should().HaveCount(expectGroupRemoved ? 1 : 2);
            groupedCollection.ElementAt(0).Key.Should().Be("A");
            groupedCollection.ElementAt(0).Should().HaveCount(3);
            groupedCollection.ElementAt(0).Should().ContainInOrder(1, 2, 3);

            if (!expectGroupRemoved)
            {
                groupedCollection.ElementAt(1).Key.Should().Be("B");
                groupedCollection.ElementAt(1).Should().BeEmpty();
            }
        }
        public void RemoveGroup_WhenGroupDoesNotExists_ShouldDoNothing()
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            groupedCollection.AddGroup("A", 1, 2, 3);

            groupedCollection.RemoveGroup("I do not exist");

            groupedCollection.Should().ContainSingle();
            groupedCollection.ElementAt(0).Key.Should().Be("A");
            groupedCollection.ElementAt(0).Should().HaveCount(3);
            groupedCollection.ElementAt(0).Should().ContainInOrder(1, 2, 3);
        }
        public void AddGroup_WithParamsCollection_ShouldAddGroup()
        {
            var groupedCollection = new ObservableGroupedCollection <string, int>();

            var addedGroup = groupedCollection.AddGroup("new key", 23, 10, 42);

            addedGroup.Should().NotBeNull();
            addedGroup.Key.Should().Be("new key");
            addedGroup.Should().HaveCount(3);
            addedGroup.Should().ContainInOrder(23, 10, 42);

            groupedCollection.Should().ContainSingle();
            groupedCollection.Should().HaveElementAt(0, addedGroup);
        }