Java
152 строки · 6.0 Кб
1/*
2* Copyright (C) 2008 The Guava Authors
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17package com.google.common.collect.testing.testers;
18
19import static com.google.common.collect.testing.Helpers.mapEntry;
20import static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
21import static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
22import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
23import static com.google.common.collect.testing.features.CollectionFeature.KNOWN_ORDER;
24import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE;
25import static com.google.common.collect.testing.features.CollectionSize.ZERO;
26import static java.util.Arrays.asList;
27
28import com.google.common.annotations.GwtCompatible;
29import com.google.common.collect.testing.AbstractCollectionTester;
30import com.google.common.collect.testing.Helpers;
31import com.google.common.collect.testing.IteratorFeature;
32import com.google.common.collect.testing.IteratorTester;
33import com.google.common.collect.testing.features.CollectionFeature;
34import com.google.common.collect.testing.features.CollectionSize;
35import java.util.ArrayList;
36import java.util.Arrays;
37import java.util.Iterator;
38import java.util.List;
39import java.util.Map.Entry;
40import java.util.NoSuchElementException;
41import java.util.Set;
42import org.checkerframework.checker.nullness.qual.Nullable;
43import org.junit.Ignore;
44
45/**
46* A generic JUnit test which tests {@code iterator} operations on a collection. Can't be invoked
47* directly; please see {@link com.google.common.collect.testing.CollectionTestSuiteBuilder}.
48*
49* @author Chris Povirk
50*/
51@GwtCompatible(emulated = true)
52@Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests.
53@SuppressWarnings("JUnit4ClassUsedInJUnit3")
54@ElementTypesAreNonnullByDefault
55public class CollectionIteratorTester<E extends @Nullable Object>
56extends AbstractCollectionTester<E> {
57public void testIterator() {
58List<E> iteratorElements = new ArrayList<>();
59for (E element : collection) { // uses iterator()
60iteratorElements.add(element);
61}
62Helpers.assertEqualIgnoringOrder(Arrays.asList(createSamplesArray()), iteratorElements);
63}
64
65@CollectionFeature.Require(KNOWN_ORDER)
66public void testIterationOrdering() {
67List<E> iteratorElements = new ArrayList<>();
68for (E element : collection) { // uses iterator()
69iteratorElements.add(element);
70}
71List<E> expected = Helpers.copyToList(getOrderedElements());
72assertEquals("Different ordered iteration", expected, iteratorElements);
73}
74
75@CollectionFeature.Require(ALLOWS_NULL_VALUES)
76@CollectionSize.Require(absent = ZERO)
77public void testIterator_nullElement() {
78initCollectionWithNullElement();
79List<E> iteratorElements = new ArrayList<>();
80for (E element : collection) { // uses iterator()
81iteratorElements.add(element);
82}
83Helpers.assertEqualIgnoringOrder(asList(createArrayWithNullElement()), iteratorElements);
84}
85
86@CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
87@CollectionSize.Require(absent = ZERO)
88public void testIterator_removeAffectsBackingCollection() {
89int originalSize = collection.size();
90Iterator<E> iterator = collection.iterator();
91Object element = iterator.next();
92// If it's an Entry, it may become invalid once it's removed from the Map. Copy it.
93if (element instanceof Entry) {
94Entry<?, ?> entry = (Entry<?, ?>) element;
95element = mapEntry(entry.getKey(), entry.getValue());
96}
97assertTrue(collection.contains(element)); // sanity check
98iterator.remove();
99assertFalse(collection.contains(element));
100assertEquals(originalSize - 1, collection.size());
101}
102
103@CollectionFeature.Require({KNOWN_ORDER, SUPPORTS_ITERATOR_REMOVE})
104public void testIterator_knownOrderRemoveSupported() {
105runIteratorTest(MODIFIABLE, IteratorTester.KnownOrder.KNOWN_ORDER, getOrderedElements());
106}
107
108@CollectionFeature.Require(value = KNOWN_ORDER, absent = SUPPORTS_ITERATOR_REMOVE)
109public void testIterator_knownOrderRemoveUnsupported() {
110runIteratorTest(UNMODIFIABLE, IteratorTester.KnownOrder.KNOWN_ORDER, getOrderedElements());
111}
112
113@CollectionFeature.Require(absent = KNOWN_ORDER, value = SUPPORTS_ITERATOR_REMOVE)
114public void testIterator_unknownOrderRemoveSupported() {
115runIteratorTest(MODIFIABLE, IteratorTester.KnownOrder.UNKNOWN_ORDER, getSampleElements());
116}
117
118@CollectionFeature.Require(absent = {KNOWN_ORDER, SUPPORTS_ITERATOR_REMOVE})
119public void testIterator_unknownOrderRemoveUnsupported() {
120runIteratorTest(UNMODIFIABLE, IteratorTester.KnownOrder.UNKNOWN_ORDER, getSampleElements());
121}
122
123private void runIteratorTest(
124Set<IteratorFeature> features, IteratorTester.KnownOrder knownOrder, Iterable<E> elements) {
125new IteratorTester<E>(
126Platform.collectionIteratorTesterNumIterations(), features, elements, knownOrder) {
127@Override
128protected Iterator<E> newTargetIterator() {
129resetCollection();
130return collection.iterator();
131}
132
133@Override
134protected void verify(List<E> elements) {
135expectContents(elements);
136}
137}.test();
138}
139
140public void testIteratorNoSuchElementException() {
141Iterator<E> iterator = collection.iterator();
142while (iterator.hasNext()) {
143iterator.next();
144}
145
146try {
147iterator.next();
148fail("iterator.next() should throw NoSuchElementException");
149} catch (NoSuchElementException expected) {
150}
151}
152}
153