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