| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * https://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.commons.lang3; |
| |
| import static org.apache.commons.lang3.LangAssertions.assertIllegalArgumentException; |
| import static org.apache.commons.lang3.LangAssertions.assertNullPointerException; |
| import static org.junit.jupiter.api.Assertions.assertEquals; |
| import static org.junit.jupiter.api.Assertions.assertFalse; |
| import static org.junit.jupiter.api.Assertions.assertNotEquals; |
| import static org.junit.jupiter.api.Assertions.assertNotNull; |
| import static org.junit.jupiter.api.Assertions.assertSame; |
| import static org.junit.jupiter.api.Assertions.assertTrue; |
| |
| import java.util.Comparator; |
| import java.util.stream.LongStream; |
| |
| import org.junit.jupiter.api.BeforeEach; |
| import org.junit.jupiter.api.Test; |
| |
| /** |
| * Tests {@link LongRange}. |
| */ |
| @SuppressWarnings("boxing") |
| class LongRangeTest extends AbstractLangTest { |
| |
| private static LongRange of(final int min, final int max) { |
| return LongRange.of(min, max); |
| } |
| |
| private static LongRange of(final Long min, final Long max) { |
| return LongRange.of(min, max); |
| } |
| |
| private LongRange range1; |
| |
| private LongRange range2; |
| |
| private LongRange range3; |
| |
| private LongRange rangeFull; |
| |
| @BeforeEach |
| public void setUp() { |
| range1 = of(10, 20); |
| range2 = of(10, 20); |
| range3 = of(-2, -1); |
| rangeFull = of(Long.MIN_VALUE, Long.MAX_VALUE); |
| } |
| |
| @Test |
| void testContainsInt() { |
| assertFalse(range1.contains(null)); |
| |
| assertFalse(range1.contains(5L)); |
| assertTrue(range1.contains(10L)); |
| assertTrue(range1.contains(15L)); |
| assertTrue(range1.contains(20L)); |
| assertFalse(range1.contains(25L)); |
| } |
| |
| @Test |
| void testContainsLong() { |
| assertFalse(range1.contains(null)); |
| |
| assertTrue(rangeFull.contains(Long.MAX_VALUE)); |
| assertTrue(rangeFull.contains(Long.MIN_VALUE)); |
| assertTrue(rangeFull.contains((long) Integer.MAX_VALUE + 1)); |
| assertTrue(rangeFull.contains((long) Integer.MIN_VALUE - 1)); |
| assertTrue(rangeFull.contains((long) Integer.MAX_VALUE)); |
| assertTrue(rangeFull.contains((long) Integer.MIN_VALUE)); |
| |
| assertFalse(range1.contains(5L)); |
| assertTrue(range1.contains(10L)); |
| assertTrue(range1.contains(15L)); |
| assertTrue(range1.contains(20L)); |
| assertFalse(range1.contains(25L)); |
| } |
| |
| @Test |
| void testContainsRange() { |
| |
| // null handling |
| assertFalse(range1.containsRange(null)); |
| |
| // easy inside range |
| assertTrue(range1.containsRange(Range.of(12L, 18L))); |
| assertTrue(range1.containsRange(of(12, 18))); |
| |
| // outside range on each side |
| assertFalse(range1.containsRange(Range.of(32L, 45L))); |
| assertFalse(range1.containsRange(of(32, 45))); |
| assertFalse(range1.containsRange(Range.of(2L, 8L))); |
| assertFalse(range1.containsRange(of(2, 8))); |
| |
| // equals range |
| assertTrue(range1.containsRange(Range.of(10L, 20L))); |
| assertTrue(range1.containsRange(of(10, 20))); |
| |
| // overlaps |
| assertFalse(range1.containsRange(Range.of(9L, 14L))); |
| assertFalse(range1.containsRange(of(9, 14))); |
| assertFalse(range1.containsRange(Range.of(16L, 21L))); |
| assertFalse(range1.containsRange(of(16, 21))); |
| |
| // touches lower boundary |
| assertTrue(range1.containsRange(Range.of(10L, 19L))); |
| assertTrue(range1.containsRange(of(10, 19))); |
| assertFalse(range1.containsRange(Range.of(10L, 21L))); |
| assertFalse(range1.containsRange(of(10, 21))); |
| |
| // touches upper boundary |
| assertTrue(range1.containsRange(Range.of(11L, 20L))); |
| assertTrue(range1.containsRange(of(11, 20))); |
| assertFalse(range1.containsRange(Range.of(9L, 20L))); |
| assertFalse(range1.containsRange(of(9, 20))); |
| |
| // negative |
| assertFalse(range1.containsRange(Range.of(-11L, -18L))); |
| assertFalse(range1.containsRange(of(-11, -18))); |
| } |
| |
| @Test |
| void testElementCompareTo() { |
| assertNullPointerException(() -> range1.elementCompareTo(null)); |
| |
| assertEquals(-1, range1.elementCompareTo(5L)); |
| assertEquals(0, range1.elementCompareTo(10L)); |
| assertEquals(0, range1.elementCompareTo(15L)); |
| assertEquals(0, range1.elementCompareTo(20L)); |
| assertEquals(1, range1.elementCompareTo(25L)); |
| } |
| |
| @Test |
| void testEqualsObject() { |
| assertEquals(range1, range1); |
| assertEquals(range1, range2); |
| assertEquals(range2, range2); |
| assertEquals(range1, range1); |
| assertEquals(range2, range2); |
| assertEquals(range3, range3); |
| assertNotEquals(range2, range3); |
| assertNotEquals(null, range2); |
| assertNotEquals("Ni!", range2); |
| } |
| |
| @Test |
| void testFit() { |
| assertEquals(range1.getMinimum(), range1.fit(Integer.MIN_VALUE)); |
| assertEquals(range1.getMinimum(), range1.fit(range1.getMinimum())); |
| assertEquals(range1.getMaximum(), range1.fit(Integer.MAX_VALUE)); |
| assertEquals(range1.getMaximum(), range1.fit(range1.getMaximum())); |
| assertEquals(15, range1.fit(15L)); |
| } |
| |
| @Test |
| void testFitNull() { |
| assertNullPointerException(() -> { |
| range1.fit(null); |
| }); |
| } |
| |
| @Test |
| void testGetMaximum() { |
| assertEquals(20, range1.getMaximum()); |
| } |
| |
| @Test |
| void testGetMinimum() { |
| assertEquals(10, range1.getMinimum()); |
| } |
| |
| @Test |
| void testHashCode() { |
| assertEquals(range1.hashCode(), range2.hashCode()); |
| assertNotEquals(range1.hashCode(), range3.hashCode()); |
| |
| assertEquals(range1.hashCode(), range1.hashCode()); |
| assertTrue(range1.hashCode() != 0); |
| } |
| |
| @Test |
| void testIntersectionWith() { |
| assertSame(range1, range1.intersectionWith(range1)); |
| |
| assertEquals(Range.of(10L, 15L), range1.intersectionWith(Range.of(5L, 15L))); |
| } |
| |
| @Test |
| void testIntersectionWithNonOverlapping() { |
| assertIllegalArgumentException(() -> range1.intersectionWith(Range.of(0L, 9L))); |
| } |
| |
| @Test |
| void testIntersectionWithNull() { |
| assertIllegalArgumentException(() -> range1.intersectionWith(null)); |
| } |
| |
| @Test |
| void testIsAfter() { |
| assertFalse(range1.isAfter(null)); |
| |
| assertTrue(range1.isAfter(5L)); |
| assertFalse(range1.isAfter(10L)); |
| assertFalse(range1.isAfter(15L)); |
| assertFalse(range1.isAfter(20L)); |
| assertFalse(range1.isAfter(25L)); |
| } |
| |
| @Test |
| void testIsAfterRange() { |
| assertFalse(range1.isAfterRange(null)); |
| |
| assertTrue(range1.isAfterRange(Range.of(5L, 9L))); |
| |
| assertFalse(range1.isAfterRange(Range.of(5L, 10L))); |
| assertFalse(range1.isAfterRange(Range.of(5L, 20L))); |
| assertFalse(range1.isAfterRange(Range.of(5L, 25L))); |
| assertFalse(range1.isAfterRange(Range.of(15L, 25L))); |
| |
| assertFalse(range1.isAfterRange(Range.of(21L, 25L))); |
| |
| assertFalse(range1.isAfterRange(Range.of(10L, 20L))); |
| } |
| |
| @Test |
| void testIsBefore() { |
| assertFalse(range1.isBefore(null)); |
| |
| assertFalse(range1.isBefore(5L)); |
| assertFalse(range1.isBefore(10L)); |
| assertFalse(range1.isBefore(15L)); |
| assertFalse(range1.isBefore(20L)); |
| assertTrue(range1.isBefore(25L)); |
| } |
| |
| @Test |
| void testIsBeforeIntegerRange() { |
| assertFalse(range1.isBeforeRange(null)); |
| |
| assertFalse(range1.isBeforeRange(of(5, 9))); |
| |
| assertFalse(range1.isBeforeRange(of(5, 10))); |
| assertFalse(range1.isBeforeRange(of(5, 20))); |
| assertFalse(range1.isBeforeRange(of(5, 25))); |
| assertFalse(range1.isBeforeRange(of(15, 25))); |
| |
| assertTrue(range1.isBeforeRange(of(21, 25))); |
| |
| assertFalse(range1.isBeforeRange(of(10, 20))); |
| } |
| |
| @Test |
| void testIsBeforeRange() { |
| assertFalse(range1.isBeforeRange(null)); |
| |
| assertFalse(range1.isBeforeRange(Range.of(5L, 9L))); |
| |
| assertFalse(range1.isBeforeRange(Range.of(5L, 10L))); |
| assertFalse(range1.isBeforeRange(Range.of(5L, 20L))); |
| assertFalse(range1.isBeforeRange(Range.of(5L, 25L))); |
| assertFalse(range1.isBeforeRange(Range.of(15L, 25L))); |
| |
| assertTrue(range1.isBeforeRange(Range.of(21L, 25L))); |
| |
| assertFalse(range1.isBeforeRange(Range.of(10L, 20L))); |
| } |
| |
| @Test |
| void testIsEndedBy() { |
| assertFalse(range1.isEndedBy(null)); |
| |
| assertFalse(range1.isEndedBy(5L)); |
| assertFalse(range1.isEndedBy(10L)); |
| assertFalse(range1.isEndedBy(15L)); |
| assertTrue(range1.isEndedBy(20L)); |
| assertFalse(range1.isEndedBy(25L)); |
| } |
| |
| @Test |
| void testIsOverlappedByIntegerRange() { |
| |
| // null handling |
| assertFalse(range1.isOverlappedBy(null)); |
| |
| // easy inside range |
| assertTrue(range1.isOverlappedBy(of(12, 18))); |
| |
| // outside range on each side |
| assertFalse(range1.isOverlappedBy(of(32, 45))); |
| assertFalse(range1.isOverlappedBy(of(2, 8))); |
| |
| // equals range |
| assertTrue(range1.isOverlappedBy(of(10, 20))); |
| |
| // overlaps |
| assertTrue(range1.isOverlappedBy(of(9, 14))); |
| assertTrue(range1.isOverlappedBy(of(16, 21))); |
| |
| // touches lower boundary |
| assertTrue(range1.isOverlappedBy(of(10, 19))); |
| assertTrue(range1.isOverlappedBy(of(10, 21))); |
| |
| // touches upper boundary |
| assertTrue(range1.isOverlappedBy(of(11, 20))); |
| assertTrue(range1.isOverlappedBy(of(9, 20))); |
| |
| // negative |
| assertFalse(range1.isOverlappedBy(of(-11, -18))); |
| |
| // outside range whole range |
| assertTrue(range1.isOverlappedBy(of(9, 21))); |
| } |
| |
| @Test |
| void testIsOverlappedByRange() { |
| |
| // null handling |
| assertFalse(range1.isOverlappedBy(null)); |
| |
| // easy inside range |
| assertTrue(range1.isOverlappedBy(Range.of(12L, 18L))); |
| |
| // outside range on each side |
| assertFalse(range1.isOverlappedBy(Range.of(32L, 45L))); |
| assertFalse(range1.isOverlappedBy(Range.of(2L, 8L))); |
| |
| // equals range |
| assertTrue(range1.isOverlappedBy(Range.of(10L, 20L))); |
| |
| // overlaps |
| assertTrue(range1.isOverlappedBy(Range.of(9L, 14L))); |
| assertTrue(range1.isOverlappedBy(Range.of(16L, 21L))); |
| |
| // touches lower boundary |
| assertTrue(range1.isOverlappedBy(Range.of(10L, 19L))); |
| assertTrue(range1.isOverlappedBy(Range.of(10L, 21L))); |
| |
| // touches upper boundary |
| assertTrue(range1.isOverlappedBy(Range.of(11L, 20L))); |
| assertTrue(range1.isOverlappedBy(Range.of(9L, 20L))); |
| |
| // negative |
| assertFalse(range1.isOverlappedBy(Range.of(-11L, -18L))); |
| |
| // outside range whole range |
| assertTrue(range1.isOverlappedBy(Range.of(9L, 21L))); |
| } |
| |
| @Test |
| void testIsStartedBy() { |
| assertFalse(range1.isStartedBy(null)); |
| |
| assertFalse(range1.isStartedBy(5L)); |
| assertTrue(range1.isStartedBy(10L)); |
| assertFalse(range1.isStartedBy(15L)); |
| assertFalse(range1.isStartedBy(20L)); |
| assertFalse(range1.isStartedBy(25L)); |
| } |
| |
| @Test |
| void testIsWithCompareRange() { |
| // all integers are equal |
| final Comparator<Integer> c = (o1, o2) -> 0; |
| Range<Integer> ri = Range.is(10); |
| assertFalse(ri.contains(null), "should not contain null"); |
| assertTrue(ri.contains(10), "should contain 10"); |
| assertFalse(ri.contains(11), "should not contain 11"); |
| ri = Range.is(10, c); |
| assertFalse(ri.contains(null), "should not contain null"); |
| assertTrue(ri.contains(10), "should contain 10"); |
| assertTrue(ri.contains(11), "should contain 11"); |
| } |
| |
| @Test |
| void testOfWithContains() { |
| // all integers are equal |
| final LongRange rb = of(-10, 20); |
| assertFalse(rb.contains(null), "should not contain null"); |
| assertTrue(rb.contains(10L), "should contain 10"); |
| assertTrue(rb.contains(-10L), "should contain -10"); |
| assertFalse(rb.contains(21L), "should not contain 21"); |
| assertFalse(rb.contains(-11L), "should not contain -11"); |
| |
| assertNullPointerException(() -> of(null, null)); |
| } |
| |
| @Test |
| void testRangeOfChars() { |
| final LongRange chars = of((long) 'a', (long) 'z'); |
| assertTrue(chars.contains((long) 'b')); |
| assertFalse(chars.contains((long) 'B')); |
| } |
| |
| @Test |
| void testSerializing() { |
| SerializationUtils.clone(range1); |
| } |
| |
| @Test |
| void testToIntStream() { |
| try (LongStream stream = range1.toLongStream()) { |
| assertEquals(165, stream.sum()); |
| } |
| } |
| |
| @Test |
| void testToString() { |
| assertNotNull(range1.toString()); |
| |
| final String str = range1.toString(); |
| assertEquals("[10..20]", str); |
| assertEquals("[-20..-10]", Range.of(-20, -10).toString()); |
| } |
| |
| @Test |
| void testToStringFormat() { |
| final String str = range1.toString("From %1$s to %2$s"); |
| assertEquals("From 10 to 20", str); |
| } |
| } |