/* * Copyright (C) 2007 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.collect.testing.testers; import static com.google.common.collect.testing.IteratorFeature.MODIFIABLE; import static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE; import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_REMOVE; import static com.google.common.collect.testing.features.ListFeature.SUPPORTS_ADD_WITH_INDEX; import static com.google.common.collect.testing.features.ListFeature.SUPPORTS_SET; import static com.google.common.collect.testing.testers.Platform.listListIteratorTesterNumIterations; import static java.util.Collections.singleton; import com.google.common.annotations.GwtCompatible; import com.google.common.collect.testing.Helpers; import com.google.common.collect.testing.IteratorFeature; import com.google.common.collect.testing.ListIteratorTester; import com.google.common.collect.testing.features.CollectionFeature; import com.google.common.collect.testing.features.ListFeature; import java.util.List; import java.util.ListIterator; import java.util.Set; /** * A generic JUnit test which tests {@code listIterator} operations on a list. * Can't be invoked directly; please see * {@link com.google.common.collect.testing.ListTestSuiteBuilder}. * * <p>This class is GWT compatible. * * @author Chris Povirk * @author Kevin Bourrillion */ @GwtCompatible(emulated = true) public class ListListIteratorTester<E> extends AbstractListTester<E> { // TODO: switch to DerivedIteratorTestSuiteBuilder @CollectionFeature.Require(absent = SUPPORTS_REMOVE) @ListFeature.Require(absent = {SUPPORTS_SET, SUPPORTS_ADD_WITH_INDEX}) public void testListIterator_unmodifiable() { runListIteratorTest(UNMODIFIABLE); } /* * For now, we don't cope with testing this when the list supports only some * modification operations. */ @CollectionFeature.Require(SUPPORTS_REMOVE) @ListFeature.Require({SUPPORTS_SET, SUPPORTS_ADD_WITH_INDEX}) public void testListIterator_fullyModifiable() { runListIteratorTest(MODIFIABLE); } private void runListIteratorTest(Set<IteratorFeature> features) { new ListIteratorTester<E>( listListIteratorTesterNumIterations(), singleton(samples.e4), features, Helpers.copyToList(getSampleElements()), 0) { { // TODO: don't set this universally stopTestingWhenAddThrowsException(); } @Override protected ListIterator<E> newTargetIterator() { resetCollection(); return getList().listIterator(); } @Override protected void verify(List<E> elements) { expectContents(elements); } }.test(); } public void testListIterator_tooLow() { try { getList().listIterator(-1); fail(); } catch (IndexOutOfBoundsException expected) { } } public void testListIterator_tooHigh() { try { getList().listIterator(getNumElements() + 1); fail(); } catch (IndexOutOfBoundsException expected) { } } public void testListIterator_atSize() { getList().listIterator(getNumElements()); // TODO: run the iterator through ListIteratorTester } }