1 /* 2 * Copyright (C) 2007 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; 18 19 import static org.junit.contrib.truth.Truth.ASSERT; 20 import static com.google.common.testing.SerializableTester.reserializeAndAssert; 21 22 import java.util.Arrays; 23 import java.util.Collections; 24 import java.util.HashSet; 25 import java.util.Set; 26 27 import junit.framework.TestCase; 28 29 import com.google.common.annotations.GwtCompatible; 30 import com.google.common.annotations.GwtIncompatible; 31 import com.google.common.collect.testing.DerivedComparable; 32 import com.google.common.testing.NullPointerTester; 33 34 /** 35 * Tests for {@link Multisets}. 36 * 37 * @author Mike Bostock 38 * @author Jared Levy 39 * @author Louis Wasserman 40 */ 41 @GwtCompatible(emulated = true) 42 public class MultisetsTest extends TestCase { 43 44 /* See MultisetsImmutableEntryTest for immutableEntry() tests. */ 45 testForSet()46 public void testForSet() { 47 Set<String> set = new HashSet<String>(); 48 set.add("foo"); 49 set.add("bar"); 50 set.add(null); 51 Multiset<String> multiset = HashMultiset.create(); 52 multiset.addAll(set); 53 Multiset<String> multisetView = Multisets.forSet(set); 54 assertTrue(multiset.equals(multisetView)); 55 assertTrue(multisetView.equals(multiset)); 56 assertEquals(multiset.toString(), multisetView.toString()); 57 assertEquals(multiset.hashCode(), multisetView.hashCode()); 58 assertEquals(multiset.size(), multisetView.size()); 59 assertTrue(multisetView.contains("foo")); 60 assertEquals(set, multisetView.elementSet()); 61 assertEquals(multisetView.elementSet(), set); 62 assertEquals(multiset.elementSet(), multisetView.elementSet()); 63 assertEquals(multisetView.elementSet(), multiset.elementSet()); 64 try { 65 multisetView.add("baz"); 66 fail("UnsupportedOperationException expected"); 67 } catch (UnsupportedOperationException expected) {} 68 try { 69 multisetView.addAll(Collections.singleton("baz")); 70 fail("UnsupportedOperationException expected"); 71 } catch (UnsupportedOperationException expected) {} 72 try { 73 multisetView.elementSet().add("baz"); 74 fail("UnsupportedOperationException expected"); 75 } catch (UnsupportedOperationException expected) {} 76 try { 77 multisetView.elementSet().addAll(Collections.singleton("baz")); 78 fail("UnsupportedOperationException expected"); 79 } catch (UnsupportedOperationException expected) {} 80 multisetView.remove("bar"); 81 assertFalse(multisetView.contains("bar")); 82 assertFalse(set.contains("bar")); 83 assertEquals(set, multisetView.elementSet()); 84 ASSERT.that(multisetView.elementSet()).hasContentsAnyOrder("foo", null); 85 ASSERT.that(multisetView.entrySet()).hasContentsAnyOrder( 86 Multisets.immutableEntry("foo", 1), Multisets.immutableEntry((String) null, 1)); 87 multisetView.clear(); 88 assertFalse(multisetView.contains("foo")); 89 assertFalse(set.contains("foo")); 90 assertTrue(set.isEmpty()); 91 assertTrue(multisetView.isEmpty()); 92 multiset.clear(); 93 assertEquals(multiset.toString(), multisetView.toString()); 94 assertEquals(multiset.hashCode(), multisetView.hashCode()); 95 assertEquals(multiset.size(), multisetView.size()); 96 } 97 98 @GwtIncompatible("SerializableTester") testForSetSerialization()99 public void testForSetSerialization() { 100 Set<String> set = new HashSet<String>(); 101 set.add("foo"); 102 set.add("bar"); 103 set.add(null); 104 Multiset<String> multiset = HashMultiset.create(); 105 multiset.addAll(set); 106 Multiset<String> multisetView = Multisets.forSet(set); 107 assertTrue(multiset.equals(multisetView)); 108 reserializeAndAssert(multisetView); 109 } 110 testNewTreeMultisetDerived()111 public void testNewTreeMultisetDerived() { 112 TreeMultiset<DerivedComparable> set = TreeMultiset.create(); 113 assertTrue(set.isEmpty()); 114 set.add(new DerivedComparable("foo"), 2); 115 set.add(new DerivedComparable("bar"), 3); 116 ASSERT.that(set).hasContentsInOrder( 117 new DerivedComparable("bar"), new DerivedComparable("bar"), new DerivedComparable("bar"), 118 new DerivedComparable("foo"), new DerivedComparable("foo")); 119 } 120 testNewTreeMultisetNonGeneric()121 public void testNewTreeMultisetNonGeneric() { 122 TreeMultiset<LegacyComparable> set = TreeMultiset.create(); 123 assertTrue(set.isEmpty()); 124 set.add(new LegacyComparable("foo"), 2); 125 set.add(new LegacyComparable("bar"), 3); 126 ASSERT.that(set).hasContentsInOrder(new LegacyComparable("bar"), 127 new LegacyComparable("bar"), new LegacyComparable("bar"), 128 new LegacyComparable("foo"), new LegacyComparable("foo")); 129 } 130 testNewTreeMultisetComparator()131 public void testNewTreeMultisetComparator() { 132 TreeMultiset<String> multiset 133 = TreeMultiset.create(Collections.reverseOrder()); 134 multiset.add("bar", 3); 135 multiset.add("foo", 2); 136 ASSERT.that(multiset).hasContentsInOrder("foo", "foo", "bar", "bar", "bar"); 137 } 138 testRetainOccurrencesEmpty()139 public void testRetainOccurrencesEmpty() { 140 Multiset<String> multiset = HashMultiset.create(); 141 Multiset<String> toRetain = 142 HashMultiset.create(Arrays.asList("a", "b", "a")); 143 assertFalse(Multisets.retainOccurrences(multiset, toRetain)); 144 ASSERT.that(multiset).hasContentsInOrder(); 145 } 146 testRemoveOccurrencesEmpty()147 public void testRemoveOccurrencesEmpty() { 148 Multiset<String> multiset = HashMultiset.create(); 149 Multiset<String> toRemove = 150 HashMultiset.create(Arrays.asList("a", "b", "a")); 151 assertFalse(Multisets.retainOccurrences(multiset, toRemove)); 152 assertTrue(multiset.isEmpty()); 153 } 154 testIntersectEmptyNonempty()155 public void testIntersectEmptyNonempty() { 156 Multiset<String> ms1 = HashMultiset.create(); 157 Multiset<String> ms2 = HashMultiset.create(Arrays.asList("a", "b", "a")); 158 ASSERT.that(Multisets.intersection(ms1, ms2)).hasContentsInOrder(); 159 } 160 testIntersectNonemptyEmpty()161 public void testIntersectNonemptyEmpty() { 162 Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a")); 163 Multiset<String> ms2 = HashMultiset.create(); 164 ASSERT.that(Multisets.intersection(ms1, ms2)).hasContentsInOrder(); 165 } 166 testContainsOccurrencesEmpty()167 public void testContainsOccurrencesEmpty() { 168 Multiset<String> superMultiset = HashMultiset.create(Arrays.asList("a", "b", "a")); 169 Multiset<String> subMultiset = HashMultiset.create(); 170 assertTrue(Multisets.containsOccurrences(superMultiset, subMultiset)); 171 assertFalse(Multisets.containsOccurrences(subMultiset, superMultiset)); 172 } 173 testContainsOccurrences()174 public void testContainsOccurrences() { 175 Multiset<String> superMultiset = HashMultiset.create(Arrays.asList("a", "b", "a")); 176 Multiset<String> subMultiset = HashMultiset.create(Arrays.asList("a", "b")); 177 assertTrue(Multisets.containsOccurrences(superMultiset, subMultiset)); 178 assertFalse(Multisets.containsOccurrences(subMultiset, superMultiset)); 179 Multiset<String> diffMultiset = HashMultiset.create(Arrays.asList("a", "b", "c")); 180 assertFalse(Multisets.containsOccurrences(superMultiset, diffMultiset)); 181 assertTrue(Multisets.containsOccurrences(diffMultiset, subMultiset)); 182 } 183 testRetainEmptyOccurrences()184 public void testRetainEmptyOccurrences() { 185 Multiset<String> multiset = 186 HashMultiset.create(Arrays.asList("a", "b", "a")); 187 Multiset<String> toRetain = HashMultiset.create(); 188 assertTrue(Multisets.retainOccurrences(multiset, toRetain)); 189 assertTrue(multiset.isEmpty()); 190 } 191 testRetainOccurrences()192 public void testRetainOccurrences() { 193 Multiset<String> multiset = 194 TreeMultiset.create(Arrays.asList("a", "b", "a", "c")); 195 Multiset<String> toRetain = 196 HashMultiset.create(Arrays.asList("a", "b", "b")); 197 assertTrue(Multisets.retainOccurrences(multiset, toRetain)); 198 ASSERT.that(multiset).hasContentsInOrder("a", "b"); 199 } 200 testRemoveEmptyOccurrences()201 public void testRemoveEmptyOccurrences() { 202 Multiset<String> multiset = 203 TreeMultiset.create(Arrays.asList("a", "b", "a")); 204 Multiset<String> toRemove = HashMultiset.create(); 205 assertFalse(Multisets.removeOccurrences(multiset, toRemove)); 206 ASSERT.that(multiset).hasContentsInOrder("a", "a", "b"); 207 } 208 testRemoveOccurrences()209 public void testRemoveOccurrences() { 210 Multiset<String> multiset = 211 TreeMultiset.create(Arrays.asList("a", "b", "a", "c")); 212 Multiset<String> toRemove = 213 HashMultiset.create(Arrays.asList("a", "b", "b")); 214 assertTrue(Multisets.removeOccurrences(multiset, toRemove)); 215 ASSERT.that(multiset).hasContentsInOrder("a", "c"); 216 } 217 218 @SuppressWarnings("deprecation") testUnmodifiableMultisetShortCircuit()219 public void testUnmodifiableMultisetShortCircuit(){ 220 Multiset<String> mod = HashMultiset.create(); 221 Multiset<String> unmod = Multisets.unmodifiableMultiset(mod); 222 assertNotSame(mod, unmod); 223 assertSame(unmod, Multisets.unmodifiableMultiset(unmod)); 224 ImmutableMultiset<String> immutable = ImmutableMultiset.of("a", "a", "b", "a"); 225 assertSame(immutable, Multisets.unmodifiableMultiset(immutable)); 226 assertSame(immutable, Multisets.unmodifiableMultiset((Multiset<String>) immutable)); 227 } 228 testHighestCountFirst()229 public void testHighestCountFirst() { 230 Multiset<String> multiset = HashMultiset.create( 231 Arrays.asList("a", "a", "a", "b", "c", "c")); 232 ImmutableMultiset<String> sortedMultiset = 233 Multisets.copyHighestCountFirst(multiset); 234 235 ASSERT.that(sortedMultiset.entrySet()).hasContentsInOrder( 236 Multisets.immutableEntry("a", 3), Multisets.immutableEntry("c", 2), 237 Multisets.immutableEntry("b", 1)); 238 239 ASSERT.that(sortedMultiset).hasContentsInOrder( 240 "a", 241 "a", 242 "a", 243 "c", 244 "c", 245 "b"); 246 247 ASSERT.that(Multisets.copyHighestCountFirst(ImmutableMultiset.of())).isEmpty(); 248 } 249 250 @GwtIncompatible("NullPointerTester") testNullPointers()251 public void testNullPointers() throws Exception { 252 NullPointerTester tester = new NullPointerTester(); 253 tester.setDefault(Multiset.class, ImmutableMultiset.of()); 254 tester.testAllPublicStaticMethods(Multisets.class); 255 } 256 } 257