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