• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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