• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the
10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11  * express or implied. See the License for the specific language governing permissions and
12  * limitations under the License.
13  */
14 
15 package com.google.common.collect;
16 
17 import static com.google.common.collect.BoundType.CLOSED;
18 import static com.google.common.collect.BoundType.OPEN;
19 
20 import com.google.common.annotations.GwtCompatible;
21 import com.google.common.annotations.GwtIncompatible;
22 import com.google.common.annotations.J2ktIncompatible;
23 import com.google.common.base.Objects;
24 import com.google.common.testing.NullPointerTester;
25 import java.util.Arrays;
26 import java.util.List;
27 import junit.framework.TestCase;
28 import org.checkerframework.checker.nullness.qual.Nullable;
29 
30 /**
31  * Tests for {@code GeneralRange}.
32  *
33  * @author Louis Wasserman
34  */
35 @GwtCompatible(emulated = true)
36 @ElementTypesAreNonnullByDefault
37 public class GeneralRangeTest extends TestCase {
38   private static final Ordering<@Nullable Integer> ORDERING =
39       Ordering.<Integer>natural().<Integer>nullsFirst();
40 
41   private static final List<@Nullable Integer> IN_ORDER_VALUES = Arrays.asList(null, 1, 2, 3, 4, 5);
42 
testCreateEmptyRangeFails()43   public void testCreateEmptyRangeFails() {
44     for (BoundType lboundType : BoundType.values()) {
45       for (BoundType uboundType : BoundType.values()) {
46         try {
47           GeneralRange.range(ORDERING, 4, lboundType, 2, uboundType);
48           fail("Expected IAE");
49         } catch (IllegalArgumentException expected) {
50         }
51       }
52     }
53   }
54 
testCreateEmptyRangeOpenOpenFails()55   public void testCreateEmptyRangeOpenOpenFails() {
56     for (Integer i : IN_ORDER_VALUES) {
57       try {
58         GeneralRange.<@Nullable Integer>range(ORDERING, i, OPEN, i, OPEN);
59         fail("Expected IAE");
60       } catch (IllegalArgumentException expected) {
61       }
62     }
63   }
64 
testCreateEmptyRangeClosedOpenSucceeds()65   public void testCreateEmptyRangeClosedOpenSucceeds() {
66     for (Integer i : IN_ORDER_VALUES) {
67       GeneralRange<@Nullable Integer> range = GeneralRange.range(ORDERING, i, CLOSED, i, OPEN);
68       for (Integer j : IN_ORDER_VALUES) {
69         assertFalse(range.contains(j));
70       }
71     }
72   }
73 
testCreateEmptyRangeOpenClosedSucceeds()74   public void testCreateEmptyRangeOpenClosedSucceeds() {
75     for (Integer i : IN_ORDER_VALUES) {
76       GeneralRange<@Nullable Integer> range = GeneralRange.range(ORDERING, i, OPEN, i, CLOSED);
77       for (Integer j : IN_ORDER_VALUES) {
78         assertFalse(range.contains(j));
79       }
80     }
81   }
82 
testCreateSingletonRangeSucceeds()83   public void testCreateSingletonRangeSucceeds() {
84     for (Integer i : IN_ORDER_VALUES) {
85       GeneralRange<@Nullable Integer> range = GeneralRange.range(ORDERING, i, CLOSED, i, CLOSED);
86       for (Integer j : IN_ORDER_VALUES) {
87         assertEquals(Objects.equal(i, j), range.contains(j));
88       }
89     }
90   }
91 
testSingletonRange()92   public void testSingletonRange() {
93     GeneralRange<@Nullable Integer> range = GeneralRange.range(ORDERING, 3, CLOSED, 3, CLOSED);
94     for (Integer i : IN_ORDER_VALUES) {
95       assertEquals(ORDERING.compare(i, 3) == 0, range.contains(i));
96     }
97   }
98 
testLowerRange()99   public void testLowerRange() {
100     for (BoundType lBoundType : BoundType.values()) {
101       GeneralRange<@Nullable Integer> range = GeneralRange.downTo(ORDERING, 3, lBoundType);
102       for (Integer i : IN_ORDER_VALUES) {
103         assertEquals(
104             ORDERING.compare(i, 3) > 0 || (ORDERING.compare(i, 3) == 0 && lBoundType == CLOSED),
105             range.contains(i));
106         assertEquals(
107             ORDERING.compare(i, 3) < 0 || (ORDERING.compare(i, 3) == 0 && lBoundType == OPEN),
108             range.tooLow(i));
109         assertFalse(range.tooHigh(i));
110       }
111     }
112   }
113 
114   public void testUpperRange() {
115     for (BoundType lBoundType : BoundType.values()) {
116       GeneralRange<@Nullable Integer> range = GeneralRange.upTo(ORDERING, 3, lBoundType);
117       for (Integer i : IN_ORDER_VALUES) {
118         assertEquals(
119             ORDERING.compare(i, 3) < 0 || (ORDERING.compare(i, 3) == 0 && lBoundType == CLOSED),
120             range.contains(i));
121         assertEquals(
122             ORDERING.compare(i, 3) > 0 || (ORDERING.compare(i, 3) == 0 && lBoundType == OPEN),
123             range.tooHigh(i));
124         assertFalse(range.tooLow(i));
125       }
126     }
127   }
128 
129   public void testDoublyBoundedAgainstRange() {
130     for (BoundType lboundType : BoundType.values()) {
131       for (BoundType uboundType : BoundType.values()) {
132         Range<Integer> range = Range.range(2, lboundType, 4, uboundType);
133         GeneralRange<@Nullable Integer> gRange =
134             GeneralRange.range(ORDERING, 2, lboundType, 4, uboundType);
135         for (Integer i : IN_ORDER_VALUES) {
136           assertEquals(i != null && range.contains(i), gRange.contains(i));
137         }
138       }
139     }
140   }
141 
142   public void testIntersectAgainstMatchingEndpointsRange() {
143     GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, CLOSED, 4, OPEN);
144     assertEquals(
145         GeneralRange.range(ORDERING, 2, OPEN, 4, OPEN),
146         range.intersect(GeneralRange.range(ORDERING, 2, OPEN, 4, CLOSED)));
147   }
148 
149   public void testIntersectAgainstBiggerRange() {
150     GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, CLOSED, 4, OPEN);
151 
152     assertEquals(
153         GeneralRange.range(ORDERING, 2, CLOSED, 4, OPEN),
154         range.intersect(GeneralRange.<@Nullable Integer>range(ORDERING, null, OPEN, 5, CLOSED)));
155 
156     assertEquals(
157         GeneralRange.range(ORDERING, 2, OPEN, 4, OPEN),
158         range.intersect(GeneralRange.range(ORDERING, 2, OPEN, 5, CLOSED)));
159 
160     assertEquals(
161         GeneralRange.range(ORDERING, 2, CLOSED, 4, OPEN),
162         range.intersect(GeneralRange.range(ORDERING, 1, OPEN, 4, OPEN)));
163   }
164 
165   public void testIntersectAgainstSmallerRange() {
166     GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, OPEN, 4, OPEN);
167     assertEquals(
168         GeneralRange.range(ORDERING, 3, CLOSED, 4, OPEN),
169         range.intersect(GeneralRange.range(ORDERING, 3, CLOSED, 4, CLOSED)));
170   }
171 
172   public void testIntersectOverlappingRange() {
173     GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, OPEN, 4, CLOSED);
174     assertEquals(
175         GeneralRange.range(ORDERING, 3, CLOSED, 4, CLOSED),
176         range.intersect(GeneralRange.range(ORDERING, 3, CLOSED, 5, CLOSED)));
177     assertEquals(
178         GeneralRange.range(ORDERING, 2, OPEN, 3, OPEN),
179         range.intersect(GeneralRange.range(ORDERING, 1, OPEN, 3, OPEN)));
180   }
181 
182   public void testIntersectNonOverlappingRange() {
183     GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, OPEN, 4, CLOSED);
184     assertTrue(range.intersect(GeneralRange.range(ORDERING, 5, CLOSED, 6, CLOSED)).isEmpty());
185     assertTrue(range.intersect(GeneralRange.range(ORDERING, 1, OPEN, 2, OPEN)).isEmpty());
186   }
187 
188   public void testFromRangeAll() {
189     assertEquals(GeneralRange.all(Ordering.natural()), GeneralRange.from(Range.all()));
190   }
191 
192   public void testFromRangeOneEnd() {
193     for (BoundType endpointType : BoundType.values()) {
194       assertEquals(
195           GeneralRange.upTo(Ordering.natural(), 3, endpointType),
196           GeneralRange.from(Range.upTo(3, endpointType)));
197 
198       assertEquals(
199           GeneralRange.downTo(Ordering.natural(), 3, endpointType),
200           GeneralRange.from(Range.downTo(3, endpointType)));
201     }
202   }
203 
204   public void testFromRangeTwoEnds() {
205     for (BoundType lowerType : BoundType.values()) {
206       for (BoundType upperType : BoundType.values()) {
207         assertEquals(
208             GeneralRange.range(Ordering.natural(), 3, lowerType, 4, upperType),
209             GeneralRange.from(Range.range(3, lowerType, 4, upperType)));
210       }
211     }
212   }
213 
214   public void testReverse() {
215     assertEquals(GeneralRange.all(ORDERING.reverse()), GeneralRange.all(ORDERING).reverse());
216     assertEquals(
217         GeneralRange.downTo(ORDERING.reverse(), 3, CLOSED),
218         GeneralRange.upTo(ORDERING, 3, CLOSED).reverse());
219     assertEquals(
220         GeneralRange.upTo(ORDERING.reverse(), 3, OPEN),
221         GeneralRange.downTo(ORDERING, 3, OPEN).reverse());
222     assertEquals(
223         GeneralRange.range(ORDERING.reverse(), 5, OPEN, 3, CLOSED),
224         GeneralRange.range(ORDERING, 3, CLOSED, 5, OPEN).reverse());
225   }
226 
227   @J2ktIncompatible
228   @GwtIncompatible // NullPointerTester
229   public void testNullPointers() {
230     new NullPointerTester().testAllPublicStaticMethods(GeneralRange.class);
231   }
232 }
233