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.Iterables.getOnlyElement; 020import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ADD; 021import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE; 022import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_REMOVE; 023import static com.google.common.collect.testing.features.CollectionSize.ONE; 024import static com.google.common.collect.testing.features.CollectionSize.SEVERAL; 025import static com.google.common.collect.testing.features.CollectionSize.ZERO; 026import static com.google.common.collect.testing.google.MultisetFeature.ENTRIES_ARE_VIEWS; 027import static java.util.Collections.singleton; 028 029import com.google.common.annotations.GwtCompatible; 030import com.google.common.collect.Multiset; 031import com.google.common.collect.Multisets; 032import com.google.common.collect.testing.features.CollectionFeature; 033import com.google.common.collect.testing.features.CollectionSize; 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("test runners must not instantiate and run this directly, only via suites we build") 044// @Ignore affects the Android test runner, which respects JUnit 4 annotations on JUnit 3 tests. 045@SuppressWarnings("JUnit4ClassUsedInJUnit3") 046public class MultisetEntrySetTester<E> extends AbstractMultisetTester<E> { 047 048 @CollectionFeature.Require(SUPPORTS_REMOVE) 049 public void testEntrySet_clear() { 050 getMultiset().entrySet().clear(); 051 assertTrue("multiset not empty after entrySet().clear()", getMultiset().isEmpty()); 052 } 053 054 @CollectionSize.Require(ONE) 055 @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE) 056 public void testEntrySet_iteratorRemovePropagates() { 057 Iterator<Multiset.Entry<E>> iterator = getMultiset().entrySet().iterator(); 058 assertTrue( 059 "non-empty multiset.entrySet() iterator.hasNext() returned false", iterator.hasNext()); 060 assertEquals( 061 "multiset.entrySet() iterator.next() returned incorrect entry", 062 Multisets.immutableEntry(e0(), 1), 063 iterator.next()); 064 assertFalse( 065 "size 1 multiset.entrySet() iterator.hasNext() returned true after next()", 066 iterator.hasNext()); 067 iterator.remove(); 068 assertTrue( 069 "multiset isn't empty after multiset.entrySet() iterator.remove()", 070 getMultiset().isEmpty()); 071 } 072 073 @CollectionSize.Require(absent = ZERO) 074 @CollectionFeature.Require(SUPPORTS_REMOVE) 075 public void testEntrySet_removePresent() { 076 assertTrue( 077 "multiset.entrySet.remove(presentEntry) returned false", 078 getMultiset().entrySet().remove(Multisets.immutableEntry(e0(), 1))); 079 assertFalse("multiset contains element after removing its entry", getMultiset().contains(e0())); 080 } 081 082 @CollectionSize.Require(absent = ZERO) 083 @CollectionFeature.Require(SUPPORTS_REMOVE) 084 public void testEntrySet_removeAbsent() { 085 assertFalse( 086 "multiset.entrySet.remove(missingEntry) returned true", 087 getMultiset().entrySet().remove(Multisets.immutableEntry(e0(), 2))); 088 assertTrue( 089 "multiset didn't contain element after removing a missing entry", 090 getMultiset().contains(e0())); 091 } 092 093 @CollectionSize.Require(absent = ZERO) 094 @CollectionFeature.Require(SUPPORTS_REMOVE) 095 public void testEntrySet_removeAllPresent() { 096 assertTrue( 097 "multiset.entrySet.removeAll(presentEntry) returned false", 098 getMultiset().entrySet().removeAll(singleton(Multisets.immutableEntry(e0(), 1)))); 099 assertFalse("multiset contains element after removing its entry", getMultiset().contains(e0())); 100 } 101 102 @CollectionSize.Require(absent = ZERO) 103 @CollectionFeature.Require(SUPPORTS_REMOVE) 104 public void testEntrySet_removeAllAbsent() { 105 assertFalse( 106 "multiset.entrySet.remove(missingEntry) returned true", 107 getMultiset().entrySet().removeAll(singleton(Multisets.immutableEntry(e0(), 2)))); 108 assertTrue( 109 "multiset didn't contain element after removing a missing entry", 110 getMultiset().contains(e0())); 111 } 112 113 @CollectionSize.Require(ONE) 114 @CollectionFeature.Require(SUPPORTS_REMOVE) 115 public void testEntrySet_retainAllPresent() { 116 assertFalse( 117 "multiset.entrySet.retainAll(presentEntry) returned false", 118 getMultiset().entrySet().retainAll(singleton(Multisets.immutableEntry(e0(), 1)))); 119 assertTrue( 120 "multiset doesn't contains element after retaining its entry", 121 getMultiset().contains(e0())); 122 } 123 124 @CollectionSize.Require(ONE) 125 @CollectionFeature.Require(SUPPORTS_REMOVE) 126 public void testEntrySet_retainAllAbsent() { 127 assertTrue( 128 "multiset.entrySet.retainAll(missingEntry) returned true", 129 getMultiset().entrySet().retainAll(singleton(Multisets.immutableEntry(e0(), 2)))); 130 assertFalse( 131 "multiset contains element after retaining a different entry", 132 getMultiset().contains(e0())); 133 } 134 135 @CollectionSize.Require(SEVERAL) 136 @CollectionFeature.Require(SUPPORTS_REMOVE) 137 @MultisetFeature.Require(ENTRIES_ARE_VIEWS) 138 public void testEntryViewReflectsRemove() { 139 initThreeCopies(); 140 assertEquals(3, getMultiset().count(e0())); 141 Multiset.Entry<E> entry = getOnlyElement(getMultiset().entrySet()); 142 assertEquals(3, entry.getCount()); 143 assertTrue(getMultiset().remove(e0())); 144 assertEquals(2, entry.getCount()); 145 assertTrue(getMultiset().elementSet().remove(e0())); 146 assertEquals(0, entry.getCount()); 147 } 148 149 @CollectionSize.Require(SEVERAL) 150 @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE) 151 @MultisetFeature.Require(ENTRIES_ARE_VIEWS) 152 public void testEntryReflectsIteratorRemove() { 153 initThreeCopies(); 154 assertEquals(3, getMultiset().count(e0())); 155 Multiset.Entry<E> entry = getOnlyElement(getMultiset().entrySet()); 156 assertEquals(3, entry.getCount()); 157 Iterator<E> itr = getMultiset().iterator(); 158 itr.next(); 159 itr.remove(); 160 assertEquals(2, entry.getCount()); 161 itr.next(); 162 itr.remove(); 163 itr.next(); 164 itr.remove(); 165 assertEquals(0, entry.getCount()); 166 } 167 168 @CollectionSize.Require(SEVERAL) 169 @CollectionFeature.Require(SUPPORTS_REMOVE) 170 @MultisetFeature.Require(ENTRIES_ARE_VIEWS) 171 public void testEntryReflectsClear() { 172 initThreeCopies(); 173 assertEquals(3, getMultiset().count(e0())); 174 Multiset.Entry<E> entry = getOnlyElement(getMultiset().entrySet()); 175 assertEquals(3, entry.getCount()); 176 getMultiset().clear(); 177 assertEquals(0, entry.getCount()); 178 } 179 180 @CollectionSize.Require(SEVERAL) 181 @CollectionFeature.Require(SUPPORTS_REMOVE) 182 @MultisetFeature.Require(ENTRIES_ARE_VIEWS) 183 public void testEntryReflectsEntrySetClear() { 184 initThreeCopies(); 185 assertEquals(3, getMultiset().count(e0())); 186 Multiset.Entry<E> entry = getOnlyElement(getMultiset().entrySet()); 187 assertEquals(3, entry.getCount()); 188 getMultiset().entrySet().clear(); 189 assertEquals(0, entry.getCount()); 190 } 191 192 @CollectionSize.Require(SEVERAL) 193 @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE) 194 @MultisetFeature.Require(ENTRIES_ARE_VIEWS) 195 public void testEntryReflectsEntrySetIteratorRemove() { 196 initThreeCopies(); 197 assertEquals(3, getMultiset().count(e0())); 198 Iterator<Multiset.Entry<E>> entryItr = getMultiset().entrySet().iterator(); 199 Multiset.Entry<E> entry = entryItr.next(); 200 entryItr.remove(); 201 assertEquals(0, entry.getCount()); 202 } 203 204 @CollectionSize.Require(SEVERAL) 205 @CollectionFeature.Require(SUPPORTS_REMOVE) 206 @MultisetFeature.Require(ENTRIES_ARE_VIEWS) 207 public void testEntryReflectsElementSetClear() { 208 initThreeCopies(); 209 assertEquals(3, getMultiset().count(e0())); 210 Multiset.Entry<E> entry = getOnlyElement(getMultiset().entrySet()); 211 assertEquals(3, entry.getCount()); 212 getMultiset().elementSet().clear(); 213 assertEquals(0, entry.getCount()); 214 } 215 216 @CollectionSize.Require(SEVERAL) 217 @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE) 218 @MultisetFeature.Require(ENTRIES_ARE_VIEWS) 219 public void testEntryReflectsElementSetIteratorRemove() { 220 initThreeCopies(); 221 assertEquals(3, getMultiset().count(e0())); 222 Multiset.Entry<E> entry = getOnlyElement(getMultiset().entrySet()); 223 assertEquals(3, entry.getCount()); 224 Iterator<E> elementItr = getMultiset().elementSet().iterator(); 225 elementItr.next(); 226 elementItr.remove(); 227 assertEquals(0, entry.getCount()); 228 } 229 230 @CollectionSize.Require(SEVERAL) 231 @CollectionFeature.Require({SUPPORTS_REMOVE, SUPPORTS_ADD}) 232 @MultisetFeature.Require(ENTRIES_ARE_VIEWS) 233 public void testEntryReflectsRemoveThenAdd() { 234 initThreeCopies(); 235 assertEquals(3, getMultiset().count(e0())); 236 Multiset.Entry<E> entry = getOnlyElement(getMultiset().entrySet()); 237 assertEquals(3, entry.getCount()); 238 assertTrue(getMultiset().remove(e0())); 239 assertEquals(2, entry.getCount()); 240 assertTrue(getMultiset().elementSet().remove(e0())); 241 assertEquals(0, entry.getCount()); 242 getMultiset().add(e0(), 2); 243 assertEquals(2, entry.getCount()); 244 } 245 246 public void testToString() { 247 assertEquals(getMultiset().entrySet().toString(), getMultiset().toString()); 248 } 249}