001/*
002 * Copyright (C) 2008 The Guava Authors
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package com.google.common.collect.testing.google;
018
019import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ADD;
020import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE;
021import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_REMOVE;
022import static com.google.common.collect.testing.features.CollectionSize.ONE;
023import static com.google.common.collect.testing.features.CollectionSize.SEVERAL;
024import static com.google.common.collect.testing.features.CollectionSize.ZERO;
025import static com.google.common.collect.testing.google.MultisetFeature.ENTRIES_ARE_VIEWS;
026
027import com.google.common.annotations.GwtCompatible;
028import com.google.common.collect.Iterables;
029import com.google.common.collect.Multiset;
030import com.google.common.collect.Multisets;
031import com.google.common.collect.testing.features.CollectionFeature;
032import com.google.common.collect.testing.features.CollectionSize;
033import java.util.Collections;
034import java.util.Iterator;
035import org.junit.Ignore;
036
037/**
038 * Tests for {@code Multiset.entrySet}.
039 *
040 * @author Jared Levy
041 */
042@GwtCompatible
043@Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests.
044@SuppressWarnings("JUnit4ClassUsedInJUnit3")
045public class MultisetEntrySetTester<E> extends AbstractMultisetTester<E> {
046
047  @CollectionFeature.Require(SUPPORTS_REMOVE)
048  public void testEntrySet_clear() {
049    getMultiset().entrySet().clear();
050    assertTrue("multiset not empty after entrySet().clear()", getMultiset().isEmpty());
051  }
052
053  @CollectionSize.Require(ONE)
054  @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
055  public void testEntrySet_iteratorRemovePropagates() {
056    Iterator<Multiset.Entry<E>> iterator = getMultiset().entrySet().iterator();
057    assertTrue(
058        "non-empty multiset.entrySet() iterator.hasNext() returned false", iterator.hasNext());
059    assertEquals(
060        "multiset.entrySet() iterator.next() returned incorrect entry",
061        Multisets.immutableEntry(e0(), 1),
062        iterator.next());
063    assertFalse(
064        "size 1 multiset.entrySet() iterator.hasNext() returned true after next()",
065        iterator.hasNext());
066    iterator.remove();
067    assertTrue(
068        "multiset isn't empty after multiset.entrySet() iterator.remove()",
069        getMultiset().isEmpty());
070  }
071
072  @CollectionSize.Require(absent = ZERO)
073  @CollectionFeature.Require(SUPPORTS_REMOVE)
074  public void testEntrySet_removePresent() {
075    assertTrue(
076        "multiset.entrySet.remove(presentEntry) returned false",
077        getMultiset().entrySet().remove(Multisets.immutableEntry(e0(), 1)));
078    assertFalse("multiset contains element after removing its entry", getMultiset().contains(e0()));
079  }
080
081  @CollectionSize.Require(absent = ZERO)
082  @CollectionFeature.Require(SUPPORTS_REMOVE)
083  public void testEntrySet_removeAbsent() {
084    assertFalse(
085        "multiset.entrySet.remove(missingEntry) returned true",
086        getMultiset().entrySet().remove(Multisets.immutableEntry(e0(), 2)));
087    assertTrue(
088        "multiset didn't contain element after removing a missing entry",
089        getMultiset().contains(e0()));
090  }
091
092  @CollectionSize.Require(absent = ZERO)
093  @CollectionFeature.Require(SUPPORTS_REMOVE)
094  public void testEntrySet_removeAllPresent() {
095    assertTrue(
096        "multiset.entrySet.removeAll(presentEntry) returned false",
097        getMultiset()
098            .entrySet()
099            .removeAll(Collections.singleton(Multisets.immutableEntry(e0(), 1))));
100    assertFalse("multiset contains element after removing its entry", getMultiset().contains(e0()));
101  }
102
103  @CollectionSize.Require(absent = ZERO)
104  @CollectionFeature.Require(SUPPORTS_REMOVE)
105  public void testEntrySet_removeAllAbsent() {
106    assertFalse(
107        "multiset.entrySet.remove(missingEntry) returned true",
108        getMultiset()
109            .entrySet()
110            .removeAll(Collections.singleton(Multisets.immutableEntry(e0(), 2))));
111    assertTrue(
112        "multiset didn't contain element after removing a missing entry",
113        getMultiset().contains(e0()));
114  }
115
116  @CollectionSize.Require(ONE)
117  @CollectionFeature.Require(SUPPORTS_REMOVE)
118  public void testEntrySet_retainAllPresent() {
119    assertFalse(
120        "multiset.entrySet.retainAll(presentEntry) returned false",
121        getMultiset()
122            .entrySet()
123            .retainAll(Collections.singleton(Multisets.immutableEntry(e0(), 1))));
124    assertTrue(
125        "multiset doesn't contains element after retaining its entry",
126        getMultiset().contains(e0()));
127  }
128
129  @CollectionSize.Require(ONE)
130  @CollectionFeature.Require(SUPPORTS_REMOVE)
131  public void testEntrySet_retainAllAbsent() {
132    assertTrue(
133        "multiset.entrySet.retainAll(missingEntry) returned true",
134        getMultiset()
135            .entrySet()
136            .retainAll(Collections.singleton(Multisets.immutableEntry(e0(), 2))));
137    assertFalse(
138        "multiset contains element after retaining a different entry",
139        getMultiset().contains(e0()));
140  }
141
142  @CollectionSize.Require(SEVERAL)
143  @CollectionFeature.Require(SUPPORTS_REMOVE)
144  @MultisetFeature.Require(ENTRIES_ARE_VIEWS)
145  public void testEntryViewReflectsRemove() {
146    initThreeCopies();
147    assertEquals(3, getMultiset().count(e0()));
148    Multiset.Entry<E> entry = Iterables.getOnlyElement(getMultiset().entrySet());
149    assertEquals(3, entry.getCount());
150    assertTrue(getMultiset().remove(e0()));
151    assertEquals(2, entry.getCount());
152    assertTrue(getMultiset().elementSet().remove(e0()));
153    assertEquals(0, entry.getCount());
154  }
155
156  @CollectionSize.Require(SEVERAL)
157  @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
158  @MultisetFeature.Require(ENTRIES_ARE_VIEWS)
159  public void testEntryReflectsIteratorRemove() {
160    initThreeCopies();
161    assertEquals(3, getMultiset().count(e0()));
162    Multiset.Entry<E> entry = Iterables.getOnlyElement(getMultiset().entrySet());
163    assertEquals(3, entry.getCount());
164    Iterator<E> itr = getMultiset().iterator();
165    itr.next();
166    itr.remove();
167    assertEquals(2, entry.getCount());
168    itr.next();
169    itr.remove();
170    itr.next();
171    itr.remove();
172    assertEquals(0, entry.getCount());
173  }
174
175  @CollectionSize.Require(SEVERAL)
176  @CollectionFeature.Require(SUPPORTS_REMOVE)
177  @MultisetFeature.Require(ENTRIES_ARE_VIEWS)
178  public void testEntryReflectsClear() {
179    initThreeCopies();
180    assertEquals(3, getMultiset().count(e0()));
181    Multiset.Entry<E> entry = Iterables.getOnlyElement(getMultiset().entrySet());
182    assertEquals(3, entry.getCount());
183    getMultiset().clear();
184    assertEquals(0, entry.getCount());
185  }
186
187  @CollectionSize.Require(SEVERAL)
188  @CollectionFeature.Require(SUPPORTS_REMOVE)
189  @MultisetFeature.Require(ENTRIES_ARE_VIEWS)
190  public void testEntryReflectsEntrySetClear() {
191    initThreeCopies();
192    assertEquals(3, getMultiset().count(e0()));
193    Multiset.Entry<E> entry = Iterables.getOnlyElement(getMultiset().entrySet());
194    assertEquals(3, entry.getCount());
195    getMultiset().entrySet().clear();
196    assertEquals(0, entry.getCount());
197  }
198
199  @CollectionSize.Require(SEVERAL)
200  @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
201  @MultisetFeature.Require(ENTRIES_ARE_VIEWS)
202  public void testEntryReflectsEntrySetIteratorRemove() {
203    initThreeCopies();
204    assertEquals(3, getMultiset().count(e0()));
205    Iterator<Multiset.Entry<E>> entryItr = getMultiset().entrySet().iterator();
206    Multiset.Entry<E> entry = entryItr.next();
207    entryItr.remove();
208    assertEquals(0, entry.getCount());
209  }
210
211  @CollectionSize.Require(SEVERAL)
212  @CollectionFeature.Require(SUPPORTS_REMOVE)
213  @MultisetFeature.Require(ENTRIES_ARE_VIEWS)
214  public void testEntryReflectsElementSetClear() {
215    initThreeCopies();
216    assertEquals(3, getMultiset().count(e0()));
217    Multiset.Entry<E> entry = Iterables.getOnlyElement(getMultiset().entrySet());
218    assertEquals(3, entry.getCount());
219    getMultiset().elementSet().clear();
220    assertEquals(0, entry.getCount());
221  }
222
223  @CollectionSize.Require(SEVERAL)
224  @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
225  @MultisetFeature.Require(ENTRIES_ARE_VIEWS)
226  public void testEntryReflectsElementSetIteratorRemove() {
227    initThreeCopies();
228    assertEquals(3, getMultiset().count(e0()));
229    Multiset.Entry<E> entry = Iterables.getOnlyElement(getMultiset().entrySet());
230    assertEquals(3, entry.getCount());
231    Iterator<E> elementItr = getMultiset().elementSet().iterator();
232    elementItr.next();
233    elementItr.remove();
234    assertEquals(0, entry.getCount());
235  }
236
237  @CollectionSize.Require(SEVERAL)
238  @CollectionFeature.Require({SUPPORTS_REMOVE, SUPPORTS_ADD})
239  @MultisetFeature.Require(ENTRIES_ARE_VIEWS)
240  public void testEntryReflectsRemoveThenAdd() {
241    initThreeCopies();
242    assertEquals(3, getMultiset().count(e0()));
243    Multiset.Entry<E> entry = Iterables.getOnlyElement(getMultiset().entrySet());
244    assertEquals(3, entry.getCount());
245    assertTrue(getMultiset().remove(e0()));
246    assertEquals(2, entry.getCount());
247    assertTrue(getMultiset().elementSet().remove(e0()));
248    assertEquals(0, entry.getCount());
249    getMultiset().add(e0(), 2);
250    assertEquals(2, entry.getCount());
251  }
252
253  public void testToString() {
254    assertEquals(getMultiset().entrySet().toString(), getMultiset().toString());
255  }
256}