11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * express or implied. See the License for the specific language governing permissions and
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BoundType.CLOSED;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BoundType.OPEN;
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstSide.LEFT;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstSide.RIGHT;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstTesting.assertInOrderTraversalIs;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstTesting.balancePolicy;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstTesting.countAggregate;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstTesting.defaultNullPointerTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstTesting.nodeFactory;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstTesting.pathFactory;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.BstTesting.pathToList;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.BstTesting.SimpleNode;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedSet;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code BSTRangeOps}.
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class BstRangeOpsTest extends TestCase {
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final SortedSet<Character> MODEL =
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedSet.of('a', 'b', 'c', 'd', 'e', 'f', 'g');
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final SimpleNode ROOT;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode a = new SimpleNode('a', null, null);
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', a, c);
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ROOT = d;
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountInRangeLowerBound() {
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (char c : "abcdefg".toCharArray()) {
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (BoundType type : BoundType.values()) {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        long count = BstRangeOps.totalInRange(
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            countAggregate, GeneralRange.downTo(Ordering.natural(), c, type), ROOT);
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        char d = c;
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (type == BoundType.OPEN) {
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          d++;
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(MODEL.tailSet(d).size(), count);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountInRangeUpperBound() {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (char c : "abcdefg".toCharArray()) {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (BoundType type : BoundType.values()) {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        long count = BstRangeOps.totalInRange(
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            countAggregate, GeneralRange.upTo(Ordering.natural(), c, type), ROOT);
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        char d = c;
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (type == BoundType.CLOSED) {
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          d++;
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(MODEL.headSet(d).size(), count);
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountInRangeBothBounds() {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String chars = "abcdefg";
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < chars.length(); i++) {
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (BoundType lb : BoundType.values()) {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (int j = i; j < chars.length(); j++) {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          for (BoundType ub : BoundType.values()) {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            if (i == j && lb == BoundType.OPEN && ub == BoundType.OPEN) {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              continue;
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            long count = BstRangeOps.totalInRange(countAggregate, GeneralRange.range(
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                Ordering.natural(), chars.charAt(i), lb, chars.charAt(j), ub), ROOT);
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            char lo = chars.charAt(i);
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            if (lb == BoundType.OPEN) {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              lo++;
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            char hi = chars.charAt(j);
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            if (ub == BoundType.CLOSED) {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              hi++;
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            if (lo > hi) {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              lo = hi;
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            assertEquals(MODEL.subSet(lo, hi).size(), count);
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountInRangeAll() {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(MODEL.size(), BstRangeOps.totalInRange(
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        countAggregate, GeneralRange.<Character>all(Ordering.natural()), ROOT));
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountInRangeEmpty() {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode empty = null;
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range = GeneralRange.all(Ordering.natural());
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, BstRangeOps.totalInRange(countAggregate, range, empty));
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearRangeLowerBound() {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //  /   / \
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //  a   e g
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode a = new SimpleNode('a', null, null);
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', a, null);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertInOrderTraversalIs(d, "abdefg");
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 = GeneralRange.downTo(Ordering.natural(), 'f', CLOSED);
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range1, "abde");
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range2 = GeneralRange.downTo(Ordering.natural(), 'f', OPEN);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range2, "abdef");
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range3 = GeneralRange.downTo(Ordering.natural(), 'a', CLOSED);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range3, "");
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range4 = GeneralRange.downTo(Ordering.natural(), 'a', OPEN);
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range4, "a");
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range5 = GeneralRange.downTo(Ordering.natural(), 'c', OPEN);
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range5, "ab");
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range6 = GeneralRange.downTo(Ordering.natural(), 'c', CLOSED);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range6, "ab");
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearRangeUpperBound() {
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //  /   / \
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //  a   e g
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode a = new SimpleNode('a', null, null);
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', a, null);
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertInOrderTraversalIs(d, "abdefg");
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 = GeneralRange.upTo(Ordering.natural(), 'f', CLOSED);
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range1, "g");
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range2 = GeneralRange.upTo(Ordering.natural(), 'f', OPEN);
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range2, "fg");
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range3 = GeneralRange.upTo(Ordering.natural(), 'a', CLOSED);
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range3, "bdefg");
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range4 = GeneralRange.upTo(Ordering.natural(), 'a', OPEN);
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range4, "abdefg");
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range5 = GeneralRange.upTo(Ordering.natural(), 'c', OPEN);
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range5, "defg");
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range6 = GeneralRange.upTo(Ordering.natural(), 'c', CLOSED);
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range6, "defg");
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearRangeDoublyBounded() {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //  / \ / \
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //  a c e g
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode a = new SimpleNode('a', null, null);
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', a, c);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 =
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        GeneralRange.range(Ordering.natural(), 'c', OPEN, 'f', CLOSED);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range1, "abcg");
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range2 =
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        GeneralRange.range(Ordering.natural(), 'a', CLOSED, 'h', OPEN);
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, range2, "");
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearRangeAll() {
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //  / \ / \
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //  a c e g
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode a = new SimpleNode('a', null, null);
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', a, c);
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testTraversalAfterClearingRangeIs(d, GeneralRange.<Character>all(Ordering.natural()), "");
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void testTraversalAfterClearingRangeIs(
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SimpleNode d, GeneralRange<Character> range, String expected) {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertInOrderTraversalIs(
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BstRangeOps.minusRange(range, balancePolicy, nodeFactory, d), expected);
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLeftmostPathAll() {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    \ / \
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    c e g
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', null, c);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 = GeneralRange.all(Ordering.natural());
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range1, LEFT, pathFactory, d)))
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(b, d);
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(BstRangeOps.furthestPath(range1, LEFT, pathFactory, null));
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLeftmostPathDownTo() {
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    \ / \
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    c e g
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', null, c);
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 = GeneralRange.downTo(Ordering.natural(), 'd', OPEN);
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range1, LEFT, pathFactory, d)))
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(e, f, d);
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range2 = GeneralRange.downTo(Ordering.natural(), 'd', CLOSED);
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range2, LEFT, pathFactory, d)))
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(d);
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range3 = GeneralRange.downTo(Ordering.natural(), 'a', CLOSED);
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range3, LEFT, pathFactory, d)))
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(b, d);
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range4 = GeneralRange.downTo(Ordering.natural(), 'h', CLOSED);
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(BstRangeOps.furthestPath(range4, LEFT, pathFactory, d));
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLeftmostPathUpTo() {
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    \ / \
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    c e g
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', null, c);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 = GeneralRange.upTo(Ordering.natural(), 'd', OPEN);
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range1, LEFT, pathFactory, d)))
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(b, d);
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range2 = GeneralRange.upTo(Ordering.natural(), 'd', CLOSED);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range2, LEFT, pathFactory, d)))
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(b, d);
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range3 = GeneralRange.upTo(Ordering.natural(), 'a', CLOSED);
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(BstRangeOps.furthestPath(range3, LEFT, pathFactory, d));
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRightmostPathAll() {
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    \ / \
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    c e g
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', null, c);
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 = GeneralRange.all(Ordering.natural());
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range1, RIGHT, pathFactory, d)))
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(g, f, d);
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(BstRangeOps.furthestPath(range1, RIGHT, pathFactory, null));
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRightmostPathDownTo() {
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    \ / \
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    c e g
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', null, c);
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 = GeneralRange.downTo(Ordering.natural(), 'd', OPEN);
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range1, RIGHT, pathFactory, d)))
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(g, f, d);
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range2 = GeneralRange.downTo(Ordering.natural(), 'd', CLOSED);
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range2, RIGHT, pathFactory, d)))
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(g, f, d);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range3 = GeneralRange.downTo(Ordering.natural(), 'a', CLOSED);
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range3, RIGHT, pathFactory, d)))
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(g, f, d);
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range4 = GeneralRange.downTo(Ordering.natural(), 'h', CLOSED);
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(BstRangeOps.furthestPath(range4, RIGHT, pathFactory, d));
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRightmostPathUpTo() {
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     d
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    / \
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //   b   f
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    \ / \
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //    c e g
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode c = new SimpleNode('c', null, null);
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode b = new SimpleNode('b', null, c);
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode e = new SimpleNode('e', null, null);
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode g = new SimpleNode('g', null, null);
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode f = new SimpleNode('f', e, g);
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SimpleNode d = new SimpleNode('d', b, f);
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range1 = GeneralRange.upTo(Ordering.natural(), 'd', OPEN);
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range1, RIGHT, pathFactory, d)))
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(c, b, d);
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range2 = GeneralRange.upTo(Ordering.natural(), 'd', CLOSED);
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range2, RIGHT, pathFactory, d)))
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(d);
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range3 = GeneralRange.upTo(Ordering.natural(), 'a', CLOSED);
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(BstRangeOps.furthestPath(range3, RIGHT, pathFactory, d));
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    GeneralRange<Character> range4 = GeneralRange.upTo(Ordering.natural(), 'h', CLOSED);
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(pathToList(BstRangeOps.furthestPath(range4, RIGHT, pathFactory, d)))
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(g, f, d);
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointers() throws Exception {
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    defaultNullPointerTester().testAllPublicStaticMethods(BstRangeOps.class);
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
398