Add binarySearchFloor() for LongArrays

PiperOrigin-RevId: 291397882
This commit is contained in:
kimvde 2020-01-24 18:33:36 +00:00 committed by Andrew Lewis
parent 7b05f3384d
commit accbc5bba5
2 changed files with 542 additions and 128 deletions

View File

@ -834,6 +834,47 @@ public final class Util {
return stayInBounds ? Math.max(0, index) : index; return stayInBounds ? Math.max(0, index) : index;
} }
/**
* Returns the index of the largest element in {@code longArray} that is less than (or optionally
* equal to) a specified {@code value}.
*
* <p>The search is performed using a binary search algorithm, so the array must be sorted. If the
* array contains multiple elements equal to {@code value} and {@code inclusive} is true, the
* index of the first one will be returned.
*
* @param longArray The array to search.
* @param value The value being searched for.
* @param inclusive If the value is present in the array, whether to return the corresponding
* index. If false then the returned index corresponds to the largest element strictly less
* than the value.
* @param stayInBounds If true, then 0 will be returned in the case that the value is smaller than
* the smallest element in the array. If false then -1 will be returned.
* @return The index of the largest element in {@code array} that is less than (or optionally
* equal to) {@code value}.
*/
public static int binarySearchFloor(
LongArray longArray, long value, boolean inclusive, boolean stayInBounds) {
int lowIndex = 0;
int highIndex = longArray.size() - 1;
while (lowIndex <= highIndex) {
int midIndex = (lowIndex + highIndex) >>> 1;
if (longArray.get(midIndex) < value) {
lowIndex = midIndex + 1;
} else {
highIndex = midIndex - 1;
}
}
if (inclusive && highIndex + 1 < longArray.size() && longArray.get(highIndex + 1) == value) {
highIndex++;
} else if (stayInBounds && highIndex == -1) {
highIndex = 0;
}
return highIndex;
}
/** /**
* Returns the index of the smallest element in {@code array} that is greater than (or optionally * Returns the index of the smallest element in {@code array} that is greater than (or optionally
* equal to) a specified {@code value}. * equal to) a specified {@code value}.

View File

@ -29,7 +29,6 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.testutil.TestUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.zip.Deflater; import java.util.zip.Deflater;
import org.junit.Test; import org.junit.Test;
@ -89,222 +88,596 @@ public class UtilTest {
} }
@Test @Test
public void testArrayBinarySearchFloor_emptyArray() { public void arrayBinarySearchFloor_emptyArrayAndStayInBoundsFalse_returnsMinus1() {
long[] array = new long[0]; assertThat(
int target = 0; binarySearchFloor(
new int[0], /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ false))
assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(-1); .isEqualTo(-1);
assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
@Test
public void arrayBinarySearchFloor_emptyArrayAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new int[0], /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(0); .isEqualTo(0);
} }
@Test @Test
public void testArrayBinarySearchFloor_targetSmallerThanArrayValues() { public void arrayBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsFalse_returnsMinus1() {
long[] array = new long[] {1, 3, 5}; assertThat(
int target = 0; binarySearchFloor(
new int[] {1, 3, 5},
assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) /* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1); .isEqualTo(-1);
assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
@Test
public void arrayBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new int[] {1, 3, 5},
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0); .isEqualTo(0);
} }
@Test @Test
public void testArrayBinarySearchFloor_targetBiggerThanArrayValues() { public void arrayBinarySearchFloor_targetBiggerThanValues_returnsLastIndex() {
long[] array = new long[] {1, 3, 5}; assertThat(
int target = 6; binarySearchFloor(
new int[] {1, 3, 5},
assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) /* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2); .isEqualTo(2);
} }
@Test @Test
public void testArrayBinarySearchFloor_targetInArray() { public void
long[] array = new long[] {1, 1, 1, 1, 1, 3, 5}; arrayBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsFalse_returnsMinus1() {
int target = 1; assertThat(
binarySearchFloor(
assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1); .isEqualTo(-1);
assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
.isEqualTo(0);
assertThat(binarySearchFloor(array, target, /* inclusive= */ true, /* stayInBounds= */ false)) @Test
public void
arrayBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0); .isEqualTo(0);
} }
@Test @Test
public void testArrayBinarySearchFloor_targetBetweenArrayValues() { public void
long[] array = new long[] {1, 1, 1, 1, 1, 3, 5}; arrayBinarySearchFloor_targetInArrayAndInclusiveTrue_returnsFirstIndexWithValueEqualToTarget() {
int target = 2; assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 1,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(0);
}
assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) @Test
.isEqualTo(4); public void
assertThat(binarySearchFloor(array, target, /* inclusive= */ true, /* stayInBounds= */ false)) arrayBinarySearchFloor_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 2,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(4); .isEqualTo(4);
} }
@Test @Test
public void testListBinarySearchFloor_emptyList() { public void
List<Integer> list = Arrays.asList(1, 3, 5); arrayBinarySearchFloor_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
int target = 0; assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 2,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(4);
}
assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) @Test
public void longArrayBinarySearchFloor_emptyArrayAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
new LongArray(), /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(-1); .isEqualTo(-1);
assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
@Test
public void longArrayBinarySearchFloor_emptyArrayAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new LongArray(), /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(0); .isEqualTo(0);
} }
@Test @Test
public void testListBinarySearchFloor_targetSmallerThanListValues() { public void
List<Integer> list = Arrays.asList(1, 3, 5); longArrayBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsFalse_returnsMinus1() {
int target = 0; LongArray longArray = new LongArray();
longArray.add(1);
longArray.add(3);
longArray.add(5);
assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) assertThat(
binarySearchFloor(
longArray, /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(-1); .isEqualTo(-1);
assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
@Test
public void longArrayBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsTrue_returns0() {
LongArray longArray = new LongArray();
longArray.add(1);
longArray.add(3);
longArray.add(5);
assertThat(
binarySearchFloor(
longArray, /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(0); .isEqualTo(0);
} }
@Test @Test
public void testListBinarySearchFloor_targetBiggerThanListValues() { public void longArrayBinarySearchFloor_targetBiggerThanValues_returnsLastIndex() {
List<Integer> list = Arrays.asList(1, 3, 5); LongArray longArray = new LongArray();
int target = 6; longArray.add(1);
longArray.add(3);
longArray.add(5);
assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) assertThat(
binarySearchFloor(
longArray, /* value= */ 6, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(2); .isEqualTo(2);
} }
@Test @Test
public void testListBinarySearchFloor_targetInList() { public void
List<Integer> list = Arrays.asList(1, 1, 1, 1, 1, 3, 5); longArrayBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsFalse_returnsMinus1() {
int target = 1; LongArray longArray = new LongArray();
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(3);
longArray.add(5);
assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) assertThat(
.isEqualTo(-1); binarySearchFloor(
assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) longArray, /* value= */ 1, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(0);
assertThat(binarySearchFloor(list, target, /* inclusive= */ true, /* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void testListBinarySearchFloor_targetBetweenListValues() {
List<Integer> list = Arrays.asList(1, 1, 1, 1, 1, 3, 5);
int target = 2;
assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(4);
assertThat(binarySearchFloor(list, target, /* inclusive= */ true, /* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void testArrayBinarySearchCeil_emptyArray() {
long[] array = new long[0];
int target = 0;
assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(0);
assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(-1); .isEqualTo(-1);
} }
@Test @Test
public void testArrayBinarySearchCeil_targetSmallerThanArrayValues() { public void
long[] array = new long[] {1, 3, 5}; longArrayBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsTrue_returns0() {
int target = 0; LongArray longArray = new LongArray();
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(3);
longArray.add(5);
assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) assertThat(
binarySearchFloor(
longArray, /* value= */ 1, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(0); .isEqualTo(0);
} }
@Test @Test
public void testArrayBinarySearchCeil_targetBiggerThanArrayValues() { public void
long[] array = new long[] {1, 3, 5}; longArrayBinarySearchFloor_targetInArrayAndInclusiveTrue_returnsFirstIndexWithValueEqualToTarget() {
int target = 6; LongArray longArray = new LongArray();
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(3);
longArray.add(5);
assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) assertThat(
binarySearchFloor(
longArray, /* value= */ 1, /* inclusive= */ true, /* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void
longArrayBinarySearchFloor_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
LongArray longArray = new LongArray();
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(3);
longArray.add(5);
assertThat(
binarySearchFloor(
longArray, /* value= */ 2, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void
longArrayBinarySearchFloor_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
LongArray longArray = new LongArray();
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(1);
longArray.add(3);
longArray.add(5);
assertThat(
binarySearchFloor(
longArray, /* value= */ 2, /* inclusive= */ true, /* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void listBinarySearchFloor_emptyListAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
new ArrayList<>(),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void listBinarySearchFloor_emptyListAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new ArrayList<>(),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void listBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 3, 5),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void listBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 3, 5),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void listBinarySearchFloor_targetBiggerThanValues_returnsLastIndex() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 3, 5),
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2);
}
@Test
public void
listBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void
listBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void
listBinarySearchFloor_targetInListAndInclusiveTrue_returnsFirstIndexWithValueEqualToTarget() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void
listBinarySearchFloor_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 2,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void
listBinarySearchFloor_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 2,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void arrayBinarySearchCeil_emptyArrayAndStayInBoundsFalse_returns0() {
assertThat(
binarySearchCeil(
new int[0], /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void arrayBinarySearchCeil_emptyArrayAndStayInBoundsTrue_returnsMinus1() {
assertThat(
binarySearchCeil(
new int[0], /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(-1);
}
@Test
public void arrayBinarySearchCeil_targetSmallerThanValues_returns0() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5},
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void arrayBinarySearchCeil_targetBiggerThanValuesAndStayInBoundsFalse_returnsLength() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5},
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(3); .isEqualTo(3);
assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
@Test
public void arrayBinarySearchCeil_targetBiggerThanValuesAndStayInBoundsTrue_returnsLastIndex() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5},
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(2); .isEqualTo(2);
} }
@Test @Test
public void testArrayBinarySearchCeil_targetInArray() { public void
long[] array = new long[] {1, 3, 5, 5, 5, 5, 5}; arrayBinarySearchCeil_targetEqualToLastValueAndInclusiveFalseAndStayInBoundsFalse_returnsLength() {
int target = 5; assertThat(
binarySearchCeil(
assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 5,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(7); .isEqualTo(7);
assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
.isEqualTo(6);
assertThat(binarySearchCeil(array, target, /* inclusive= */ true, /* stayInBounds= */ false)) @Test
public void
arrayBinarySearchCeil_targetEqualToLastValueAndInclusiveFalseAndStayInBoundsTrue_returnsLastIndex() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 5,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(6); .isEqualTo(6);
} }
@Test @Test
public void testArrayBinarySearchCeil_targetBetweenArrayValues() { public void
long[] array = new long[] {1, 3, 5, 5, 5, 5, 5}; arrayBinarySearchCeil_targetInArrayAndInclusiveTrue_returnsLastIndexWithValueEqualToTarget() {
int target = 4; assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 5,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(6);
}
assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) @Test
.isEqualTo(2); public void
assertThat(binarySearchCeil(array, target, /* inclusive= */ true, /* stayInBounds= */ false)) arrayBinarySearchCeil_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 4,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2); .isEqualTo(2);
} }
@Test @Test
public void testListBinarySearchCeil_emptyList() { public void
List<Integer> list = new ArrayList<>(); arrayBinarySearchCeil_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
int target = 0; assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 4,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(2);
}
assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) @Test
public void listBinarySearchCeil_emptyListAndStayInBoundsFalse_returns0() {
assertThat(
binarySearchCeil(
new ArrayList<>(),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(0); .isEqualTo(0);
assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
@Test
public void listBinarySearchCeil_emptyListAndStayInBoundsTrue_returnsMinus1() {
assertThat(
binarySearchCeil(
new ArrayList<>(),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(-1); .isEqualTo(-1);
} }
@Test @Test
public void testListBinarySearchCeil_targetSmallerThanListValues() { public void listBinarySearchCeil_targetSmallerThanValues_returns0() {
List<Integer> list = Arrays.asList(1, 3, 5); assertThat(
int target = 0; binarySearchCeil(
Arrays.asList(1, 3, 5),
assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) /* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(0); .isEqualTo(0);
} }
@Test @Test
public void testListBinarySearchCeil_targetBiggerThanListValues() { public void listBinarySearchCeil_targetBiggerThanValuesAndStayInBoundsFalse_returnsLength() {
List<Integer> list = Arrays.asList(1, 3, 5); assertThat(
int target = 6; binarySearchCeil(
Arrays.asList(1, 3, 5),
assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) /* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(3); .isEqualTo(3);
assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
@Test
public void listBinarySearchCeil_targetBiggerThanValuesAndStayInBoundsTrue_returnsLastIndex() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5),
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(2); .isEqualTo(2);
} }
@Test @Test
public void testListBinarySearchCeil_targetInList() { public void
List<Integer> list = Arrays.asList(1, 3, 5, 5, 5, 5, 5); listBinarySearchCeil_targetEqualToLastValueAndInclusiveFalseAndStayInBoundsFalse_returnsLength() {
int target = 5; assertThat(
binarySearchCeil(
assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 5,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(7); .isEqualTo(7);
assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) }
.isEqualTo(6);
assertThat(binarySearchCeil(list, target, /* inclusive= */ true, /* stayInBounds= */ false)) @Test
public void
listBinarySearchCeil_targetEqualToLastValueAndInclusiveFalseAndStayInBoundsTrue_returnsLastIndex() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 5,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(6); .isEqualTo(6);
} }
@Test @Test
public void testListBinarySearchCeil_targetBetweenListValues() { public void
List<Integer> list = Arrays.asList(1, 3, 5, 5, 5, 5, 5); listBinarySearchCeil_targetInListAndInclusiveTrue_returnsLastIndexWithValueEqualToTarget() {
int target = 4; assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 5,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(6);
}
assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) @Test
public void
listBinarySearchCeil_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 4,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2); .isEqualTo(2);
assertThat(binarySearchCeil(list, target, /* inclusive= */ true, /* stayInBounds= */ false)) }
@Test
public void
listBinarySearchCeil_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 4,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(2); .isEqualTo(2);
} }