public void TryAddRangeAddsNonExistingNewItems(int amountOfItemsToAdd)
        {
            // given
            var keyValuePairs = Enumerable.Range(0, amountOfItemsToAdd)
                .Select(i => new KeyValuePair<int, string>(i, $"#{i}"))
                .ToList();

            using (var observableDictionary = new ObservableDictionary<int, string>())
            {
                // when
                IDictionary<int, string> nonAddedKeyValuePairs;
                var tryAddResult = observableDictionary.TryAddRange(keyValuePairs, out nonAddedKeyValuePairs);

                // then check whether all items have been accounted for
                tryAddResult.Should().Be(true);

                nonAddedKeyValuePairs.Should().NotBeNull();
                nonAddedKeyValuePairs.Should().BeEmpty();

                observableDictionary.Count.Should().Be(amountOfItemsToAdd);
                foreach (var keyValuePair in keyValuePairs)
                {
                    observableDictionary.Should().Contain(keyValuePair);
                }
            }
        }
        public void TryAddRangeAddsNonExistingItemsAndReportsNonAddedBack(int amountOfInitialItems, int amountOfItemsToAdd)
        {
            // given
            var initialKeyValuePairs = Enumerable.Range(0, amountOfInitialItems)
                .Select(i => new KeyValuePair<int, string>(i, $"#{i}"))
                .ToList();

            var keyValuePairsToAdd = Enumerable.Range(0, amountOfItemsToAdd)
                .Select(i => new KeyValuePair<int, string>(i, $"#{i}"))
                .ToList();

            using (var observableDictionary = new ObservableDictionary<int, string>(initialKeyValuePairs))
            {
                // when
                IDictionary<int, string> itemsThatCouldNotBeAdded;
                var tryAddResult = observableDictionary.TryAddRange(keyValuePairsToAdd, out itemsThatCouldNotBeAdded);

                // then check whether all items have been accounted for
                tryAddResult.Should().Be(false);
                itemsThatCouldNotBeAdded.Should().NotBeNull();
                itemsThatCouldNotBeAdded.Should().NotBeEmpty();

                observableDictionary.Count.Should().Be(amountOfInitialItems + amountOfItemsToAdd - itemsThatCouldNotBeAdded.Count);

                foreach (var keyValuePair in keyValuePairsToAdd.Except(itemsThatCouldNotBeAdded))
                {
                    observableDictionary.Should().Contain(keyValuePair);
                }

                foreach (var keyValuePair in initialKeyValuePairs.Intersect(keyValuePairsToAdd))
                {
                    itemsThatCouldNotBeAdded.Should().Contain(keyValuePair);
                }
            }
        }