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