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.base.Objects; 22 23 import junit.framework.TestCase; 24 25 import java.util.Arrays; 26 import java.util.List; 27 28 /** 29 * Tests for {@code GeneralRange}. 30 * 31 * @author Louis Wasserman 32 */ 33 @GwtCompatible(emulated = true) 34 public class GeneralRangeTest extends TestCase { 35 private static final Ordering<Integer> ORDERING = Ordering.natural().nullsFirst(); 36 37 private static final List<Integer> IN_ORDER_VALUES = Arrays.asList(null, 1, 2, 3, 4, 5); 38 39 public void testCreateEmptyRangeFails() { 40 for (BoundType lboundType : BoundType.values()) { 41 for (BoundType uboundType : BoundType.values()) { 42 try { 43 GeneralRange.range(ORDERING, 4, lboundType, 2, uboundType); 44 fail("Expected IAE"); 45 } catch (IllegalArgumentException expected) {} 46 } 47 } 48 } 49 50 public void testCreateEmptyRangeOpenOpenFails() { 51 for (Integer i : IN_ORDER_VALUES) { 52 try { 53 GeneralRange.range(ORDERING, i, OPEN, i, OPEN); 54 fail("Expected IAE"); 55 } catch (IllegalArgumentException expected) {} 56 } 57 } 58 59 public void testCreateEmptyRangeClosedOpenSucceeds() { 60 for (Integer i : IN_ORDER_VALUES) { 61 GeneralRange<Integer> range = GeneralRange.range(ORDERING, i, CLOSED, i, OPEN); 62 for (Integer j : IN_ORDER_VALUES) { 63 assertFalse(range.contains(j)); 64 } 65 } 66 } 67 68 public void testCreateEmptyRangeOpenClosedSucceeds() { 69 for (Integer i : IN_ORDER_VALUES) { 70 GeneralRange<Integer> range = GeneralRange.range(ORDERING, i, OPEN, i, CLOSED); 71 for (Integer j : IN_ORDER_VALUES) { 72 assertFalse(range.contains(j)); 73 } 74 } 75 } 76 77 public void testCreateSingletonRangeSucceeds() { 78 for (Integer i : IN_ORDER_VALUES) { 79 GeneralRange<Integer> range = GeneralRange.range(ORDERING, i, CLOSED, i, CLOSED); 80 for (Integer j : IN_ORDER_VALUES) { 81 assertEquals(Objects.equal(i, j), range.contains(j)); 82 } 83 } 84 } 85 86 public void testSingletonRange() { 87 GeneralRange<Integer> range = GeneralRange.range(ORDERING, 3, CLOSED, 3, CLOSED); 88 for (Integer i : IN_ORDER_VALUES) { 89 assertEquals(ORDERING.compare(i, 3) == 0, range.contains(i)); 90 } 91 } 92 93 public void testLowerRange() { 94 for (BoundType lBoundType : BoundType.values()) { 95 GeneralRange<Integer> range = GeneralRange.downTo(ORDERING, 3, lBoundType); 96 for (Integer i : IN_ORDER_VALUES) { 97 assertEquals(ORDERING.compare(i, 3) > 0 98 || (ORDERING.compare(i, 3) == 0 && lBoundType == CLOSED), range.contains(i)); 99 assertEquals(ORDERING.compare(i, 3) < 0 100 || (ORDERING.compare(i, 3) == 0 && lBoundType == OPEN), range.tooLow(i)); 101 assertFalse(range.tooHigh(i)); 102 } 103 } 104 } 105 106 public void testUpperRange() { 107 for (BoundType lBoundType : BoundType.values()) { 108 GeneralRange<Integer> range = GeneralRange.upTo(ORDERING, 3, lBoundType); 109 for (Integer i : IN_ORDER_VALUES) { 110 assertEquals(ORDERING.compare(i, 3) < 0 111 || (ORDERING.compare(i, 3) == 0 && lBoundType == CLOSED), range.contains(i)); 112 assertEquals(ORDERING.compare(i, 3) > 0 113 || (ORDERING.compare(i, 3) == 0 && lBoundType == OPEN), range.tooHigh(i)); 114 assertFalse(range.tooLow(i)); 115 } 116 } 117 } 118 119 public void testDoublyBoundedAgainstRange() { 120 for (BoundType lboundType : BoundType.values()) { 121 for (BoundType uboundType : BoundType.values()) { 122 Range<Integer> range = Range.range(2, lboundType, 4, uboundType); 123 GeneralRange<Integer> gRange = GeneralRange.range(ORDERING, 2, lboundType, 4, uboundType); 124 for (Integer i : IN_ORDER_VALUES) { 125 assertEquals(i != null && range.contains(i), gRange.contains(i)); 126 } 127 } 128 } 129 } 130 131 public void testIntersectAgainstMatchingEndpointsRange() { 132 GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, CLOSED, 4, OPEN); 133 assertEquals(GeneralRange.range(ORDERING, 2, OPEN, 4, OPEN), 134 range.intersect(GeneralRange.range(ORDERING, 2, OPEN, 4, CLOSED))); 135 } 136 137 public void testIntersectAgainstBiggerRange() { 138 GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, CLOSED, 4, OPEN); 139 140 assertEquals(GeneralRange.range(ORDERING, 2, CLOSED, 4, OPEN), 141 range.intersect(GeneralRange.range(ORDERING, null, OPEN, 5, CLOSED))); 142 143 assertEquals(GeneralRange.range(ORDERING, 2, OPEN, 4, OPEN), 144 range.intersect(GeneralRange.range(ORDERING, 2, OPEN, 5, CLOSED))); 145 146 assertEquals(GeneralRange.range(ORDERING, 2, CLOSED, 4, OPEN), 147 range.intersect(GeneralRange.range(ORDERING, 1, OPEN, 4, OPEN))); 148 } 149 150 public void testIntersectAgainstSmallerRange() { 151 GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, OPEN, 4, OPEN); 152 assertEquals(GeneralRange.range(ORDERING, 3, CLOSED, 4, OPEN), 153 range.intersect(GeneralRange.range(ORDERING, 3, CLOSED, 4, CLOSED))); 154 } 155 156 public void testIntersectOverlappingRange() { 157 GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, OPEN, 4, CLOSED); 158 assertEquals(GeneralRange.range(ORDERING, 3, CLOSED, 4, CLOSED), 159 range.intersect(GeneralRange.range(ORDERING, 3, CLOSED, 5, CLOSED))); 160 assertEquals(GeneralRange.range(ORDERING, 2, OPEN, 3, OPEN), 161 range.intersect(GeneralRange.range(ORDERING, 1, OPEN, 3, OPEN))); 162 } 163 164 public void testIntersectNonOverlappingRange() { 165 GeneralRange<Integer> range = GeneralRange.range(ORDERING, 2, OPEN, 4, CLOSED); 166 assertTrue(range.intersect(GeneralRange.range(ORDERING, 5, CLOSED, 6, CLOSED)).isEmpty()); 167 assertTrue(range.intersect(GeneralRange.range(ORDERING, 1, OPEN, 2, OPEN)).isEmpty()); 168 } 169 170 public void testFromRangeAll() { 171 assertEquals(GeneralRange.all(Ordering.natural()), GeneralRange.from(Range.all())); 172 } 173 174 public void testFromRangeOneEnd() { 175 for (BoundType endpointType : BoundType.values()) { 176 assertEquals(GeneralRange.upTo(Ordering.natural(), 3, endpointType), 177 GeneralRange.from(Range.upTo(3, endpointType))); 178 179 assertEquals(GeneralRange.downTo(Ordering.natural(), 3, endpointType), 180 GeneralRange.from(Range.downTo(3, endpointType))); 181 } 182 } 183 184 public void testFromRangeTwoEnds() { 185 for (BoundType lowerType : BoundType.values()) { 186 for (BoundType upperType : BoundType.values()) { 187 assertEquals(GeneralRange.range(Ordering.natural(), 3, lowerType, 4, upperType), 188 GeneralRange.from(Range.range(3, lowerType, 4, upperType))); 189 } 190 } 191 } 192 193 public void testReverse() { 194 assertEquals(GeneralRange.all(ORDERING.reverse()), GeneralRange.all(ORDERING).reverse()); 195 assertEquals(GeneralRange.downTo(ORDERING.reverse(), 3, CLOSED), 196 GeneralRange.upTo(ORDERING, 3, CLOSED).reverse()); 197 assertEquals(GeneralRange.upTo(ORDERING.reverse(), 3, OPEN), 198 GeneralRange.downTo(ORDERING, 3, OPEN).reverse()); 199 assertEquals(GeneralRange.range(ORDERING.reverse(), 5, OPEN, 3, CLOSED), 200 GeneralRange.range(ORDERING, 3, CLOSED, 5, OPEN).reverse()); 201 } 202 } 203 204