1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package libcore.java.util; 18 19 import java.util.ArrayList; 20 import java.util.Arrays; 21 import java.util.Collections; 22 import java.util.Comparator; 23 import java.util.List; 24 25 import junit.framework.TestCase; 26 27 public final class ComparatorTest extends TestCase { 28 private static final Item ZERO = new Item(0); 29 private static final Item ONE = new Item(1); 30 private static final Item TWO = new Item(2); 31 private static final Item THREE = new Item(3); 32 private static final Item FOUR = new Item(4); 33 34 private static final Item ZEROZERO = new Item(0, 0); 35 private static final Item ZEROONE = new Item(0, 1); 36 private static final Item ONEZERO = new Item(1, 0); 37 private static final Item ONEONE = new Item(1, 1); 38 39 private final List<Item> orderedItems = listOf(ZERO, ONE, TWO, THREE, FOUR); 40 private final List<Item> nullsFirstItems = listOf(null, ZERO, ONE, TWO, THREE, FOUR); 41 private final List<Item> nullsLastItems = listOf(ZERO, ONE, TWO, THREE, FOUR, null); 42 private final List<Item> orderedItemsMatrix = listOf(ZEROZERO, ZEROONE, ONEZERO, ONEONE); 43 listOf(T... values)44 private static<T> List<T> listOf(T... values) { 45 return Collections.unmodifiableList(Arrays.asList(values)); 46 } 47 checkComparison(Comparator<T> comparator, List<T> items)48 private <T> void checkComparison(Comparator<T> comparator, List<T> items) { 49 for (int i = 0; i < items.size() - 1; ++i) { 50 T a = items.get(i); 51 assertEquals(0, comparator.compare(a, a)); 52 for (T b : items.subList(i+1, items.size())) { 53 assertTrue(comparator.compare(a, b) < 0); 54 assertTrue(comparator.compare(b, a) > 0); 55 } 56 } 57 } 58 testComparingDouble()59 public void testComparingDouble() { 60 Comparator<Item> comparator = Comparator.comparingDouble(Item::getOrderAsDouble); 61 checkComparison(comparator, orderedItems); 62 } 63 testComparingInt()64 public void testComparingInt() { 65 Comparator<Item> comparator = Comparator.comparingInt(Item::getOrderAsInt); 66 checkComparison(comparator, orderedItems); 67 } 68 testComparingLong()69 public void testComparingLong() { 70 Comparator<Item> comparator = Comparator.comparingLong(Item::getOrderAsLong); 71 checkComparison(comparator, orderedItems); 72 } 73 testComparing()74 public void testComparing() { 75 Comparator<Item> comparator = Comparator.comparing(Item::getOrderAsString); 76 checkComparison(comparator, orderedItems); 77 } 78 testComparing2()79 public void testComparing2() { 80 Comparator<Item> comparator = Comparator.comparing(Item::getOrderAsString, 81 String.CASE_INSENSITIVE_ORDER); 82 checkComparison(comparator, orderedItems); 83 } 84 testNaturalOrder()85 public void testNaturalOrder() { 86 Comparator<Item> comparator = Comparator.naturalOrder(); 87 checkComparison(comparator, orderedItems); 88 checkComparison(comparator, orderedItemsMatrix); 89 } 90 testReverseOrder()91 public void testReverseOrder() { 92 // Make a copy that we can reverse. http://b/139015474 93 List<Item> itemsList = new ArrayList<>(orderedItems); 94 Collections.reverse(itemsList); 95 Comparator<Item> comparator = Comparator.reverseOrder(); 96 checkComparison(comparator, itemsList); 97 } 98 testReverse()99 public void testReverse() { 100 Comparator<Item> revComparator = Comparator.reverseOrder(); 101 Comparator<Item> revRevComparator = revComparator.reversed(); 102 checkComparison(revRevComparator, orderedItems); 103 checkComparison(revRevComparator, orderedItemsMatrix); 104 } 105 testReverse2()106 public void testReverse2() { 107 Comparator<Item> comparator = Comparator.naturalOrder(); 108 assertSame(comparator, comparator.reversed().reversed()); 109 } 110 testReverse3()111 public void testReverse3() { 112 Comparator<Item> comparator = Comparator.comparing(Item::getOrderAsString); 113 assertSame(comparator, comparator.reversed().reversed()); 114 } 115 testNullsFirst()116 public void testNullsFirst() { 117 Comparator<Item> comparator = Comparator.nullsFirst(Comparator.naturalOrder()); 118 checkComparison(comparator, nullsFirstItems); 119 } 120 testNullsLast()121 public void testNullsLast() { 122 Comparator<Item> comparator = Comparator.nullsLast(Comparator.naturalOrder()); 123 checkComparison(comparator, nullsLastItems); 124 } 125 testThenComparingDouble()126 public void testThenComparingDouble() { 127 Comparator<Item> comparator = Comparator.comparingDouble(Item::getOrderAsDouble) 128 .thenComparingDouble(Item::getSecondaryOrderAsDouble); 129 checkComparison(comparator, orderedItemsMatrix); 130 } 131 testThenComparingInt()132 public void testThenComparingInt() { 133 Comparator<Item> comparator = Comparator.comparingInt(Item::getOrderAsInt) 134 .thenComparingInt(Item::getSecondaryOrderAsInt); 135 checkComparison(comparator, orderedItemsMatrix); 136 } 137 testThenComparingLong()138 public void testThenComparingLong() { 139 Comparator<Item> comparator = Comparator.comparingLong(Item::getOrderAsLong) 140 .thenComparingLong(Item::getSecondaryOrderAsLong); 141 checkComparison(comparator, orderedItemsMatrix); 142 } 143 testThenComparing()144 public void testThenComparing() { 145 Comparator<Item> comparator = Comparator.comparing(Item::getOrderAsString) 146 .thenComparing(Item::getSecondaryOrderAsString); 147 checkComparison(comparator, orderedItemsMatrix); 148 } 149 150 private static final class Item implements Comparable<Item> { 151 private final int primaryOrder; 152 private final int secondaryOrder; 153 Item(int primaryOrder)154 public Item(int primaryOrder) { 155 this(primaryOrder, 0); 156 } 157 Item(int primaryOrder, int secondaryOrder)158 public Item(int primaryOrder, int secondaryOrder) { 159 this.primaryOrder = primaryOrder; 160 this.secondaryOrder = secondaryOrder; 161 } 162 getOrderAsInt()163 public Integer getOrderAsInt() { 164 return primaryOrder; 165 } 166 getOrderAsLong()167 public Long getOrderAsLong() { 168 return Long.valueOf(primaryOrder); 169 } 170 getOrderAsDouble()171 public Double getOrderAsDouble() { 172 return Double.valueOf(primaryOrder); 173 } 174 getOrderAsString()175 public String getOrderAsString() { 176 return String.valueOf(primaryOrder); 177 } 178 getSecondaryOrderAsInt()179 public Integer getSecondaryOrderAsInt() { 180 return secondaryOrder; 181 } 182 getSecondaryOrderAsLong()183 public Long getSecondaryOrderAsLong() { 184 return Long.valueOf(secondaryOrder); 185 } 186 getSecondaryOrderAsDouble()187 public Double getSecondaryOrderAsDouble() { 188 return Double.valueOf(secondaryOrder); 189 } 190 getSecondaryOrderAsString()191 public String getSecondaryOrderAsString() { 192 return String.valueOf(secondaryOrder); 193 } 194 195 @Override compareTo(Item other)196 public int compareTo(Item other) { 197 return primaryOrder - other.getOrderAsInt() != 0 ? 198 primaryOrder - other.getOrderAsInt() : 199 secondaryOrder - other.getSecondaryOrderAsInt(); 200 } 201 } 202 203 } 204