11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect.testing.testers;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_REMOVE;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.ListFeature.SUPPORTS_ADD_WITH_INDEX;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.ListFeature.SUPPORTS_SET;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.testers.Platform.listListIteratorTesterNumIterations;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.singleton;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.Helpers;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorFeature;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ListIteratorTester;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.ListFeature;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.Method;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ListIterator;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.CopyOnWriteArraySet;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A generic JUnit test which tests {@code listIterator} operations on a list.
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Can't be invoked directly; please see
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link com.google.common.collect.testing.ListTestSuiteBuilder}.
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible.
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Povirk
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ListListIteratorTester<E> extends AbstractListTester<E> {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: switch to DerivedIteratorTestSuiteBuilder
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_REMOVE)
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(absent = {SUPPORTS_SET, SUPPORTS_ADD_WITH_INDEX})
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testListIterator_unmodifiable() {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    runListIteratorTest(UNMODIFIABLE);
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * For now, we don't cope with testing this when the list supports only some
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * modification operations.
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_REMOVE)
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require({SUPPORTS_SET, SUPPORTS_ADD_WITH_INDEX})
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testListIterator_fullyModifiable() {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    runListIteratorTest(MODIFIABLE);
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void runListIteratorTest(Set<IteratorFeature> features) {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new ListIteratorTester<E>(
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        listListIteratorTesterNumIterations(), singleton(samples.e4), features,
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Helpers.copyToList(getSampleElements()), 0) {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      {
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // TODO: don't set this universally
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        stopTestingWhenAddThrowsException();
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected ListIterator<E> newTargetIterator() {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        resetCollection();
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return getList().listIterator();
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(List<E> elements) {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        expectContents(elements);
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testListIterator_tooLow() {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getList().listIterator(-1);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testListIterator_tooHigh() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getList().listIterator(getNumElements() + 1);
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testListIterator_atSize() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    getList().listIterator(getNumElements());
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // TODO: run the iterator through ListIteratorTester
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the {@link Method} instance for
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link #testListIterator_fullyModifiable()} so that tests of
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link CopyOnWriteArraySet} can suppress it with
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code FeatureSpecificTestSuiteBuilder.suppressing()} until <a
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6570575">Sun bug
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * 6570575</a> is fixed.
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Method getListIteratorFullyModifiableMethod() {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Platform.getMethod(
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ListListIteratorTester.class, "testListIterator_fullyModifiable");
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the {@link Method} instance for
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link #testListIterator_unmodifiable()} so that it can be suppressed in
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * GWT tests.
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Method getListIteratorUnmodifiableMethod() {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Platform.getMethod(
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ListListIteratorTester.class, "testListIterator_unmodifiable");
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
132