11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BoundType.CLOSED;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BoundType.OPEN;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.DiscreteDomains.integers;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.testing.SerializableTester.reserializeAndAssert;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicate;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.Helpers;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link Range}.
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class RangeTest extends TestCase {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOpen() {
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.open(4, 8);
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkContains(range);
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.lowerEndpoint());
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(OPEN, range.lowerBoundType());
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(8, (int) range.upperEndpoint());
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(OPEN, range.upperBoundType());
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("(4\u20258)", range.toString());
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOpen_invalid() {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Ranges.open(4, 3);
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Ranges.open(3, 3);
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClosed() {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closed(5, 7);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkContains(range);
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, (int) range.lowerEndpoint());
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.lowerBoundType());
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, (int) range.upperEndpoint());
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.upperBoundType());
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[5\u20257]", range.toString());
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClosed_invalid() {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Ranges.closed(4, 3);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOpenClosed() {
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.openClosed(4, 7);
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkContains(range);
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.lowerEndpoint());
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(OPEN, range.lowerBoundType());
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, (int) range.upperEndpoint());
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.upperBoundType());
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("(4\u20257]", range.toString());
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClosedOpen() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closedOpen(5, 8);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkContains(range);
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, (int) range.lowerEndpoint());
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.lowerBoundType());
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(8, (int) range.upperEndpoint());
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(OPEN, range.upperBoundType());
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[5\u20258)", range.toString());
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsConnected() {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Ranges.closed(3, 5).isConnected(Ranges.open(5, 6)));
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Ranges.closed(3, 5).isConnected(Ranges.openClosed(5, 5)));
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Ranges.open(3, 5).isConnected(Ranges.closed(5, 6)));
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Ranges.closed(3, 7).isConnected(Ranges.open(6, 8)));
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Ranges.open(3, 7).isConnected(Ranges.closed(5, 6)));
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Ranges.closed(3, 5).isConnected(Ranges.closed(7, 8)));
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Ranges.closed(3, 5).isConnected(Ranges.closedOpen(7, 7)));
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void checkContains(Range<Integer> range) {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(4));
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(5));
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(7));
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(8));
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSingleton() {
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closed(4, 4);
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(3));
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(4));
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(5));
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.lowerEndpoint());
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.lowerBoundType());
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.upperEndpoint());
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.upperBoundType());
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[4\u20254]", range.toString());
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmpty1() {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closedOpen(4, 4);
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(3));
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(4));
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(5));
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.lowerEndpoint());
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.lowerBoundType());
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.upperEndpoint());
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(OPEN, range.upperBoundType());
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.isEmpty());
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[4\u20254)", range.toString());
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmpty2() {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.openClosed(4, 4);
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(3));
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(4));
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(5));
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.lowerEndpoint());
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(OPEN, range.lowerBoundType());
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.upperEndpoint());
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.upperBoundType());
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.isEmpty());
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("(4\u20254]", range.toString());
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLessThan() {
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.lessThan(5);
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(Integer.MIN_VALUE));
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(4));
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(5));
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertUnboundedBelow(range);
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, (int) range.upperEndpoint());
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(OPEN, range.upperBoundType());
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("(-\u221e\u20255)", range.toString());
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGreaterThan() {
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.greaterThan(5);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(5));
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(6));
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(Integer.MAX_VALUE));
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, (int) range.lowerEndpoint());
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(OPEN, range.lowerBoundType());
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertUnboundedAbove(range);
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("(5\u2025+\u221e)", range.toString());
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAtLeast() {
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.atLeast(6);
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(5));
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(6));
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(Integer.MAX_VALUE));
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasLowerBound());
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(6, (int) range.lowerEndpoint());
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.lowerBoundType());
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertUnboundedAbove(range);
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[6\u2025+\u221e)", range.toString());
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAtMost() {
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.atMost(4);
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(Integer.MIN_VALUE));
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(4));
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.contains(5));
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertUnboundedBelow(range);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.hasUpperBound());
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) range.upperEndpoint());
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(CLOSED, range.upperBoundType());
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("(-\u221e\u20254]", range.toString());
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAll() {
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.all();
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(Integer.MIN_VALUE));
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.contains(Integer.MAX_VALUE));
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertUnboundedBelow(range);
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertUnboundedAbove(range);
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.isEmpty());
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("(-\u221e\u2025+\u221e)", range.toString());
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reserializeAndAssert(range);
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertUnboundedBelow(Range<Integer> range) {
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.hasLowerBound());
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.lowerEndpoint();
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.lowerBoundType();
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertUnboundedAbove(Range<Integer> range) {
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.hasUpperBound());
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.upperEndpoint();
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.upperBoundType();
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOrderingCuts() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cut<Integer> a = Ranges.lessThan(0).lowerBound;
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cut<Integer> b = Ranges.atLeast(0).lowerBound;
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cut<Integer> c = Ranges.greaterThan(0).lowerBound;
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cut<Integer> d = Ranges.atLeast(1).lowerBound;
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cut<Integer> e = Ranges.greaterThan(1).lowerBound;
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cut<Integer> f = Ranges.greaterThan(1).upperBound;
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Helpers.testCompareToAndEquals(ImmutableList.of(a, b, c, d, e, f));
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsAll() {
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closed(3, 5);
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.containsAll(asList(3, 3, 4, 5)));
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.containsAll(asList(3, 3, 4, 5, 6)));
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // We happen to know that natural-order sorted sets use a different code
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // path, so we test that separately
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.containsAll(ImmutableSortedSet.of(3, 3, 4, 5)));
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.containsAll(ImmutableSortedSet.of(3)));
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.containsAll(ImmutableSortedSet.<Integer>of()));
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.containsAll(ImmutableSortedSet.of(3, 3, 4, 5, 6)));
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Ranges.openClosed(3, 3).containsAll(
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.<Integer>emptySet()));
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEncloses_open() {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.open(2, 5);
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(range));
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(Ranges.open(2, 4)));
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(Ranges.open(3, 5)));
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(Ranges.closed(3, 4)));
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.openClosed(2, 5)));
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.closedOpen(2, 5)));
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.closed(1, 4)));
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.closed(3, 6)));
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.greaterThan(3)));
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.lessThan(3)));
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.atLeast(3)));
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.atMost(3)));
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.<Integer>all()));
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEncloses_closed() {
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closed(2, 5);
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(range));
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(Ranges.open(2, 5)));
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(Ranges.openClosed(2, 5)));
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(Ranges.closedOpen(2, 5)));
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(Ranges.closed(3, 5)));
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(range.encloses(Ranges.closed(2, 4)));
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.open(1, 6)));
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.greaterThan(3)));
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.lessThan(3)));
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.atLeast(3)));
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.atMost(3)));
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(range.encloses(Ranges.<Integer>all()));
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIntersection_empty() {
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closedOpen(3, 3);
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(range));
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.intersection(Ranges.open(3, 5));
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.intersection(Ranges.closed(0, 2));
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIntersection_deFactoEmpty() {
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.open(3, 4);
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(range));
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.openClosed(3, 3),
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        range.intersection(Ranges.atMost(3)));
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(4, 4),
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        range.intersection(Ranges.atLeast(4)));
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.intersection(Ranges.lessThan(3));
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.intersection(Ranges.greaterThan(4));
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    range = Ranges.closed(3, 4);
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.openClosed(4, 4),
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        range.intersection(Ranges.greaterThan(4)));
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIntersection_singleton() {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closed(3, 3);
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(range));
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(Ranges.atMost(4)));
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(Ranges.atMost(3)));
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(Ranges.atLeast(3)));
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(Ranges.atLeast(2)));
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(3, 3),
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        range.intersection(Ranges.lessThan(3)));
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.openClosed(3, 3),
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        range.intersection(Ranges.greaterThan(3)));
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.intersection(Ranges.atLeast(4));
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.intersection(Ranges.atMost(2));
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIntersection_general() {
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closed(4, 8);
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // separate below
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.intersection(Ranges.closed(0, 2));
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // adjacent below
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(4, 4),
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        range.intersection(Ranges.closedOpen(2, 4)));
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // overlap below
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(4, 6), range.intersection(Ranges.closed(2, 6)));
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosed with same start
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(4, 6), range.intersection(Ranges.closed(4, 6)));
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosed, interior
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(5, 7), range.intersection(Ranges.closed(5, 7)));
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosed with same end
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(6, 8), range.intersection(Ranges.closed(6, 8)));
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // equal
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(range));
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosing with same start
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(Ranges.closed(4, 10)));
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosing with same end
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(Ranges.closed(2, 8)));
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosing, exterior
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.intersection(Ranges.closed(2, 10)));
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // overlap above
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(6, 8), range.intersection(Ranges.closed(6, 10)));
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // adjacent above
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.openClosed(8, 8),
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        range.intersection(Ranges.openClosed(8, 10)));
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // separate above
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.intersection(Ranges.closed(10, 12));
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSpan_general() {
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.closed(4, 8);
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // separate below
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(0, 8), range.span(Ranges.closed(0, 2)));
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atMost(8), range.span(Ranges.atMost(2)));
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // adjacent below
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(2, 8), range.span(Ranges.closedOpen(2, 4)));
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atMost(8), range.span(Ranges.lessThan(4)));
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // overlap below
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(2, 8), range.span(Ranges.closed(2, 6)));
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atMost(8), range.span(Ranges.atMost(6)));
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosed with same start
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.span(Ranges.closed(4, 6)));
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosed, interior
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.span(Ranges.closed(5, 7)));
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosed with same end
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.span(Ranges.closed(6, 8)));
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // equal
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(range, range.span(range));
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosing with same start
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(4, 10), range.span(Ranges.closed(4, 10)));
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(4), range.span(Ranges.atLeast(4)));
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosing with same end
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(2, 8), range.span(Ranges.closed(2, 8)));
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atMost(8), range.span(Ranges.atMost(8)));
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // enclosing, exterior
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(2, 10), range.span(Ranges.closed(2, 10)));
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.<Integer>all(), range.span(Ranges.<Integer>all()));
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // overlap above
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(4, 10), range.span(Ranges.closed(6, 10)));
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(4), range.span(Ranges.atLeast(6)));
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // adjacent above
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(4, 10), range.span(Ranges.openClosed(8, 10)));
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(4), range.span(Ranges.greaterThan(8)));
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // separate above
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closed(4, 12), range.span(Ranges.closed(10, 12)));
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(4), range.span(Ranges.atLeast(10)));
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testApply() {
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> predicate = Ranges.closed(2, 3);
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(2));
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(3));
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(4));
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals() {
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Ranges.open(1, 5),
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Ranges.range(1, OPEN, 5, OPEN))
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Ranges.greaterThan(2), Ranges.greaterThan(2))
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Ranges.all(), Ranges.all())
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup("Phil")
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLegacyComparable() {
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<LegacyComparable> range
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Ranges.closed(LegacyComparable.X, LegacyComparable.Y);
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final DiscreteDomain<Integer> UNBOUNDED_DOMAIN =
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new DiscreteDomain<Integer>() {
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public Integer next(Integer value) {
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return DiscreteDomains.integers().next(value);
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public Integer previous(Integer value) {
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return DiscreteDomains.integers().previous(value);
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public long distance(Integer start, Integer end) {
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return DiscreteDomains.integers().distance(start, end);
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsSet_noMin() {
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.lessThan(0);
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.asSet(UNBOUNDED_DOMAIN);
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsSet_noMax() {
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Range<Integer> range = Ranges.greaterThan(0);
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      range.asSet(UNBOUNDED_DOMAIN);
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsSet_empty() {
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(), Ranges.closedOpen(1, 1).asSet(integers()));
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(), Ranges.openClosed(5, 5).asSet(integers()));
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(), Ranges.lessThan(Integer.MIN_VALUE).asSet(integers()));
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(), Ranges.greaterThan(Integer.MAX_VALUE).asSet(integers()));
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCanonical() {
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(1, 5),
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Ranges.closed(1, 4).canonical(integers()));
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(1, 5),
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Ranges.open(0, 5).canonical(integers()));
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(1, 5),
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Ranges.closedOpen(1, 5).canonical(integers()));
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(1, 5),
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Ranges.openClosed(0, 4).canonical(integers()));
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(Integer.MIN_VALUE, 0),
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Ranges.closedOpen(Integer.MIN_VALUE, 0).canonical(integers()));
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(Integer.MIN_VALUE, 0),
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Ranges.lessThan(0).canonical(integers()));
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.closedOpen(Integer.MIN_VALUE, 1),
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Ranges.atMost(0).canonical(integers()));
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(0), Ranges.atLeast(0).canonical(integers()));
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(1), Ranges.greaterThan(0).canonical(integers()));
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(Integer.MIN_VALUE), Ranges.<Integer>all().canonical(integers()));
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCanonical_unboundedDomain() {
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.lessThan(0), Ranges.lessThan(0).canonical(UNBOUNDED_DOMAIN));
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.lessThan(1), Ranges.atMost(0).canonical(UNBOUNDED_DOMAIN));
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(0), Ranges.atLeast(0).canonical(UNBOUNDED_DOMAIN));
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.atLeast(1), Ranges.greaterThan(0).canonical(UNBOUNDED_DOMAIN));
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ranges.all(), Ranges.<Integer>all().canonical(UNBOUNDED_DOMAIN));
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
605