blob: f18a32f7d8c8fd7a8429d40395a78b88b42dc3c8 [file] [log] [blame]
/*
* Copyright 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.emultest.java8.util;
import com.google.gwt.emultest.java.util.EmulTestBase;
import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* Java 8 methods to test in java.util.Comparator.
*/
public class ComparatorTest extends EmulTestBase {
public void testThenComparing() {
Supplier<String[]> strings = () -> new String[] {"1,b", "1,a", "2,a"};
// expected sort results for 1st and 2nd char, each (f)orward or (r)everse
String[] f1f2 = {"1,a", "1,b", "2,a"};
String[] f1r2 = {"1,b", "1,a", "2,a"};
String[] f2f1 = {"1,a", "2,a" ,"1,b"};
// keyextractor
assertSortedEquals(f1f2, strings,
Comparator.<String, String>comparing(s -> s.split(",")[0])
.thenComparing(s -> s.split(",")[1])
);
// keyextractor, keycomparator
assertSortedEquals(f1r2, strings,
Comparator.<String, String>comparing(s -> s.split(",")[0])
.thenComparing(
s -> s.split(",")[1],
Comparator.<String>reverseOrder()
)
);
// int key extractor
assertSortedEquals(f2f1, strings,
Comparator.<String, String>comparing(s -> s.split(",")[1])
.thenComparingInt(
s -> Integer.parseInt(s.split(",")[0])
)
);
// long key extractor
assertSortedEquals(f2f1, strings,
Comparator.<String, String>comparing(s -> s.split(",")[1])
.thenComparingLong(
s -> Long.parseLong(s.split(",")[0])
)
);
// double key extractor
assertSortedEquals(f2f1, strings,
Comparator.<String, String>comparing(s -> s.split(",")[1])
.thenComparingDouble(
s -> Double.parseDouble(s.split(",")[0])
)
);
}
public void testComparing() {
Supplier<String[]> strings = () -> new String[] {"1b3", "2a1", "3c2"};
// pre-sorted lists to test against, named for which char (1-indexed) they are sorted on
String[] first = {"1b3", "2a1", "3c2"};
String[] second = {"2a1", "1b3", "3c2"};
String[] third = {"2a1", "3c2", "1b3"};
// keyextractor
assertSortedEquals(first, strings, Comparator.comparing(Function.identity()));
Comparator<String> comparing = Comparator.comparing(Function.identity());
assertSortedEquals(reverse(first), strings, comparing.reversed());
assertSortedEquals(second, strings, Comparator.comparing(a -> a.substring(1)));
assertSortedEquals(third, strings, Comparator.comparing(a -> a.substring(2)));
// keyextractor, keycomparator
assertSortedEquals(reverse(second), strings, Comparator.comparing(a -> a.substring(1), Comparator.reverseOrder()));
comparing = Comparator.comparing(a -> a.substring(1));
assertSortedEquals(reverse(second), strings, comparing.reversed());
// double key extractor
comparing = Comparator.comparingDouble(a -> Double.parseDouble(a.substring(2)));
assertSortedEquals(third, strings, comparing);
assertSortedEquals(reverse(third), strings, comparing.reversed());
// int key extractor
comparing = Comparator.comparingInt(a -> Integer.parseInt(a.substring(2)));
assertSortedEquals(third, strings, comparing);
assertSortedEquals(reverse(third), strings, comparing.reversed());
// long key extractor
comparing = Comparator.comparingLong(a -> Long.parseLong(a.substring(2)));
assertSortedEquals(third, strings, comparing);
assertSortedEquals(reverse(third), strings, comparing.reversed());
}
public void testNullsFirst() {
Supplier<String[]> strings = () -> new String[]{"a", null, "c", null, "b"};
assertSortedEquals(
new String[] {null, null, "a", "b", "c"},
strings,
Comparator.nullsFirst(Comparator.naturalOrder())
);
assertSortedEquals(
new String[] {null, null, "c", "b", "a"},
strings,
Comparator.nullsFirst(Comparator.reverseOrder())
);
}
public void testNullsLast() {
Supplier<String[]> strings = () -> new String[]{"a", null, "c", null, "b"};
assertSortedEquals(
new String[] {"a", "b", "c", null, null},
strings,
Comparator.nullsLast(Comparator.naturalOrder())
);
assertSortedEquals(
new String[] {"c", "b", "a", null, null},
strings,
Comparator.nullsLast(Comparator.reverseOrder())
);
}
private static void assertSortedEquals(String[] expected, Supplier<String[]> presort, Comparator<String> comparator) {
String[] presortedArray = presort.get();
Arrays.sort(presortedArray, comparator);
assertEquals(expected, presortedArray);
}
private static String[] reverse(String[] array) {
int length = array.length;
String[] reversed = new String[length];
for (int i = 0, j = length - 1; i < length; ++i, --j) {
reversed[i] = array[j];
}
return reversed;
}
}