From 15a43e5c78bc2e0b4424e288d91aa390830b8454 Mon Sep 17 00:00:00 2001 From: kimvde Date: Thu, 23 Jan 2020 16:50:37 +0000 Subject: [PATCH] Improve tests of binary search utility methods Improve unit tests of binary search methods by making them more behavior-driven. PiperOrigin-RevId: 291175304 --- .../android/exoplayer2/util/UtilTest.java | 292 ++++++++++++------ 1 file changed, 200 insertions(+), 92 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/UtilTest.java b/library/core/src/test/java/com/google/android/exoplayer2/util/UtilTest.java index 07334872e1..3cd0b107a3 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/util/UtilTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/util/UtilTest.java @@ -89,115 +89,223 @@ public class UtilTest { } @Test - public void testArrayBinarySearchFloor() { - long[] values = new long[0]; - assertThat(binarySearchFloor(values, 0, false, false)).isEqualTo(-1); - assertThat(binarySearchFloor(values, 0, false, true)).isEqualTo(0); + public void testArrayBinarySearchFloor_emptyArray() { + long[] array = new long[0]; + int target = 0; - values = new long[] {1, 3, 5}; - assertThat(binarySearchFloor(values, 0, false, false)).isEqualTo(-1); - assertThat(binarySearchFloor(values, 0, true, false)).isEqualTo(-1); - assertThat(binarySearchFloor(values, 0, false, true)).isEqualTo(0); - assertThat(binarySearchFloor(values, 0, true, true)).isEqualTo(0); - - assertThat(binarySearchFloor(values, 1, false, false)).isEqualTo(-1); - assertThat(binarySearchFloor(values, 1, true, false)).isEqualTo(0); - assertThat(binarySearchFloor(values, 1, false, true)).isEqualTo(0); - assertThat(binarySearchFloor(values, 1, true, true)).isEqualTo(0); - - assertThat(binarySearchFloor(values, 4, false, false)).isEqualTo(1); - assertThat(binarySearchFloor(values, 4, true, false)).isEqualTo(1); - - assertThat(binarySearchFloor(values, 5, false, false)).isEqualTo(1); - assertThat(binarySearchFloor(values, 5, true, false)).isEqualTo(2); - - assertThat(binarySearchFloor(values, 6, false, false)).isEqualTo(2); - assertThat(binarySearchFloor(values, 6, true, false)).isEqualTo(2); + assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(-1); + assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(0); } @Test - public void testListBinarySearchFloor() { - List values = new ArrayList<>(); - assertThat(binarySearchFloor(values, 0, false, false)).isEqualTo(-1); - assertThat(binarySearchFloor(values, 0, false, true)).isEqualTo(0); + public void testArrayBinarySearchFloor_targetSmallerThanArrayValues() { + long[] array = new long[] {1, 3, 5}; + int target = 0; - values.add(1); - values.add(3); - values.add(5); - assertThat(binarySearchFloor(values, 0, false, false)).isEqualTo(-1); - assertThat(binarySearchFloor(values, 0, true, false)).isEqualTo(-1); - assertThat(binarySearchFloor(values, 0, false, true)).isEqualTo(0); - assertThat(binarySearchFloor(values, 0, true, true)).isEqualTo(0); - - assertThat(binarySearchFloor(values, 1, false, false)).isEqualTo(-1); - assertThat(binarySearchFloor(values, 1, true, false)).isEqualTo(0); - assertThat(binarySearchFloor(values, 1, false, true)).isEqualTo(0); - assertThat(binarySearchFloor(values, 1, true, true)).isEqualTo(0); - - assertThat(binarySearchFloor(values, 4, false, false)).isEqualTo(1); - assertThat(binarySearchFloor(values, 4, true, false)).isEqualTo(1); - - assertThat(binarySearchFloor(values, 5, false, false)).isEqualTo(1); - assertThat(binarySearchFloor(values, 5, true, false)).isEqualTo(2); - - assertThat(binarySearchFloor(values, 6, false, false)).isEqualTo(2); - assertThat(binarySearchFloor(values, 6, true, false)).isEqualTo(2); + assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(-1); + assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(0); } @Test - public void testArrayBinarySearchCeil() { - long[] values = new long[0]; - assertThat(binarySearchCeil(values, 0, false, false)).isEqualTo(0); - assertThat(binarySearchCeil(values, 0, false, true)).isEqualTo(-1); + public void testArrayBinarySearchFloor_targetBiggerThanArrayValues() { + long[] array = new long[] {1, 3, 5}; + int target = 6; - values = new long[] {1, 3, 5}; - assertThat(binarySearchCeil(values, 0, false, false)).isEqualTo(0); - assertThat(binarySearchCeil(values, 0, true, false)).isEqualTo(0); - - assertThat(binarySearchCeil(values, 1, false, false)).isEqualTo(1); - assertThat(binarySearchCeil(values, 1, true, false)).isEqualTo(0); - - assertThat(binarySearchCeil(values, 2, false, false)).isEqualTo(1); - assertThat(binarySearchCeil(values, 2, true, false)).isEqualTo(1); - - assertThat(binarySearchCeil(values, 5, false, false)).isEqualTo(3); - assertThat(binarySearchCeil(values, 5, true, false)).isEqualTo(2); - assertThat(binarySearchCeil(values, 5, false, true)).isEqualTo(2); - assertThat(binarySearchCeil(values, 5, true, true)).isEqualTo(2); - - assertThat(binarySearchCeil(values, 6, false, false)).isEqualTo(3); - assertThat(binarySearchCeil(values, 6, true, false)).isEqualTo(3); - assertThat(binarySearchCeil(values, 6, false, true)).isEqualTo(2); - assertThat(binarySearchCeil(values, 6, true, true)).isEqualTo(2); + assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(2); } @Test - public void testListBinarySearchCeil() { - List values = new ArrayList<>(); - assertThat(binarySearchCeil(values, 0, false, false)).isEqualTo(0); - assertThat(binarySearchCeil(values, 0, false, true)).isEqualTo(-1); + public void testArrayBinarySearchFloor_targetInArray() { + long[] array = new long[] {1, 1, 1, 1, 1, 3, 5}; + int target = 1; - values.add(1); - values.add(3); - values.add(5); - assertThat(binarySearchCeil(values, 0, false, false)).isEqualTo(0); - assertThat(binarySearchCeil(values, 0, true, false)).isEqualTo(0); + assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(-1); + assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(0); + assertThat(binarySearchFloor(array, target, /* inclusive= */ true, /* stayInBounds= */ false)) + .isEqualTo(0); + } - assertThat(binarySearchCeil(values, 1, false, false)).isEqualTo(1); - assertThat(binarySearchCeil(values, 1, true, false)).isEqualTo(0); + @Test + public void testArrayBinarySearchFloor_targetBetweenArrayValues() { + long[] array = new long[] {1, 1, 1, 1, 1, 3, 5}; + int target = 2; - assertThat(binarySearchCeil(values, 2, false, false)).isEqualTo(1); - assertThat(binarySearchCeil(values, 2, true, false)).isEqualTo(1); + assertThat(binarySearchFloor(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(4); + assertThat(binarySearchFloor(array, target, /* inclusive= */ true, /* stayInBounds= */ false)) + .isEqualTo(4); + } - assertThat(binarySearchCeil(values, 5, false, false)).isEqualTo(3); - assertThat(binarySearchCeil(values, 5, true, false)).isEqualTo(2); - assertThat(binarySearchCeil(values, 5, false, true)).isEqualTo(2); - assertThat(binarySearchCeil(values, 5, true, true)).isEqualTo(2); + @Test + public void testListBinarySearchFloor_emptyList() { + List list = Arrays.asList(1, 3, 5); + int target = 0; - assertThat(binarySearchCeil(values, 6, false, false)).isEqualTo(3); - assertThat(binarySearchCeil(values, 6, true, false)).isEqualTo(3); - assertThat(binarySearchCeil(values, 6, false, true)).isEqualTo(2); - assertThat(binarySearchCeil(values, 6, true, true)).isEqualTo(2); + assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(-1); + assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(0); + } + + @Test + public void testListBinarySearchFloor_targetSmallerThanListValues() { + List list = Arrays.asList(1, 3, 5); + int target = 0; + + assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(-1); + assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(0); + } + + @Test + public void testListBinarySearchFloor_targetBiggerThanListValues() { + List list = Arrays.asList(1, 3, 5); + int target = 6; + + assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(2); + } + + @Test + public void testListBinarySearchFloor_targetInList() { + List list = Arrays.asList(1, 1, 1, 1, 1, 3, 5); + int target = 1; + + assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(-1); + assertThat(binarySearchFloor(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(0); + assertThat(binarySearchFloor(list, target, /* inclusive= */ true, /* stayInBounds= */ false)) + .isEqualTo(0); + } + + @Test + public void testListBinarySearchFloor_targetBetweenListValues() { + List 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); + } + + @Test + public void testArrayBinarySearchCeil_targetSmallerThanArrayValues() { + long[] array = new long[] {1, 3, 5}; + int target = 0; + + assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(0); + } + + @Test + public void testArrayBinarySearchCeil_targetBiggerThanArrayValues() { + long[] array = new long[] {1, 3, 5}; + int target = 6; + + assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(3); + assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(2); + } + + @Test + public void testArrayBinarySearchCeil_targetInArray() { + long[] array = new long[] {1, 3, 5, 5, 5, 5, 5}; + int target = 5; + + assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(7); + assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(6); + assertThat(binarySearchCeil(array, target, /* inclusive= */ true, /* stayInBounds= */ false)) + .isEqualTo(6); + } + + @Test + public void testArrayBinarySearchCeil_targetBetweenArrayValues() { + long[] array = new long[] {1, 3, 5, 5, 5, 5, 5}; + int target = 4; + + assertThat(binarySearchCeil(array, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(2); + assertThat(binarySearchCeil(array, target, /* inclusive= */ true, /* stayInBounds= */ false)) + .isEqualTo(2); + } + + @Test + public void testListBinarySearchCeil_emptyList() { + List list = new ArrayList<>(); + int target = 0; + + assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(0); + assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(-1); + } + + @Test + public void testListBinarySearchCeil_targetSmallerThanListValues() { + List list = Arrays.asList(1, 3, 5); + int target = 0; + + assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(0); + } + + @Test + public void testListBinarySearchCeil_targetBiggerThanListValues() { + List list = Arrays.asList(1, 3, 5); + int target = 6; + + assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(3); + assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(2); + } + + @Test + public void testListBinarySearchCeil_targetInList() { + List list = Arrays.asList(1, 3, 5, 5, 5, 5, 5); + int target = 5; + + assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(7); + assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ true)) + .isEqualTo(6); + assertThat(binarySearchCeil(list, target, /* inclusive= */ true, /* stayInBounds= */ false)) + .isEqualTo(6); + } + + @Test + public void testListBinarySearchCeil_targetBetweenListValues() { + List list = Arrays.asList(1, 3, 5, 5, 5, 5, 5); + int target = 4; + + assertThat(binarySearchCeil(list, target, /* inclusive= */ false, /* stayInBounds= */ false)) + .isEqualTo(2); + assertThat(binarySearchCeil(list, target, /* inclusive= */ true, /* stayInBounds= */ false)) + .isEqualTo(2); } @Test