1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.commons.lang3; 19 20 import static org.junit.jupiter.api.Assertions.assertEquals; 21 import static org.junit.jupiter.api.Assertions.assertFalse; 22 import static org.junit.jupiter.api.Assertions.assertNotEquals; 23 import static org.junit.jupiter.api.Assertions.assertNotNull; 24 import static org.junit.jupiter.api.Assertions.assertSame; 25 import static org.junit.jupiter.api.Assertions.assertThrows; 26 import static org.junit.jupiter.api.Assertions.assertTrue; 27 28 import java.util.Comparator; 29 30 import org.junit.jupiter.api.BeforeEach; 31 import org.junit.jupiter.api.Test; 32 33 /** 34 * Tests {@link IntegerRange}. 35 */ 36 @SuppressWarnings("boxing") 37 public class IntegerRangeTest extends AbstractLangTest { 38 of(final int min, final int max)39 private static IntegerRange of(final int min, final int max) { 40 return IntegerRange.of(min, max); 41 } 42 of(final Integer min, final Integer max)43 private static IntegerRange of(final Integer min, final Integer max) { 44 return IntegerRange.of(min, max); 45 } 46 47 private IntegerRange range1; 48 49 private IntegerRange range2; 50 51 private IntegerRange range3; 52 53 private IntegerRange rangeFull; 54 55 @BeforeEach setUp()56 public void setUp() { 57 range1 = of(10, 20); 58 range2 = of(10, 20); 59 range3 = of(-2, -1); 60 rangeFull = of(Integer.MIN_VALUE, Integer.MAX_VALUE); 61 } 62 63 @Test testContainsInt()64 public void testContainsInt() { 65 assertFalse(range1.contains(null)); 66 67 assertTrue(rangeFull.contains(Integer.MIN_VALUE)); 68 assertTrue(rangeFull.contains(Integer.MAX_VALUE)); 69 70 assertFalse(range1.contains(5)); 71 assertTrue(range1.contains(10)); 72 assertTrue(range1.contains(15)); 73 assertTrue(range1.contains(20)); 74 assertFalse(range1.contains(25)); 75 } 76 77 @Test testContainsRange()78 public void testContainsRange() { 79 80 // null handling 81 assertFalse(range1.containsRange(null)); 82 83 // easy inside range 84 assertTrue(range1.containsRange(Range.of(12, 18))); 85 assertTrue(range1.containsRange(of(12, 18))); 86 87 // outside range on each side 88 assertFalse(range1.containsRange(Range.of(32, 45))); 89 assertFalse(range1.containsRange(of(32, 45))); 90 assertFalse(range1.containsRange(Range.of(2, 8))); 91 assertFalse(range1.containsRange(of(2, 8))); 92 93 // equals range 94 assertTrue(range1.containsRange(Range.of(10, 20))); 95 assertTrue(range1.containsRange(of(10, 20))); 96 97 // overlaps 98 assertFalse(range1.containsRange(Range.of(9, 14))); 99 assertFalse(range1.containsRange(of(9, 14))); 100 assertFalse(range1.containsRange(Range.of(16, 21))); 101 assertFalse(range1.containsRange(of(16, 21))); 102 103 // touches lower boundary 104 assertTrue(range1.containsRange(Range.of(10, 19))); 105 assertTrue(range1.containsRange(of(10, 19))); 106 assertFalse(range1.containsRange(Range.of(10, 21))); 107 assertFalse(range1.containsRange(of(10, 21))); 108 109 // touches upper boundary 110 assertTrue(range1.containsRange(Range.of(11, 20))); 111 assertTrue(range1.containsRange(of(11, 20))); 112 assertFalse(range1.containsRange(Range.of(9, 20))); 113 assertFalse(range1.containsRange(of(9, 20))); 114 115 // negative 116 assertFalse(range1.containsRange(Range.of(-11, -18))); 117 assertFalse(range1.containsRange(of(-11, -18))); 118 } 119 120 @Test testElementCompareTo()121 public void testElementCompareTo() { 122 assertThrows(NullPointerException.class, () -> range1.elementCompareTo(null)); 123 124 assertEquals(-1, range1.elementCompareTo(5)); 125 assertEquals(0, range1.elementCompareTo(10)); 126 assertEquals(0, range1.elementCompareTo(15)); 127 assertEquals(0, range1.elementCompareTo(20)); 128 assertEquals(1, range1.elementCompareTo(25)); 129 } 130 131 @Test testEqualsObject()132 public void testEqualsObject() { 133 assertEquals(range1, range1); 134 assertEquals(range1, range2); 135 assertEquals(range2, range2); 136 assertEquals(range1, range1); 137 assertEquals(range2, range2); 138 assertEquals(range3, range3); 139 assertNotEquals(range2, range3); 140 assertNotEquals(null, range2); 141 assertNotEquals("Ni!", range2); 142 } 143 144 @Test testFit()145 public void testFit() { 146 assertEquals(range1.getMinimum(), range1.fit(Integer.MIN_VALUE)); 147 assertEquals(range1.getMinimum(), range1.fit(range1.getMinimum())); 148 assertEquals(range1.getMaximum(), range1.fit(Integer.MAX_VALUE)); 149 assertEquals(range1.getMaximum(), range1.fit(range1.getMaximum())); 150 assertEquals(15, range1.fit(15)); 151 } 152 153 @Test testFitNull()154 public void testFitNull() { 155 assertThrows(NullPointerException.class, () -> { 156 range1.fit(null); 157 }); 158 } 159 160 @Test testGetMaximum()161 public void testGetMaximum() { 162 assertEquals(20, (int) range1.getMaximum()); 163 } 164 165 @Test testGetMinimum()166 public void testGetMinimum() { 167 assertEquals(10, (int) range1.getMinimum()); 168 } 169 170 @Test testHashCode()171 public void testHashCode() { 172 assertEquals(range1.hashCode(), range2.hashCode()); 173 assertNotEquals(range1.hashCode(), range3.hashCode()); 174 175 assertEquals(range1.hashCode(), range1.hashCode()); 176 assertTrue(range1.hashCode() != 0); 177 } 178 179 @Test testIntersectionWith()180 public void testIntersectionWith() { 181 assertSame(range1, range1.intersectionWith(range1)); 182 183 assertEquals(Range.of(10, 15), range1.intersectionWith(Range.of(5, 15))); 184 } 185 186 @Test testIntersectionWithNonOverlapping()187 public void testIntersectionWithNonOverlapping() { 188 assertThrows(IllegalArgumentException.class, () -> range1.intersectionWith(Range.of(0, 9))); 189 } 190 191 @Test testIntersectionWithNull()192 public void testIntersectionWithNull() { 193 assertThrows(IllegalArgumentException.class, () -> range1.intersectionWith(null)); 194 } 195 196 @Test testIsAfter()197 public void testIsAfter() { 198 assertFalse(range1.isAfter(null)); 199 200 assertTrue(range1.isAfter(5)); 201 assertFalse(range1.isAfter(10)); 202 assertFalse(range1.isAfter(15)); 203 assertFalse(range1.isAfter(20)); 204 assertFalse(range1.isAfter(25)); 205 } 206 207 @Test testIsAfterRange()208 public void testIsAfterRange() { 209 assertFalse(range1.isAfterRange(null)); 210 211 assertTrue(range1.isAfterRange(Range.of(5, 9))); 212 213 assertFalse(range1.isAfterRange(Range.of(5, 10))); 214 assertFalse(range1.isAfterRange(Range.of(5, 20))); 215 assertFalse(range1.isAfterRange(Range.of(5, 25))); 216 assertFalse(range1.isAfterRange(Range.of(15, 25))); 217 218 assertFalse(range1.isAfterRange(Range.of(21, 25))); 219 220 assertFalse(range1.isAfterRange(Range.of(10, 20))); 221 } 222 223 @Test testIsBefore()224 public void testIsBefore() { 225 assertFalse(range1.isBefore(null)); 226 227 assertFalse(range1.isBefore(5)); 228 assertFalse(range1.isBefore(10)); 229 assertFalse(range1.isBefore(15)); 230 assertFalse(range1.isBefore(20)); 231 assertTrue(range1.isBefore(25)); 232 } 233 234 @Test testIsBeforeIntegerRange()235 public void testIsBeforeIntegerRange() { 236 assertFalse(range1.isBeforeRange(null)); 237 238 assertFalse(range1.isBeforeRange(of(5, 9))); 239 240 assertFalse(range1.isBeforeRange(of(5, 10))); 241 assertFalse(range1.isBeforeRange(of(5, 20))); 242 assertFalse(range1.isBeforeRange(of(5, 25))); 243 assertFalse(range1.isBeforeRange(of(15, 25))); 244 245 assertTrue(range1.isBeforeRange(of(21, 25))); 246 247 assertFalse(range1.isBeforeRange(of(10, 20))); 248 } 249 250 @Test testIsBeforeRange()251 public void testIsBeforeRange() { 252 assertFalse(range1.isBeforeRange(null)); 253 254 assertFalse(range1.isBeforeRange(Range.of(5, 9))); 255 256 assertFalse(range1.isBeforeRange(Range.of(5, 10))); 257 assertFalse(range1.isBeforeRange(Range.of(5, 20))); 258 assertFalse(range1.isBeforeRange(Range.of(5, 25))); 259 assertFalse(range1.isBeforeRange(Range.of(15, 25))); 260 261 assertTrue(range1.isBeforeRange(Range.of(21, 25))); 262 263 assertFalse(range1.isBeforeRange(Range.of(10, 20))); 264 } 265 266 @Test testIsEndedBy()267 public void testIsEndedBy() { 268 assertFalse(range1.isEndedBy(null)); 269 270 assertFalse(range1.isEndedBy(5)); 271 assertFalse(range1.isEndedBy(10)); 272 assertFalse(range1.isEndedBy(15)); 273 assertTrue(range1.isEndedBy(20)); 274 assertFalse(range1.isEndedBy(25)); 275 } 276 277 @Test testIsOverlappedByIntegerRange()278 public void testIsOverlappedByIntegerRange() { 279 280 // null handling 281 assertFalse(range1.isOverlappedBy(null)); 282 283 // easy inside range 284 assertTrue(range1.isOverlappedBy(of(12, 18))); 285 286 // outside range on each side 287 assertFalse(range1.isOverlappedBy(of(32, 45))); 288 assertFalse(range1.isOverlappedBy(of(2, 8))); 289 290 // equals range 291 assertTrue(range1.isOverlappedBy(of(10, 20))); 292 293 // overlaps 294 assertTrue(range1.isOverlappedBy(of(9, 14))); 295 assertTrue(range1.isOverlappedBy(of(16, 21))); 296 297 // touches lower boundary 298 assertTrue(range1.isOverlappedBy(of(10, 19))); 299 assertTrue(range1.isOverlappedBy(of(10, 21))); 300 301 // touches upper boundary 302 assertTrue(range1.isOverlappedBy(of(11, 20))); 303 assertTrue(range1.isOverlappedBy(of(9, 20))); 304 305 // negative 306 assertFalse(range1.isOverlappedBy(of(-11, -18))); 307 308 // outside range whole range 309 assertTrue(range1.isOverlappedBy(of(9, 21))); 310 } 311 312 @Test testIsOverlappedByRange()313 public void testIsOverlappedByRange() { 314 315 // null handling 316 assertFalse(range1.isOverlappedBy(null)); 317 318 // easy inside range 319 assertTrue(range1.isOverlappedBy(Range.of(12, 18))); 320 321 // outside range on each side 322 assertFalse(range1.isOverlappedBy(Range.of(32, 45))); 323 assertFalse(range1.isOverlappedBy(Range.of(2, 8))); 324 325 // equals range 326 assertTrue(range1.isOverlappedBy(Range.of(10, 20))); 327 328 // overlaps 329 assertTrue(range1.isOverlappedBy(Range.of(9, 14))); 330 assertTrue(range1.isOverlappedBy(Range.of(16, 21))); 331 332 // touches lower boundary 333 assertTrue(range1.isOverlappedBy(Range.of(10, 19))); 334 assertTrue(range1.isOverlappedBy(Range.of(10, 21))); 335 336 // touches upper boundary 337 assertTrue(range1.isOverlappedBy(Range.of(11, 20))); 338 assertTrue(range1.isOverlappedBy(Range.of(9, 20))); 339 340 // negative 341 assertFalse(range1.isOverlappedBy(Range.of(-11, -18))); 342 343 // outside range whole range 344 assertTrue(range1.isOverlappedBy(Range.of(9, 21))); 345 } 346 347 @Test testIsStartedBy()348 public void testIsStartedBy() { 349 assertFalse(range1.isStartedBy(null)); 350 351 assertFalse(range1.isStartedBy(5)); 352 assertTrue(range1.isStartedBy(10)); 353 assertFalse(range1.isStartedBy(15)); 354 assertFalse(range1.isStartedBy(20)); 355 assertFalse(range1.isStartedBy(25)); 356 } 357 358 @Test testIsWithCompareRange()359 public void testIsWithCompareRange() { 360 // all integers are equal 361 final Comparator<Integer> c = (o1, o2) -> 0; 362 Range<Integer> ri = Range.is(10); 363 assertFalse(ri.contains(null), "should not contain null"); 364 assertTrue(ri.contains(10), "should contain 10"); 365 assertFalse(ri.contains(11), "should not contain 11"); 366 ri = Range.is(10, c); 367 assertFalse(ri.contains(null), "should not contain null"); 368 assertTrue(ri.contains(10), "should contain 10"); 369 assertTrue(ri.contains(11), "should contain 11"); 370 } 371 372 @Test testOfWithContains()373 public void testOfWithContains() { 374 // all integers are equal 375 final IntegerRange rb = of(-10, 20); 376 assertFalse(rb.contains(null), "should not contain null"); 377 assertTrue(rb.contains(10), "should contain 10"); 378 assertTrue(rb.contains(-10), "should contain -10"); 379 assertFalse(rb.contains(21), "should not contain 21"); 380 assertFalse(rb.contains(-11), "should not contain -11"); 381 382 assertThrows(NullPointerException.class, () -> of(null, null)); 383 } 384 385 @Test testRangeOfChars()386 public void testRangeOfChars() { 387 final IntegerRange chars = of('a', 'z'); 388 assertTrue(chars.contains((int) 'b')); 389 assertFalse(chars.contains((int) 'B')); 390 } 391 392 @Test testSerializing()393 public void testSerializing() { 394 SerializationUtils.clone(range1); 395 } 396 397 @Test testToString()398 public void testToString() { 399 assertNotNull(range1.toString()); 400 401 final String str = range1.toString(); 402 assertEquals("[10..20]", str); 403 assertEquals("[-20..-10]", Range.of(-20, -10).toString()); 404 } 405 406 @Test testToStringFormat()407 public void testToStringFormat() { 408 final String str = range1.toString("From %1$s to %2$s"); 409 assertEquals("From 10 to 20", str); 410 } 411 } 412