public void TestDiffSorted()
        {
            var random = new Random(42);
            var left   = Enumerable.Range(1, 10000).Select(_ => random.Next(1000)).OrderBy(v => v).ToList();
            var right  = Enumerable.Range(1, 10000).Select(_ => random.Next(1000)).OrderBy(v => v).ToList();

            var leftSet  = left.ToHashSet();
            var rightSet = right.ToHashSet();

            var diff = NuCacheCollectionUtilities.DistinctDiffSorted(left, right, item => item);

            foreach (var diffValue in diff)
            {
                switch (diffValue.mode)
                {
                case MergeMode.LeftOnly:
                    leftSet.Should().Contain(diffValue.item);
                    leftSet.Remove(diffValue.item);
                    rightSet.Should().NotContain(diffValue.item);
                    break;

                case MergeMode.RightOnly:
                    leftSet.Contains(diffValue.item).Should().BeFalse();
                    rightSet.Contains(diffValue.item).Should().BeTrue();
                    rightSet.Remove(diffValue.item);
                    break;

                case MergeMode.Both:
                    Assert.True(false, "DistinctDiffSorted should never return an entry which existed in both sequences");
                    break;
                }
            }

            leftSet.Should().BeEquivalentTo(rightSet, "Diff operation should select out all elements which are different in sets");
        }
        public void TestDiffSortedSimple()
        {
            var left  = new[] { 1, 1, 3 };
            var right = new[] { 1, 2 };;

            var leftSet  = left.ToHashSet();
            var rightSet = right.ToHashSet();

            var diff = NuCacheCollectionUtilities.DistinctDiffSorted(left, right, item => item);

            foreach (var diffValue in diff)
            {
                switch (diffValue.mode)
                {
                case MergeMode.LeftOnly:
                    leftSet.Should().Contain(diffValue.item);
                    leftSet.Remove(diffValue.item);
                    rightSet.Should().NotContain(diffValue.item);
                    break;

                case MergeMode.RightOnly:
                    leftSet.Contains(diffValue.item).Should().BeFalse();
                    rightSet.Contains(diffValue.item).Should().BeTrue();
                    rightSet.Remove(diffValue.item);
                    break;

                case MergeMode.Both:
                    Assert.True(false, "DistinctDiffSorted should never return an entry which existed in both sequences");
                    break;
                }
            }

            leftSet.Should().BeEquivalentTo(rightSet, "Diff operation should select out all elements which are different in sets");
        }
        public void TestMergeOrdered()
        {
            var arr1 = new int[] { 1, 3, 4, 6, 7, 8 };
            var arr2 = new int[] { 2, 5, 9, 10, 11 };

            var merged = NuCacheCollectionUtilities.MergeOrdered(arr1, arr2, Comparer <int> .Default).ToList();
            var i      = 1;

            merged.Count.Should().Be(11);
            foreach (var element in merged)
            {
                element.Should().Be(i++);
            }
        }
        public void FailureCase()
        {
            var dbContent = ParseHashes("VSO0:FB44D8C99280FFFCD6EC, VSO0:FB6011BC323115781A81, VSO0:FCCB064D560546A696B8, VSO0:FD55A681BBD094EE89E5, VSO0:FD6B504B5C87D0897CF3, VSO0:FF01B6D6974216D95256, VSO0:FF63CAE2F503EFE65EE4, VSO0:FFACE149FE72F0E13C43, VSO0:FFBF66FD3A982FE6FDA1");

            var localContent = ParseHashes("VSO0:FE963E1333065A834D00");

            var diff = NuCacheCollectionUtilities.DistinctDiffSorted(localContent, dbContent, item => item);

            var left  = localContent;
            var right = dbContent;

            var leftSet  = left.ToHashSet();
            var rightSet = right.ToHashSet();

            foreach (var diffValue in diff)
            {
                switch (diffValue.mode)
                {
                case MergeMode.LeftOnly:
                    leftSet.Should().Contain(diffValue.item);
                    leftSet.Remove(diffValue.item);
                    rightSet.Should().NotContain(diffValue.item);
                    break;

                case MergeMode.RightOnly:
                    leftSet.Contains(diffValue.item).Should().BeFalse();
                    rightSet.Contains(diffValue.item).Should().BeTrue();
                    rightSet.Remove(diffValue.item);
                    break;

                case MergeMode.Both:
                    Assert.True(false, "DistinctDiffSorted should never return an entry which existed in both sequences");
                    break;
                }
            }

            leftSet.Should().BeEquivalentTo(rightSet, "Diff operation should select out all elements which are different in sets");
        }