summaryrefslogtreecommitdiffstats
path: root/predicate-search/src/test/java/com/yahoo/search/predicate/utils/PrimitiveArraySorterTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'predicate-search/src/test/java/com/yahoo/search/predicate/utils/PrimitiveArraySorterTest.java')
-rw-r--r--predicate-search/src/test/java/com/yahoo/search/predicate/utils/PrimitiveArraySorterTest.java122
1 files changed, 122 insertions, 0 deletions
diff --git a/predicate-search/src/test/java/com/yahoo/search/predicate/utils/PrimitiveArraySorterTest.java b/predicate-search/src/test/java/com/yahoo/search/predicate/utils/PrimitiveArraySorterTest.java
new file mode 100644
index 00000000000..950268d5ecf
--- /dev/null
+++ b/predicate-search/src/test/java/com/yahoo/search/predicate/utils/PrimitiveArraySorterTest.java
@@ -0,0 +1,122 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.predicate.utils;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Random;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class PrimitiveArraySorterTest {
+
+ @Test
+ public void sorting_empty_array_should_not_throw_exception() {
+ short[] array = {};
+ PrimitiveArraySorter.sort(array, Short::compare);
+ }
+
+ @Test
+ public void test_sorting_single_item_array() {
+ short[] array = {42};
+ PrimitiveArraySorter.sort(array, Short::compare);
+ assertEquals(42, array[0]);
+ }
+
+ @Test
+ public void test_sorting_custom_comparator() {
+ short[] array = {4, 2, 5};
+ PrimitiveArraySorter.sort(array, (a, b) -> Short.compare(b, a)); // Sort using inverse ordering.
+ short[] expected = {5, 4, 2};
+ assertArrayEquals(expected, array);
+ }
+
+ @Test
+ public void test_complicated_array() {
+ short[] array = {20381, -28785, -19398, 17307, -12612, 11459, -30164, -16597, -4267, 30838, 8918, 9014, -26444,
+ -1232, -14620, 12636, -12389, -4931, 32108, 19854, -12681, 14933, 319, 27348, -4907, 19196, 14209,
+ -32694, 2579, 9771, -1157, -13717, 28506, -8016, 21423, 23697, 23755, 29650, 25644, -14660, -18952,
+ 25272, -19933, -11375, -32363, -11766, -29509, -23898, 12398, -2600, -20703, -23812, -8292, -1605,
+ 28642, 12748, 2547, -14535, 4476, -7802};
+ short[] expected = Arrays.copyOf(array, array.length);
+ Arrays.sort(expected);
+ PrimitiveArraySorter.sort(array, Short::compare);
+ assertArrayEquals(expected, array);
+ }
+
+ @Test
+ public void sorting_random_arrays_should_produce_identical_result_as_java_sort() {
+ Random r = new Random(4234);
+ for (int i = 0; i < 10000; i++) {
+ short[] original = makeRandomArray(r);
+ short[] javaSorted = Arrays.copyOf(original, original.length);
+ short[] customSorted = Arrays.copyOf(original, original.length);
+ PrimitiveArraySorter.sort(customSorted, Short::compare);
+ Arrays.sort(javaSorted);
+ String errorMsg = String.format("%s != %s (before sorting: %s)", Arrays.toString(customSorted), Arrays.toString(javaSorted), Arrays.toString(original));
+ assertArrayEquals(errorMsg, customSorted, javaSorted);
+ }
+ }
+
+ @Test
+ public void test_merging_simple_array() {
+ short[] array = {-20, -12, 2, -22, -11, 33, 44};
+ short[] expected = {-22, -20, -12, -11, 2, 33, 44};
+ short[] result = new short[array.length];
+ PrimitiveArraySorter.merge(array, result, 3, Short::compare);
+ assertArrayEquals(expected, result);
+ }
+
+ @Test
+ public void test_merging_of_random_generated_arrays() {
+ Random r = new Random(4234);
+ for (int i = 0; i < 10000; i++) {
+ short[] array = makeRandomArray(r);
+ int length = array.length;
+ short[] mergeArray = new short[length];
+ short[] expected = Arrays.copyOf(array, length);
+ Arrays.sort(expected);
+
+ int pivot = length > 0 ? r.nextInt(length) : 0;
+ Arrays.sort(array, 0, pivot);
+ Arrays.sort(array, pivot, length);
+ PrimitiveArraySorter.merge(array, mergeArray, pivot, Short::compare);
+ assertArrayEquals(expected, mergeArray);
+ }
+ }
+
+ @Test
+ public void test_sortandmerge_returns_false_when_sort_is_in_place() {
+ short[] array = {3, 2, 1, 0, 4, 5, 6};
+ short[] mergeArray = new short[array.length];
+ assertFalse(PrimitiveArraySorter.sortAndMerge(array, mergeArray, 4, 7, Short::compare));
+ assertIsSorted(array);
+
+ array = new short[]{3, 2, 1, 0, 4, 5, 6};
+ assertTrue(PrimitiveArraySorter.sortAndMerge(array, mergeArray, 3, 7, Short::compare));
+ assertIsSorted(mergeArray);
+ }
+
+ // Create random array with size [0, 99] filled with random values.
+ private short[] makeRandomArray(Random r) {
+ short[] array = new short[r.nextInt(100)];
+ for (int j = 0; j < array.length; j++) {
+ array[j] = (short) r.nextInt();
+ }
+ return array;
+ }
+
+ private static void assertIsSorted(short[] array) {
+ if (array.length == 0) return;
+ int prev = array[0];
+ for (int i = 1; i < array.length; i++) {
+ int next = array[i];
+ assertTrue(prev <= next);
+ prev = next;
+ }
+ }
+
+}