Java

Форк
0
/
CollectionIteratorTester.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

17
package com.google.common.collect.testing.testers;
18

19
import static com.google.common.collect.testing.Helpers.mapEntry;
20
import static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
21
import static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
22
import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
23
import static com.google.common.collect.testing.features.CollectionFeature.KNOWN_ORDER;
24
import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE;
25
import static com.google.common.collect.testing.features.CollectionSize.ZERO;
26
import static java.util.Arrays.asList;
27

28
import com.google.common.annotations.GwtCompatible;
29
import com.google.common.collect.testing.AbstractCollectionTester;
30
import com.google.common.collect.testing.Helpers;
31
import com.google.common.collect.testing.IteratorFeature;
32
import com.google.common.collect.testing.IteratorTester;
33
import com.google.common.collect.testing.features.CollectionFeature;
34
import com.google.common.collect.testing.features.CollectionSize;
35
import java.util.ArrayList;
36
import java.util.Arrays;
37
import java.util.Iterator;
38
import java.util.List;
39
import java.util.Map.Entry;
40
import java.util.NoSuchElementException;
41
import java.util.Set;
42
import org.checkerframework.checker.nullness.qual.Nullable;
43
import 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
55
public class CollectionIteratorTester<E extends @Nullable Object>
56
    extends AbstractCollectionTester<E> {
57
  public void testIterator() {
58
    List<E> iteratorElements = new ArrayList<>();
59
    for (E element : collection) { // uses iterator()
60
      iteratorElements.add(element);
61
    }
62
    Helpers.assertEqualIgnoringOrder(Arrays.asList(createSamplesArray()), iteratorElements);
63
  }
64

65
  @CollectionFeature.Require(KNOWN_ORDER)
66
  public void testIterationOrdering() {
67
    List<E> iteratorElements = new ArrayList<>();
68
    for (E element : collection) { // uses iterator()
69
      iteratorElements.add(element);
70
    }
71
    List<E> expected = Helpers.copyToList(getOrderedElements());
72
    assertEquals("Different ordered iteration", expected, iteratorElements);
73
  }
74

75
  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
76
  @CollectionSize.Require(absent = ZERO)
77
  public void testIterator_nullElement() {
78
    initCollectionWithNullElement();
79
    List<E> iteratorElements = new ArrayList<>();
80
    for (E element : collection) { // uses iterator()
81
      iteratorElements.add(element);
82
    }
83
    Helpers.assertEqualIgnoringOrder(asList(createArrayWithNullElement()), iteratorElements);
84
  }
85

86
  @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
87
  @CollectionSize.Require(absent = ZERO)
88
  public void testIterator_removeAffectsBackingCollection() {
89
    int originalSize = collection.size();
90
    Iterator<E> iterator = collection.iterator();
91
    Object element = iterator.next();
92
    // If it's an Entry, it may become invalid once it's removed from the Map. Copy it.
93
    if (element instanceof Entry) {
94
      Entry<?, ?> entry = (Entry<?, ?>) element;
95
      element = mapEntry(entry.getKey(), entry.getValue());
96
    }
97
    assertTrue(collection.contains(element)); // sanity check
98
    iterator.remove();
99
    assertFalse(collection.contains(element));
100
    assertEquals(originalSize - 1, collection.size());
101
  }
102

103
  @CollectionFeature.Require({KNOWN_ORDER, SUPPORTS_ITERATOR_REMOVE})
104
  public void testIterator_knownOrderRemoveSupported() {
105
    runIteratorTest(MODIFIABLE, IteratorTester.KnownOrder.KNOWN_ORDER, getOrderedElements());
106
  }
107

108
  @CollectionFeature.Require(value = KNOWN_ORDER, absent = SUPPORTS_ITERATOR_REMOVE)
109
  public void testIterator_knownOrderRemoveUnsupported() {
110
    runIteratorTest(UNMODIFIABLE, IteratorTester.KnownOrder.KNOWN_ORDER, getOrderedElements());
111
  }
112

113
  @CollectionFeature.Require(absent = KNOWN_ORDER, value = SUPPORTS_ITERATOR_REMOVE)
114
  public void testIterator_unknownOrderRemoveSupported() {
115
    runIteratorTest(MODIFIABLE, IteratorTester.KnownOrder.UNKNOWN_ORDER, getSampleElements());
116
  }
117

118
  @CollectionFeature.Require(absent = {KNOWN_ORDER, SUPPORTS_ITERATOR_REMOVE})
119
  public void testIterator_unknownOrderRemoveUnsupported() {
120
    runIteratorTest(UNMODIFIABLE, IteratorTester.KnownOrder.UNKNOWN_ORDER, getSampleElements());
121
  }
122

123
  private void runIteratorTest(
124
      Set<IteratorFeature> features, IteratorTester.KnownOrder knownOrder, Iterable<E> elements) {
125
    new IteratorTester<E>(
126
        Platform.collectionIteratorTesterNumIterations(), features, elements, knownOrder) {
127
      @Override
128
      protected Iterator<E> newTargetIterator() {
129
        resetCollection();
130
        return collection.iterator();
131
      }
132

133
      @Override
134
      protected void verify(List<E> elements) {
135
        expectContents(elements);
136
      }
137
    }.test();
138
  }
139

140
  public void testIteratorNoSuchElementException() {
141
    Iterator<E> iterator = collection.iterator();
142
    while (iterator.hasNext()) {
143
      iterator.next();
144
    }
145

146
    try {
147
      iterator.next();
148
      fail("iterator.next() should throw NoSuchElementException");
149
    } catch (NoSuchElementException expected) {
150
    }
151
  }
152
}
153

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.