Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/util/Comparator/BasicTest.java
38811 views
/*1* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @summary Comparator default method tests26* @run testng BasicTest27*/2829import java.util.TreeMap;30import java.util.Comparator;31import org.testng.annotations.Test;3233import java.util.function.Function;34import java.util.function.ToIntFunction;35import java.util.function.ToLongFunction;36import java.util.function.ToDoubleFunction;3738import static org.testng.Assert.assertEquals;39import static org.testng.Assert.assertTrue;40import static org.testng.Assert.fail;4142@Test(groups = "unit")43public class BasicTest {44private static class Thing {45public final int intField;46public final long longField;47public final double doubleField;48public final String stringField;4950private Thing(int intField, long longField, double doubleField, String stringField) {51this.intField = intField;52this.longField = longField;53this.doubleField = doubleField;54this.stringField = stringField;55}5657public int getIntField() {58return intField;59}6061public long getLongField() {62return longField;63}6465public double getDoubleField() {66return doubleField;67}6869public String getStringField() {70return stringField;71}72}7374private final int[] intValues = { -2, -2, -1, -1, 0, 0, 1, 1, 2, 2 };75private final long[] longValues = { -2, -2, -1, -1, 0, 0, 1, 1, 2, 2 };76private final double[] doubleValues = { -2, -2, -1, -1, 0, 0, 1, 1, 2, 2 };77private final String[] stringValues = { "a", "a", "b", "b", "c", "c", "d", "d", "e", "e" };78private final int[] comparisons = { 0, -1, 0, -1, 0, -1, 0, -1, 0 };7980private<T> void assertComparisons(T[] things, Comparator<T> comp, int[] comparisons) {81for (int i=0; i<comparisons.length; i++) {82assertEquals(comparisons.length + 1, things.length);83assertEquals(comparisons[i], comp.compare(things[i], things[i+1]));84assertEquals(-comparisons[i], comp.compare(things[i+1], things[i]));85}86}8788public void testIntComparator() {89Thing[] things = new Thing[intValues.length];90for (int i=0; i<intValues.length; i++)91things[i] = new Thing(intValues[i], 0L, 0.0, null);92Comparator<Thing> comp = Comparator.comparingInt(new ToIntFunction<Thing>() {93@Override94public int applyAsInt(Thing thing) {95return thing.getIntField();96}97});9899assertComparisons(things, comp, comparisons);100}101102public void testLongComparator() {103Thing[] things = new Thing[longValues.length];104for (int i=0; i<longValues.length; i++)105things[i] = new Thing(0, longValues[i], 0.0, null);106Comparator<Thing> comp = Comparator.comparingLong(new ToLongFunction<Thing>() {107@Override108public long applyAsLong(Thing thing) {109return thing.getLongField();110}111});112113assertComparisons(things, comp, comparisons);114}115116public void testDoubleComparator() {117Thing[] things = new Thing[doubleValues.length];118for (int i=0; i<doubleValues.length; i++)119things[i] = new Thing(0, 0L, doubleValues[i], null);120Comparator<Thing> comp = Comparator.comparingDouble(new ToDoubleFunction<Thing>() {121@Override122public double applyAsDouble(Thing thing) {123return thing.getDoubleField();124}125});126127assertComparisons(things, comp, comparisons);128}129130public void testComparing() {131Thing[] things = new Thing[doubleValues.length];132for (int i=0; i<doubleValues.length; i++)133things[i] = new Thing(0, 0L, 0.0, stringValues[i]);134Comparator<Thing> comp = Comparator.comparing(new Function<Thing, String>() {135@Override136public String apply(Thing thing) {137return thing.getStringField();138}139});140141assertComparisons(things, comp, comparisons);142}143144public void testNaturalOrderComparator() {145Comparator<String> comp = Comparator.naturalOrder();146147assertComparisons(stringValues, comp, comparisons);148}149150public void testReverseComparator() {151Comparator<String> cmpr = Comparator.reverseOrder();152Comparator<String> cmp = cmpr.reversed();153154assertEquals(cmp.reversed(), cmpr);155assertEquals(0, cmp.compare("a", "a"));156assertEquals(0, cmpr.compare("a", "a"));157assertTrue(cmp.compare("a", "b") < 0);158assertTrue(cmpr.compare("a", "b") > 0);159assertTrue(cmp.compare("b", "a") > 0);160assertTrue(cmpr.compare("b", "a") < 0);161}162163public void testReverseComparator2() {164Comparator<String> cmp = (s1, s2) -> s1.length() - s2.length();165Comparator<String> cmpr = cmp.reversed();166167assertEquals(cmpr.reversed(), cmp);168assertEquals(0, cmp.compare("abc", "def"));169assertEquals(0, cmpr.compare("abc", "def"));170assertTrue(cmp.compare("abcd", "def") > 0);171assertTrue(cmpr.compare("abcd", "def") < 0);172assertTrue(cmp.compare("abc", "defg") < 0);173assertTrue(cmpr.compare("abc", "defg") > 0);174}175176private <T> void assertComparison(Comparator<T> cmp, T less, T greater) {177assertTrue(cmp.compare(less, greater) < 0, "less");178assertTrue(cmp.compare(less, less) == 0, "equal");179assertTrue(cmp.compare(greater, greater) == 0, "equal");180assertTrue(cmp.compare(greater, less) > 0, "greater");181}182183private static class People {184final String firstName;185final String lastName;186final int age;187188People(String first, String last, int age) {189firstName = first;190lastName = last;191this.age = age;192}193194String getFirstName() { return firstName; }195String getLastName() { return lastName; }196int getAge() { return age; }197long getAgeAsLong() { return (long) age; };198double getAgeAsDouble() { return (double) age; };199}200201private final People people[] = {202new People("John", "Doe", 34),203new People("Mary", "Doe", 30),204new People("Maria", "Doe", 14),205new People("Jonah", "Doe", 10),206new People("John", "Cook", 54),207new People("Mary", "Cook", 50),208new People("Mary", null, 25),209new People("John", null, 27)210};211212public void testComparatorDefaultMethods() {213Comparator<People> cmp = Comparator.comparing(People::getFirstName);214Comparator<People> cmp2 = Comparator.comparing(People::getLastName);215// reverseOrder216assertComparison(cmp.reversed(), people[1], people[0]);217// thenComparing(Comparator)218assertComparison(cmp.thenComparing(cmp2), people[0], people[1]);219assertComparison(cmp.thenComparing(cmp2), people[4], people[0]);220// thenComparing(Function)221assertComparison(cmp.thenComparing(People::getLastName), people[0], people[1]);222assertComparison(cmp.thenComparing(People::getLastName), people[4], people[0]);223// thenComparing(ToIntFunction)224assertComparison(cmp.thenComparingInt(People::getAge), people[0], people[1]);225assertComparison(cmp.thenComparingInt(People::getAge), people[1], people[5]);226// thenComparing(ToLongFunction)227assertComparison(cmp.thenComparingLong(People::getAgeAsLong), people[0], people[1]);228assertComparison(cmp.thenComparingLong(People::getAgeAsLong), people[1], people[5]);229// thenComparing(ToDoubleFunction)230assertComparison(cmp.thenComparingDouble(People::getAgeAsDouble), people[0], people[1]);231assertComparison(cmp.thenComparingDouble(People::getAgeAsDouble), people[1], people[5]);232}233234235public void testNullsFirst() {236Comparator<String> strcmp = Comparator.nullsFirst(Comparator.naturalOrder());237Comparator<People> cmp = Comparator.comparing(People::getLastName, strcmp)238.thenComparing(People::getFirstName, strcmp);239// Mary.null vs Mary.Cook - solve by last name240assertComparison(cmp, people[6], people[5]);241// John.null vs Mary.null - solve by first name242assertComparison(cmp, people[7], people[6]);243244// More than one thenComparing245strcmp = Comparator.nullsFirst(Comparator.comparingInt(String::length)246.thenComparing(String.CASE_INSENSITIVE_ORDER));247assertComparison(strcmp, null, "abc");248assertComparison(strcmp, "ab", "abc");249assertComparison(strcmp, "abc", "def");250assertEquals(0, strcmp.compare("abc", "ABC"));251252// Ensure reverse still handle null properly253Comparator<String> strcmp2 = strcmp.reversed().thenComparing(Comparator.naturalOrder());254assertComparison(strcmp2, "abc", null);255assertComparison(strcmp2, "abc", "ab");256assertComparison(strcmp2, "def", "abc");257assertComparison(strcmp2, "ABC", "abc");258259// Considering non-null values to be equal260Comparator<String> blind = Comparator.nullsFirst(null);261assertComparison(blind, null, "abc");262assertEquals(0, blind.compare("abc", "def"));263// reverse still consider non-null values to be equal264strcmp = blind.reversed();265assertComparison(strcmp, "abc", null);266assertEquals(0, strcmp.compare("abc", "def"));267// chain with another comparator to compare non-nulls268strcmp = blind.thenComparing(Comparator.naturalOrder());269assertComparison(strcmp, null, "abc");270assertComparison(strcmp, "abc", "def");271}272273public void testNullsLast() {274Comparator<String> strcmp = Comparator.nullsLast(Comparator.naturalOrder());275Comparator<People> cmp = Comparator.comparing(People::getLastName, strcmp)276.thenComparing(People::getFirstName, strcmp);277// Mary.null vs Mary.Cook - solve by last name278assertComparison(cmp, people[5], people[6]);279// John.null vs Mary.null - solve by first name280assertComparison(cmp, people[7], people[6]);281282// More than one thenComparing283strcmp = Comparator.nullsLast(Comparator.comparingInt(String::length)284.thenComparing(String.CASE_INSENSITIVE_ORDER));285assertComparison(strcmp, "abc", null);286assertComparison(strcmp, "ab", "abc");287assertComparison(strcmp, "abc", "def");288289// Ensure reverse still handle null properly290Comparator<String> strcmp2 = strcmp.reversed().thenComparing(Comparator.naturalOrder());291assertComparison(strcmp2, null, "abc");292assertComparison(strcmp2, "abc", "ab");293assertComparison(strcmp2, "def", "abc");294assertComparison(strcmp2, "ABC", "abc");295296// Considering non-null values to be equal297Comparator<String> blind = Comparator.nullsLast(null);298assertComparison(blind, "abc", null);299assertEquals(0, blind.compare("abc", "def"));300// reverse still consider non-null values to be equal301strcmp = blind.reversed();302assertComparison(strcmp, null, "abc");303assertEquals(0, strcmp.compare("abc", "def"));304// chain with another comparator to compare non-nulls305strcmp = blind.thenComparing(Comparator.naturalOrder());306assertComparison(strcmp, "abc", null);307assertComparison(strcmp, "abc", "def");308}309310public void testComposeComparator() {311// Longer string in front312Comparator<String> first = (s1, s2) -> s2.length() - s1.length();313Comparator<String> second = Comparator.naturalOrder();314Comparator<String> composed = first.thenComparing(second);315316assertTrue(composed.compare("abcdefg", "abcdef") < 0);317assertTrue(composed.compare("abcdef", "abcdefg") > 0);318assertTrue(composed.compare("abcdef", "abcdef") == 0);319assertTrue(composed.compare("abcdef", "ghijkl") < 0);320assertTrue(composed.compare("ghijkl", "abcdefg") > 0);321}322323public void testNulls() {324try {325Comparator.<String>naturalOrder().compare("abc", (String) null);326fail("expected NPE with naturalOrder");327} catch (NullPointerException npe) {}328try {329Comparator.<String>naturalOrder().compare((String) null, "abc");330fail("expected NPE with naturalOrder");331} catch (NullPointerException npe) {}332333try {334Comparator.<String>reverseOrder().compare("abc", (String) null);335fail("expected NPE with naturalOrder");336} catch (NullPointerException npe) {}337try {338Comparator.<String>reverseOrder().compare((String) null, "abc");339fail("expected NPE with naturalOrder");340} catch (NullPointerException npe) {}341342try {343Comparator<People> cmp = Comparator.comparing(null, Comparator.<String>naturalOrder());344fail("comparing(null, cmp) should throw NPE");345} catch (NullPointerException npe) {}346try {347Comparator<People> cmp = Comparator.comparing(People::getFirstName, null);348fail("comparing(f, null) should throw NPE");349} catch (NullPointerException npe) {}350351try {352Comparator<People> cmp = Comparator.comparing(null);353fail("comparing(null) should throw NPE");354} catch (NullPointerException npe) {}355try {356Comparator<People> cmp = Comparator.comparingInt(null);357fail("comparing(null) should throw NPE");358} catch (NullPointerException npe) {}359try {360Comparator<People> cmp = Comparator.comparingLong(null);361fail("comparing(null) should throw NPE");362} catch (NullPointerException npe) {}363try {364Comparator<People> cmp = Comparator.comparingDouble(null);365fail("comparing(null) should throw NPE");366} catch (NullPointerException npe) {}367}368}369370371