11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 Google Inc.
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.testing.google;
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.testing.Helpers.copyToList;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ADD;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_REMOVE;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ONE;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.SEVERAL;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ZERO;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.BoundType;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Iterators;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Multiset;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Multiset.Entry;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Multisets;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.SortedMultiset;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tester for navigation of SortedMultisets.
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class MultisetNavigationTester<E> extends AbstractMultisetTester<E> {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private SortedMultiset<E> sortedMultiset;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private List<E> entries;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Entry<E> a;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Entry<E> b;
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Entry<E> c;
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <T> SortedMultiset<T> cast(Multiset<T> iterable) {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (SortedMultiset<T>) iterable;
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void setUp() throws Exception {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super.setUp();
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset = cast(getMultiset());
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries =
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(getSubjectGenerator().getSampleElements(
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            getSubjectGenerator().getCollectionSize().getNumElements()));
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collections.sort(entries, sortedMultiset.comparator());
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // some tests assume SEVERAL == 3
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (entries.size() >= 1) {
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      a = Multisets.immutableEntry(entries.get(0), sortedMultiset.count(entries.get(0)));
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (entries.size() >= 3) {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        b = Multisets.immutableEntry(entries.get(1), sortedMultiset.count(entries.get(1)));
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        c = Multisets.immutableEntry(entries.get(2), sortedMultiset.count(entries.get(2)));
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Resets the contents of sortedMultiset to have entries a, c, for the navigation tests.
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Needed to stop Eclipse whining
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void resetWithHole() {
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<E> container = new ArrayList<E>();
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    container.addAll(Collections.nCopies(a.getCount(), a.getElement()));
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    container.addAll(Collections.nCopies(c.getCount(), c.getElement()));
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super.resetContainer(getSubjectGenerator().create(container.toArray()));
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset = (SortedMultiset<E>) getMultiset();
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultisetFirst() {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(sortedMultiset.firstEntry());
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sortedMultiset.elementSet().first();
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException e) {}
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultisetPollFirst() {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(sortedMultiset.pollFirstEntry());
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultisetNearby() {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (BoundType type : BoundType.values()) {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertNull(sortedMultiset.headMultiset(samples.e0, type).lastEntry());
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertNull(sortedMultiset.tailMultiset(samples.e0, type).firstEntry());
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultisetLast() {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(sortedMultiset.lastEntry());
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertNull(sortedMultiset.elementSet().last());
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException e) {}
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultisetPollLast() {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(sortedMultiset.pollLastEntry());
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSingletonMultisetFirst() {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.firstEntry());
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSingletonMultisetPollFirst() {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.pollFirstEntry());
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(sortedMultiset.isEmpty());
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSingletonMultisetNearby() {
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(sortedMultiset.headMultiset(samples.e0, OPEN).lastEntry());
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(sortedMultiset.tailMultiset(samples.e0, OPEN).lastEntry());
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.headMultiset(samples.e0, CLOSED).lastEntry());
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.tailMultiset(samples.e0, CLOSED).firstEntry());
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSingletonMultisetLast() {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.lastEntry());
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSingletonMultisetPollLast() {
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.pollLastEntry());
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(sortedMultiset.isEmpty());
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFirst() {
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.firstEntry());
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPollFirst() {
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.pollFirstEntry());
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(b, c), copyToList(sortedMultiset.entrySet()));
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_REMOVE)
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPollFirstUnsupported() {
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sortedMultiset.pollFirstEntry();
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException e) {}
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLower() {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resetWithHole();
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(null, sortedMultiset.headMultiset(a.getElement(), OPEN).lastEntry());
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.headMultiset(b.getElement(), OPEN).lastEntry());
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.headMultiset(c.getElement(), OPEN).lastEntry());
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFloor() {
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resetWithHole();
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.headMultiset(a.getElement(), CLOSED).lastEntry());
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.headMultiset(b.getElement(), CLOSED).lastEntry());
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, sortedMultiset.headMultiset(c.getElement(), CLOSED).lastEntry());
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCeiling() {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resetWithHole();
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(a, sortedMultiset.tailMultiset(a.getElement(), CLOSED).firstEntry());
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, sortedMultiset.tailMultiset(b.getElement(), CLOSED).firstEntry());
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, sortedMultiset.tailMultiset(c.getElement(), CLOSED).firstEntry());
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHigher() {
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resetWithHole();
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, sortedMultiset.tailMultiset(a.getElement(), OPEN).firstEntry());
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, sortedMultiset.tailMultiset(b.getElement(), OPEN).firstEntry());
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(null, sortedMultiset.tailMultiset(c.getElement(), OPEN).firstEntry());
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLast() {
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, sortedMultiset.lastEntry());
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPollLast() {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, sortedMultiset.pollLastEntry());
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(a, b), copyToList(sortedMultiset.entrySet()));
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_REMOVE)
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPollLastUnsupported() {
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sortedMultiset.pollLastEntry();
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException e) {}
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testDescendingNavigation() {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> ascending = new ArrayList<Entry<E>>();
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterators.addAll(ascending, sortedMultiset.entrySet().iterator());
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> descending = new ArrayList<Entry<E>>();
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterators.addAll(descending, sortedMultiset.descendingMultiset().entrySet().iterator());
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collections.reverse(descending);
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ascending, descending);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  void expectAddFailure(SortedMultiset<E> multiset, Entry<E> entry) {
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multiset.add(entry.getElement(), entry.getCount());
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected IllegalArgumentException");
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multiset.add(entry.getElement());
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected IllegalArgumentException");
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multiset.addAll(Collections.singletonList(entry.getElement()));
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected IllegalArgumentException");
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  void expectRemoveZero(SortedMultiset<E> multiset, Entry<E> entry) {
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multiset.remove(entry.getElement(), entry.getCount()));
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multiset.remove(entry.getElement()));
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multiset.elementSet().remove(entry.getElement()));
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  void expectSetCountFailure(SortedMultiset<E> multiset, Entry<E> entry) {
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multiset.setCount(entry.getElement(), multiset.count(entry.getElement()));
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException acceptable) {}
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multiset.setCount(entry.getElement(), multiset.count(entry.getElement()) + 1);
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected IllegalArgumentException");
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD)
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddOutOfTailBoundsOne() {
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(a.getElement(), OPEN), a);
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD)
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddOutOfTailBoundsSeveral() {
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(a.getElement(), OPEN), a);
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(b.getElement(), CLOSED), a);
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(b.getElement(), OPEN), a);
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(b.getElement(), OPEN), b);
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(c.getElement(), CLOSED), a);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(c.getElement(), CLOSED), b);
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(c.getElement(), OPEN), a);
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(c.getElement(), OPEN), b);
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.tailMultiset(c.getElement(), OPEN), c);
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD)
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddOutOfHeadBoundsOne() {
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(a.getElement(), OPEN), a);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD)
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddOutOfHeadBoundsSeveral() {
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(c.getElement(), OPEN), c);
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(b.getElement(), CLOSED), c);
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(b.getElement(), OPEN), c);
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(b.getElement(), OPEN), b);
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(a.getElement(), CLOSED), c);
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(a.getElement(), CLOSED), b);
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(a.getElement(), OPEN), c);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(a.getElement(), OPEN), b);
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAddFailure(sortedMultiset.headMultiset(a.getElement(), OPEN), a);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveOutOfTailBoundsOne() {
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(a.getElement(), OPEN), a);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveOutOfTailBoundsSeveral() {
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(a.getElement(), OPEN), a);
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(b.getElement(), CLOSED), a);
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(b.getElement(), OPEN), a);
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(b.getElement(), OPEN), b);
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(c.getElement(), CLOSED), a);
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(c.getElement(), CLOSED), b);
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(c.getElement(), OPEN), a);
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(c.getElement(), OPEN), b);
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.tailMultiset(c.getElement(), OPEN), c);
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveOutOfHeadBoundsOne() {
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(a.getElement(), OPEN), a);
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveOutOfHeadBoundsSeveral() {
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(c.getElement(), OPEN), c);
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(b.getElement(), CLOSED), c);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(b.getElement(), OPEN), c);
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(b.getElement(), OPEN), b);
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(a.getElement(), CLOSED), c);
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(a.getElement(), CLOSED), b);
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(a.getElement(), OPEN), c);
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(a.getElement(), OPEN), b);
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectRemoveZero(sortedMultiset.headMultiset(a.getElement(), OPEN), a);
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require({SUPPORTS_ADD, SUPPORTS_REMOVE})
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSetCountOutOfTailBoundsOne() {
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(a.getElement(), OPEN), a);
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require({SUPPORTS_ADD, SUPPORTS_REMOVE})
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSetCountOutOfTailBoundsSeveral() {
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(a.getElement(), OPEN), a);
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(b.getElement(), CLOSED), a);
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(b.getElement(), OPEN), a);
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(b.getElement(), OPEN), b);
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(c.getElement(), CLOSED), a);
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(c.getElement(), CLOSED), b);
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(c.getElement(), OPEN), a);
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(c.getElement(), OPEN), b);
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.tailMultiset(c.getElement(), OPEN), c);
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require({SUPPORTS_ADD, SUPPORTS_REMOVE})
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSetCountOutOfHeadBoundsOne() {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(a.getElement(), OPEN), a);
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require({SUPPORTS_ADD, SUPPORTS_REMOVE})
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSetCountOutOfHeadBoundsSeveral() {
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(c.getElement(), OPEN), c);
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(b.getElement(), CLOSED), c);
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(b.getElement(), OPEN), c);
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(b.getElement(), OPEN), b);
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(a.getElement(), CLOSED), c);
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(a.getElement(), CLOSED), b);
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(a.getElement(), OPEN), c);
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(a.getElement(), OPEN), b);
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectSetCountFailure(sortedMultiset.headMultiset(a.getElement(), OPEN), a);
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD)
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddWithConflictingBounds() {
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultisetSupportingAdd(sortedMultiset.subMultiset(a.getElement(), CLOSED,
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        a.getElement(), OPEN));
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultisetSupportingAdd(sortedMultiset.subMultiset(a.getElement(), OPEN,
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        a.getElement(), OPEN));
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultisetSupportingAdd(sortedMultiset.subMultiset(a.getElement(), OPEN,
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        a.getElement(), CLOSED));
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultisetSupportingAdd(sortedMultiset.subMultiset(b.getElement(), CLOSED,
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        a.getElement(), CLOSED));
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultisetSupportingAdd(sortedMultiset.subMultiset(b.getElement(), CLOSED,
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        a.getElement(), OPEN));
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultisetSupportingAdd(sortedMultiset.subMultiset(b.getElement(), OPEN,
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        a.getElement(), OPEN));
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD)
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConflictingBounds() {
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultiset(sortedMultiset.subMultiset(a.getElement(), CLOSED, a.getElement(),
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        OPEN));
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultiset(sortedMultiset.subMultiset(a.getElement(), OPEN, a.getElement(),
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        OPEN));
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultiset(sortedMultiset.subMultiset(a.getElement(), OPEN, a.getElement(),
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        CLOSED));
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultiset(sortedMultiset.subMultiset(b.getElement(), CLOSED, a.getElement(),
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        CLOSED));
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultiset(sortedMultiset.subMultiset(b.getElement(), CLOSED, a.getElement(),
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        OPEN));
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testEmptyRangeSubMultiset(sortedMultiset.subMultiset(b.getElement(), OPEN, a.getElement(),
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        OPEN));
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyRangeSubMultiset(SortedMultiset<E> multiset) {
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multiset.size());
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multiset.toArray().length);
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.entrySet().isEmpty());
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multiset.iterator().hasNext());
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multiset.entrySet().size());
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multiset.entrySet().toArray().length);
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multiset.entrySet().iterator().hasNext());
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyRangeSubMultisetSupportingAdd(SortedMultiset<E> multiset) {
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<E> entry : Arrays.asList(a, b, c)) {
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      expectAddFailure(multiset, entry);
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private int totalSize(Iterable<? extends Entry<?>> entries) {
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int sum = 0;
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<?> entry : entries) {
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sum += entry.getCount();
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return sum;
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private enum SubMultisetSpec {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TAIL_CLOSED {
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      <E> List<Entry<E>> expectedEntries(int targetEntry, List<Entry<E>> entries) {
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return entries.subList(targetEntry, entries.size());
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      <E> SortedMultiset<E> subMultiset(SortedMultiset<E> multiset, List<Entry<E>> entries,
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          int targetEntry) {
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multiset.tailMultiset(entries.get(targetEntry).getElement(), CLOSED);
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    },
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TAIL_OPEN {
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      <E> List<Entry<E>> expectedEntries(int targetEntry, List<Entry<E>> entries) {
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return entries.subList(targetEntry + 1, entries.size());
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      <E> SortedMultiset<E> subMultiset(SortedMultiset<E> multiset, List<Entry<E>> entries,
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          int targetEntry) {
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multiset.tailMultiset(entries.get(targetEntry).getElement(), OPEN);
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    },
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HEAD_CLOSED {
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      <E> List<Entry<E>> expectedEntries(int targetEntry, List<Entry<E>> entries) {
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return entries.subList(0, targetEntry + 1);
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      <E> SortedMultiset<E> subMultiset(SortedMultiset<E> multiset, List<Entry<E>> entries,
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          int targetEntry) {
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multiset.headMultiset(entries.get(targetEntry).getElement(), CLOSED);
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    },
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HEAD_OPEN {
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      <E> List<Entry<E>> expectedEntries(int targetEntry, List<Entry<E>> entries) {
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return entries.subList(0, targetEntry);
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      <E> SortedMultiset<E> subMultiset(SortedMultiset<E> multiset, List<Entry<E>> entries,
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          int targetEntry) {
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multiset.headMultiset(entries.get(targetEntry).getElement(), OPEN);
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract <E> List<Entry<E>> expectedEntries(int targetEntry, List<Entry<E>> entries);
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract <E> SortedMultiset<E> subMultiset(SortedMultiset<E> multiset, List<Entry<E>> entries,
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        int targetEntry);
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void testSubMultisetEntrySet(SubMultisetSpec spec) {
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> entries = copyToList(sortedMultiset.entrySet());
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < entries.size(); i++) {
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<Entry<E>> expected = spec.expectedEntries(i, entries);
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SortedMultiset<E> subMultiset = spec.subMultiset(sortedMultiset, entries, i);
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expected, copyToList(subMultiset.entrySet()));
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void testSubMultisetSize(SubMultisetSpec spec) {
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> entries = copyToList(sortedMultiset.entrySet());
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < entries.size(); i++) {
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<Entry<E>> expected = spec.expectedEntries(i, entries);
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SortedMultiset<E> subMultiset = spec.subMultiset(sortedMultiset, entries, i);
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(totalSize(expected), subMultiset.size());
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void testSubMultisetDistinctElements(SubMultisetSpec spec) {
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> entries = copyToList(sortedMultiset.entrySet());
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < entries.size(); i++) {
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<Entry<E>> expected = spec.expectedEntries(i, entries);
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SortedMultiset<E> subMultiset = spec.subMultiset(sortedMultiset, entries, i);
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expected.size(), subMultiset.entrySet().size());
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expected.size(), subMultiset.elementSet().size());
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailClosedEntrySet() {
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetEntrySet(SubMultisetSpec.TAIL_CLOSED);
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailClosedSize() {
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetSize(SubMultisetSpec.TAIL_CLOSED);
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailClosedDistinctElements() {
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetDistinctElements(SubMultisetSpec.TAIL_CLOSED);
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailOpenEntrySet() {
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetEntrySet(SubMultisetSpec.TAIL_OPEN);
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailOpenSize() {
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetSize(SubMultisetSpec.TAIL_OPEN);
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailOpenDistinctElements() {
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetDistinctElements(SubMultisetSpec.TAIL_OPEN);
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadClosedEntrySet() {
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetEntrySet(SubMultisetSpec.HEAD_CLOSED);
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadClosedSize() {
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetSize(SubMultisetSpec.HEAD_CLOSED);
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadClosedDistinctElements() {
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetDistinctElements(SubMultisetSpec.HEAD_CLOSED);
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadOpenEntrySet() {
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetEntrySet(SubMultisetSpec.HEAD_OPEN);
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadOpenSize() {
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetSize(SubMultisetSpec.HEAD_OPEN);
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadOpenDistinctElements() {
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testSubMultisetDistinctElements(SubMultisetSpec.HEAD_OPEN);
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearTailOpen() {
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> expected =
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(sortedMultiset.headMultiset(b.getElement(), CLOSED).entrySet());
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset.tailMultiset(b.getElement(), OPEN).clear();
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, copyToList(sortedMultiset.entrySet()));
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearTailOpenEntrySet() {
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> expected =
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(sortedMultiset.headMultiset(b.getElement(), CLOSED).entrySet());
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset.tailMultiset(b.getElement(), OPEN).entrySet().clear();
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, copyToList(sortedMultiset.entrySet()));
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearTailClosed() {
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> expected =
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(sortedMultiset.headMultiset(b.getElement(), OPEN).entrySet());
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset.tailMultiset(b.getElement(), CLOSED).clear();
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, copyToList(sortedMultiset.entrySet()));
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearTailClosedEntrySet() {
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> expected =
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(sortedMultiset.headMultiset(b.getElement(), OPEN).entrySet());
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset.tailMultiset(b.getElement(), CLOSED).entrySet().clear();
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, copyToList(sortedMultiset.entrySet()));
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearHeadOpen() {
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> expected =
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(sortedMultiset.tailMultiset(b.getElement(), CLOSED).entrySet());
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset.headMultiset(b.getElement(), OPEN).clear();
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, copyToList(sortedMultiset.entrySet()));
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearHeadOpenEntrySet() {
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> expected =
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(sortedMultiset.tailMultiset(b.getElement(), CLOSED).entrySet());
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset.headMultiset(b.getElement(), OPEN).entrySet().clear();
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, copyToList(sortedMultiset.entrySet()));
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearHeadClosed() {
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> expected =
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(sortedMultiset.tailMultiset(b.getElement(), OPEN).entrySet());
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset.headMultiset(b.getElement(), CLOSED).clear();
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, copyToList(sortedMultiset.entrySet()));
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(SEVERAL)
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearHeadClosedEntrySet() {
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<E>> expected =
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        copyToList(sortedMultiset.tailMultiset(b.getElement(), OPEN).entrySet());
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedMultiset.headMultiset(b.getElement(), CLOSED).entrySet().clear();
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, copyToList(sortedMultiset.entrySet()));
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
667