コード例 #1
0
        public void BinarySearchWithIndexFindsElementInRange(int index, int count)
        {
            var size = SampleSize;
            var old  = new T[size];
            var even = new T[size];

            for (int i = size - 1; i >= 0; i--)
            {
                // offset from 5 to get double digits so that elements are in
                // sort order of string.
                old[i] = TestData <T> .MakeData((i + 5) *2 + 1);

                even[i] = TestData <T> .MakeData((i + 5) * 2);
            }
            var min = TestData <T> .One;
            var max = TestData <T> .MakeData((size + 5) * 2);

            var sut = new CopyOnWriteList <T>(even);

            // This shoud trigger any argument exception
            Assert.That(sut.BinarySearch(index, count, min, null), Is.EqualTo(-(index + 1)));
            Assert.That(sut.BinarySearch(index, count, max, null), Is.EqualTo(-(index + count + 1)));

            for (int i = 0; i < count; i++)
            {
                var j      = index + i;
                var result = sut.BinarySearch(index, count, even[j], null);
                Assert.That(result, Is.EqualTo(j));
                result = sut.BinarySearch(index, count, old[j], null);
                Assert.That(result, Is.EqualTo(-j - 2));
            }

            sut.Reverse();

            Assert.That(sut.BinarySearch(index, count, max, _reverseComparer), Is.EqualTo(-(index + 1)));
            Assert.That(sut.BinarySearch(index, count, min, _reverseComparer), Is.EqualTo(-(index + count + 1)));

            for (int i = 0; i < count; i++)
            {
                var j      = index + i;
                var result = sut.BinarySearch(index, count, even[size - 1 - j], _reverseComparer);
                Assert.That(result, Is.EqualTo(j));
                result = sut.BinarySearch(index, count, old[size - 1 - j], _reverseComparer);
                Assert.That(result, Is.EqualTo(-j - 1));
            }
        }
コード例 #2
0
        [Test] public void BinarySearchFindsElements()
        {
            var size = SampleSize;

            T[] samples = NewPsuedoRandomSamples();
            var before  = TestData <T> .Zero;
            var after   = TestData <T> .MakeData(size);

            Array.Sort(samples);
            var sut = new CopyOnWriteList <T>(samples);

            Assert.That(sut.BinarySearch(before), Is.EqualTo(-1));
            Assert.That(sut.BinarySearch(after), Is.EqualTo(-size - 1));

            var defaultComparer = Comparer <T> .Default;

            for (int i = 0; i <= size; i++)
            {
                var item = TestData <T> .MakeData(i);

                var index = sut.BinarySearch(item);
                if (index >= 0)
                {
                    Assert.That(sut[index], Is.EqualTo(item));
                }
                else
                {
                    index = -index - 1;
                    if (index > 0)
                    {
                        Assert.That(defaultComparer.Compare(sut[index - 1], item), Is.LessThan(0));
                    }
                    if (index < size)
                    {
                        Assert.That(defaultComparer.Compare(sut[index], item), Is.GreaterThan(0));
                    }
                }
            }

            Array.Sort(samples, _reverseComparer);
            sut = new CopyOnWriteList <T>(samples);
            Assert.That(sut.BinarySearch(before, _reverseComparison), Is.EqualTo(-size - 1));
            Assert.That(sut.BinarySearch(after, _reverseComparison), Is.EqualTo(-1));

            for (int i = 0; i <= size; i++)
            {
                var item = TestData <T> .MakeData(i);

                var index = sut.BinarySearch(item, _reverseComparison);
                if (index >= 0)
                {
                    Assert.That(sut[index], Is.EqualTo(item));
                }
                else
                {
                    index = -index - 1;
                    if (index > 0)
                    {
                        Assert.That(_reverseComparison(sut[index - 1], item), Is.LessThan(0));
                    }
                    if (index < size)
                    {
                        Assert.That(_reverseComparison(sut[index], item), Is.GreaterThan(0));
                    }
                }
            }
        }