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; 18 19 import static com.google.common.base.Preconditions.checkArgument; 20 import static com.google.common.truth.Truth.assertThat; 21 import static java.util.Arrays.asList; 22 23 import com.google.common.annotations.GwtCompatible; 24 import com.google.common.annotations.GwtIncompatible; 25 import com.google.common.collect.testing.ListTestSuiteBuilder; 26 import com.google.common.collect.testing.MinimalCollection; 27 import com.google.common.collect.testing.SetTestSuiteBuilder; 28 import com.google.common.collect.testing.TestStringListGenerator; 29 import com.google.common.collect.testing.TestStringSetGenerator; 30 import com.google.common.collect.testing.features.CollectionFeature; 31 import com.google.common.collect.testing.features.CollectionSize; 32 import com.google.common.collect.testing.google.MultisetTestSuiteBuilder; 33 import com.google.common.collect.testing.google.TestStringMultisetGenerator; 34 import com.google.common.collect.testing.google.UnmodifiableCollectionTests; 35 import com.google.common.testing.EqualsTester; 36 import com.google.common.testing.NullPointerTester; 37 import com.google.common.testing.SerializableTester; 38 39 import junit.framework.Test; 40 import junit.framework.TestCase; 41 import junit.framework.TestSuite; 42 43 import java.util.ArrayList; 44 import java.util.Collection; 45 import java.util.HashSet; 46 import java.util.Iterator; 47 import java.util.List; 48 import java.util.Set; 49 50 /** 51 * Tests for {@link ImmutableMultiset}. 52 * 53 * @author Jared Levy 54 */ 55 @GwtCompatible(emulated = true) 56 public class ImmutableMultisetTest extends TestCase { 57 58 @GwtIncompatible("suite") // TODO(cpovirk): add to collect/gwt/suites suite()59 public static Test suite() { 60 TestSuite suite = new TestSuite(); 61 suite.addTestSuite(ImmutableMultisetTest.class); 62 63 suite.addTest(MultisetTestSuiteBuilder.using( 64 new TestStringMultisetGenerator() { 65 @Override protected Multiset<String> create(String[] elements) { 66 return ImmutableMultiset.copyOf(elements); 67 } 68 }) 69 .named("ImmutableMultiset") 70 .withFeatures(CollectionSize.ANY, 71 CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS, 72 CollectionFeature.ALLOWS_NULL_QUERIES) 73 .createTestSuite()); 74 75 suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { 76 @Override protected Set<String> create(String[] elements) { 77 return ImmutableMultiset.copyOf(elements).elementSet(); 78 } 79 }) 80 .named("ImmutableMultiset, element set") 81 .withFeatures(CollectionSize.ANY, 82 CollectionFeature.SERIALIZABLE, 83 CollectionFeature.ALLOWS_NULL_QUERIES) 84 .createTestSuite()); 85 86 suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() { 87 @Override protected List<String> create(String[] elements) { 88 return ImmutableMultiset.copyOf(elements).asList(); 89 } 90 91 @Override 92 public List<String> order(List<String> insertionOrder) { 93 List<String> order = new ArrayList<String>(); 94 for (String s : insertionOrder) { 95 int index = order.indexOf(s); 96 if (index == -1) { 97 order.add(s); 98 } else { 99 order.add(index, s); 100 } 101 } 102 return order; 103 } 104 }) 105 .named("ImmutableMultiset.asList") 106 .withFeatures(CollectionSize.ANY, 107 CollectionFeature.SERIALIZABLE, 108 CollectionFeature.ALLOWS_NULL_QUERIES) 109 .createTestSuite()); 110 111 suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() { 112 @Override protected List<String> create(String[] elements) { 113 Set<String> set = new HashSet<String>(); 114 ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder(); 115 for (String s : elements) { 116 checkArgument(set.add(s)); 117 builder.addCopies(s, 2); 118 } 119 ImmutableSet<String> elementSet = (ImmutableSet<String>) builder.build().elementSet(); 120 return elementSet.asList(); 121 } 122 }) 123 .named("ImmutableMultiset.elementSet.asList") 124 .withFeatures(CollectionSize.ANY, 125 CollectionFeature.REJECTS_DUPLICATES_AT_CREATION, 126 CollectionFeature.SERIALIZABLE, 127 CollectionFeature.ALLOWS_NULL_QUERIES) 128 .createTestSuite()); 129 130 return suite; 131 } 132 testCreation_noArgs()133 public void testCreation_noArgs() { 134 Multiset<String> multiset = ImmutableMultiset.of(); 135 assertTrue(multiset.isEmpty()); 136 } 137 testCreation_oneElement()138 public void testCreation_oneElement() { 139 Multiset<String> multiset = ImmutableMultiset.of("a"); 140 assertEquals(HashMultiset.create(asList("a")), multiset); 141 } 142 testCreation_twoElements()143 public void testCreation_twoElements() { 144 Multiset<String> multiset = ImmutableMultiset.of("a", "b"); 145 assertEquals(HashMultiset.create(asList("a", "b")), multiset); 146 } 147 testCreation_threeElements()148 public void testCreation_threeElements() { 149 Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c"); 150 assertEquals(HashMultiset.create(asList("a", "b", "c")), multiset); 151 } 152 testCreation_fourElements()153 public void testCreation_fourElements() { 154 Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c", "d"); 155 assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset); 156 } 157 testCreation_fiveElements()158 public void testCreation_fiveElements() { 159 Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c", "d", "e"); 160 assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e")), 161 multiset); 162 } 163 testCreation_sixElements()164 public void testCreation_sixElements() { 165 Multiset<String> multiset = ImmutableMultiset.of( 166 "a", "b", "c", "d", "e", "f"); 167 assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e", "f")), 168 multiset); 169 } 170 testCreation_sevenElements()171 public void testCreation_sevenElements() { 172 Multiset<String> multiset = ImmutableMultiset.of( 173 "a", "b", "c", "d", "e", "f", "g"); 174 assertEquals( 175 HashMultiset.create(asList("a", "b", "c", "d", "e", "f", "g")), 176 multiset); 177 } 178 testCreation_emptyArray()179 public void testCreation_emptyArray() { 180 String[] array = new String[0]; 181 Multiset<String> multiset = ImmutableMultiset.copyOf(array); 182 assertTrue(multiset.isEmpty()); 183 } 184 testCreation_arrayOfOneElement()185 public void testCreation_arrayOfOneElement() { 186 String[] array = new String[] { "a" }; 187 Multiset<String> multiset = ImmutableMultiset.copyOf(array); 188 assertEquals(HashMultiset.create(asList("a")), multiset); 189 } 190 testCreation_arrayOfArray()191 public void testCreation_arrayOfArray() { 192 String[] array = new String[] { "a" }; 193 Multiset<String[]> multiset = ImmutableMultiset.<String[]>of(array); 194 Multiset<String[]> expected = HashMultiset.create(); 195 expected.add(array); 196 assertEquals(expected, multiset); 197 } 198 testCreation_arrayContainingOnlyNull()199 public void testCreation_arrayContainingOnlyNull() { 200 String[] array = new String[] { null }; 201 try { 202 ImmutableMultiset.copyOf(array); 203 fail(); 204 } catch (NullPointerException expected) {} 205 } 206 testCopyOf_collection_empty()207 public void testCopyOf_collection_empty() { 208 // "<String>" is required to work around a javac 1.5 bug. 209 Collection<String> c = MinimalCollection.<String>of(); 210 Multiset<String> multiset = ImmutableMultiset.copyOf(c); 211 assertTrue(multiset.isEmpty()); 212 } 213 testCopyOf_collection_oneElement()214 public void testCopyOf_collection_oneElement() { 215 Collection<String> c = MinimalCollection.of("a"); 216 Multiset<String> multiset = ImmutableMultiset.copyOf(c); 217 assertEquals(HashMultiset.create(asList("a")), multiset); 218 } 219 testCopyOf_collection_general()220 public void testCopyOf_collection_general() { 221 Collection<String> c = MinimalCollection.of("a", "b", "a"); 222 Multiset<String> multiset = ImmutableMultiset.copyOf(c); 223 assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset); 224 } 225 testCopyOf_collectionContainingNull()226 public void testCopyOf_collectionContainingNull() { 227 Collection<String> c = MinimalCollection.of("a", null, "b"); 228 try { 229 ImmutableMultiset.copyOf(c); 230 fail(); 231 } catch (NullPointerException expected) {} 232 } 233 testCopyOf_multiset_empty()234 public void testCopyOf_multiset_empty() { 235 Multiset<String> c = HashMultiset.create(); 236 Multiset<String> multiset = ImmutableMultiset.copyOf(c); 237 assertTrue(multiset.isEmpty()); 238 } 239 testCopyOf_multiset_oneElement()240 public void testCopyOf_multiset_oneElement() { 241 Multiset<String> c = HashMultiset.create(asList("a")); 242 Multiset<String> multiset = ImmutableMultiset.copyOf(c); 243 assertEquals(HashMultiset.create(asList("a")), multiset); 244 } 245 testCopyOf_multiset_general()246 public void testCopyOf_multiset_general() { 247 Multiset<String> c = HashMultiset.create(asList("a", "b", "a")); 248 Multiset<String> multiset = ImmutableMultiset.copyOf(c); 249 assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset); 250 } 251 testCopyOf_multisetContainingNull()252 public void testCopyOf_multisetContainingNull() { 253 Multiset<String> c = HashMultiset.create(asList("a", null, "b")); 254 try { 255 ImmutableMultiset.copyOf(c); 256 fail(); 257 } catch (NullPointerException expected) {} 258 } 259 testCopyOf_iterator_empty()260 public void testCopyOf_iterator_empty() { 261 Iterator<String> iterator = Iterators.emptyIterator(); 262 Multiset<String> multiset = ImmutableMultiset.copyOf(iterator); 263 assertTrue(multiset.isEmpty()); 264 } 265 testCopyOf_iterator_oneElement()266 public void testCopyOf_iterator_oneElement() { 267 Iterator<String> iterator = Iterators.singletonIterator("a"); 268 Multiset<String> multiset = ImmutableMultiset.copyOf(iterator); 269 assertEquals(HashMultiset.create(asList("a")), multiset); 270 } 271 testCopyOf_iterator_general()272 public void testCopyOf_iterator_general() { 273 Iterator<String> iterator = asList("a", "b", "a").iterator(); 274 Multiset<String> multiset = ImmutableMultiset.copyOf(iterator); 275 assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset); 276 } 277 testCopyOf_iteratorContainingNull()278 public void testCopyOf_iteratorContainingNull() { 279 Iterator<String> iterator = asList("a", null, "b").iterator(); 280 try { 281 ImmutableMultiset.copyOf(iterator); 282 fail(); 283 } catch (NullPointerException expected) {} 284 } 285 286 private static class CountingIterable implements Iterable<String> { 287 int count = 0; 288 @Override iterator()289 public Iterator<String> iterator() { 290 count++; 291 return asList("a", "b", "a").iterator(); 292 } 293 } 294 testCopyOf_plainIterable()295 public void testCopyOf_plainIterable() { 296 CountingIterable iterable = new CountingIterable(); 297 Multiset<String> multiset = ImmutableMultiset.copyOf(iterable); 298 assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset); 299 assertEquals(1, iterable.count); 300 } 301 testCopyOf_shortcut_empty()302 public void testCopyOf_shortcut_empty() { 303 Collection<String> c = ImmutableMultiset.of(); 304 assertSame(c, ImmutableMultiset.copyOf(c)); 305 } 306 testCopyOf_shortcut_singleton()307 public void testCopyOf_shortcut_singleton() { 308 Collection<String> c = ImmutableMultiset.of("a"); 309 assertSame(c, ImmutableMultiset.copyOf(c)); 310 } 311 testCopyOf_shortcut_immutableMultiset()312 public void testCopyOf_shortcut_immutableMultiset() { 313 Collection<String> c = ImmutableMultiset.of("a", "b", "c"); 314 assertSame(c, ImmutableMultiset.copyOf(c)); 315 } 316 testBuilderAdd()317 public void testBuilderAdd() { 318 ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>() 319 .add("a") 320 .add("b") 321 .add("a") 322 .add("c") 323 .build(); 324 assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset); 325 } 326 testBuilderAddAll()327 public void testBuilderAddAll() { 328 List<String> a = asList("a", "b"); 329 List<String> b = asList("c", "d"); 330 ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>() 331 .addAll(a) 332 .addAll(b) 333 .build(); 334 assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset); 335 } 336 testBuilderAddAllMultiset()337 public void testBuilderAddAllMultiset() { 338 Multiset<String> a = HashMultiset.create(asList("a", "b", "b")); 339 Multiset<String> b = HashMultiset.create(asList("c", "b")); 340 ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>() 341 .addAll(a) 342 .addAll(b) 343 .build(); 344 assertEquals( 345 HashMultiset.create(asList("a", "b", "b", "b", "c")), multiset); 346 } 347 testBuilderAddAllIterator()348 public void testBuilderAddAllIterator() { 349 Iterator<String> iterator = asList("a", "b", "a", "c").iterator(); 350 ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>() 351 .addAll(iterator) 352 .build(); 353 assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset); 354 } 355 testBuilderAddCopies()356 public void testBuilderAddCopies() { 357 ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>() 358 .addCopies("a", 2) 359 .addCopies("b", 3) 360 .addCopies("c", 0) 361 .build(); 362 assertEquals( 363 HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset); 364 } 365 testBuilderSetCount()366 public void testBuilderSetCount() { 367 ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>() 368 .add("a") 369 .setCount("a", 2) 370 .setCount("b", 3) 371 .build(); 372 assertEquals( 373 HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset); 374 } 375 testBuilderAddHandlesNullsCorrectly()376 public void testBuilderAddHandlesNullsCorrectly() { 377 ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder(); 378 try { 379 builder.add((String) null); 380 fail("expected NullPointerException"); 381 } catch (NullPointerException expected) {} 382 } 383 testBuilderAddAllHandlesNullsCorrectly()384 public void testBuilderAddAllHandlesNullsCorrectly() { 385 ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder(); 386 try { 387 builder.addAll((Collection<String>) null); 388 fail("expected NullPointerException"); 389 } catch (NullPointerException expected) {} 390 391 builder = ImmutableMultiset.builder(); 392 List<String> listWithNulls = asList("a", null, "b"); 393 try { 394 builder.addAll(listWithNulls); 395 fail("expected NullPointerException"); 396 } catch (NullPointerException expected) {} 397 398 builder = ImmutableMultiset.builder(); 399 Multiset<String> multisetWithNull 400 = LinkedHashMultiset.create(asList("a", null, "b")); 401 try { 402 builder.addAll(multisetWithNull); 403 fail("expected NullPointerException"); 404 } catch (NullPointerException expected) {} 405 } 406 testBuilderAddCopiesHandlesNullsCorrectly()407 public void testBuilderAddCopiesHandlesNullsCorrectly() { 408 ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder(); 409 try { 410 builder.addCopies(null, 2); 411 fail("expected NullPointerException"); 412 } catch (NullPointerException expected) {} 413 } 414 testBuilderAddCopiesIllegal()415 public void testBuilderAddCopiesIllegal() { 416 ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder(); 417 try { 418 builder.addCopies("a", -2); 419 fail("expected IllegalArgumentException"); 420 } catch (IllegalArgumentException expected) {} 421 } 422 testBuilderSetCountHandlesNullsCorrectly()423 public void testBuilderSetCountHandlesNullsCorrectly() { 424 ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder(); 425 try { 426 builder.setCount(null, 2); 427 fail("expected NullPointerException"); 428 } catch (NullPointerException expected) {} 429 } 430 testBuilderSetCountIllegal()431 public void testBuilderSetCountIllegal() { 432 ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder(); 433 try { 434 builder.setCount("a", -2); 435 fail("expected IllegalArgumentException"); 436 } catch (IllegalArgumentException expected) {} 437 } 438 439 @GwtIncompatible("NullPointerTester") testNullPointers()440 public void testNullPointers() { 441 NullPointerTester tester = new NullPointerTester(); 442 tester.testAllPublicStaticMethods(ImmutableMultiset.class); 443 } 444 445 @GwtIncompatible("SerializableTester") testSerialization_empty()446 public void testSerialization_empty() { 447 Collection<String> c = ImmutableMultiset.of(); 448 assertSame(c, SerializableTester.reserialize(c)); 449 } 450 451 @GwtIncompatible("SerializableTester") testSerialization_multiple()452 public void testSerialization_multiple() { 453 Collection<String> c = ImmutableMultiset.of("a", "b", "a"); 454 Collection<String> copy = SerializableTester.reserializeAndAssert(c); 455 assertThat(copy).has().exactly("a", "a", "b").inOrder(); 456 } 457 458 @GwtIncompatible("SerializableTester") testSerialization_elementSet()459 public void testSerialization_elementSet() { 460 Multiset<String> c = ImmutableMultiset.of("a", "b", "a"); 461 Collection<String> copy = 462 LenientSerializableTester.reserializeAndAssertLenient(c.elementSet()); 463 assertThat(copy).has().exactly("a", "b").inOrder(); 464 } 465 466 @GwtIncompatible("SerializableTester") testSerialization_entrySet()467 public void testSerialization_entrySet() { 468 Multiset<String> c = ImmutableMultiset.of("a", "b", "c"); 469 SerializableTester.reserializeAndAssert(c.entrySet()); 470 } 471 testEquals_immutableMultiset()472 public void testEquals_immutableMultiset() { 473 Collection<String> c = ImmutableMultiset.of("a", "b", "a"); 474 assertEquals(c, ImmutableMultiset.of("a", "b", "a")); 475 assertEquals(c, ImmutableMultiset.of("a", "a", "b")); 476 assertThat(c).isNotEqualTo(ImmutableMultiset.of("a", "b")); 477 assertThat(c).isNotEqualTo(ImmutableMultiset.of("a", "b", "c", "d")); 478 } 479 testIterationOrder()480 public void testIterationOrder() { 481 Collection<String> c = ImmutableMultiset.of("a", "b", "a"); 482 assertThat(c).has().exactly("a", "a", "b").inOrder(); 483 } 484 testMultisetWrites()485 public void testMultisetWrites() { 486 Multiset<String> multiset = ImmutableMultiset.of("a", "b", "a"); 487 UnmodifiableCollectionTests.assertMultisetIsUnmodifiable(multiset, "test"); 488 } 489 testAsList()490 public void testAsList() { 491 ImmutableMultiset<String> multiset 492 = ImmutableMultiset.of("a", "a", "b", "b", "b"); 493 ImmutableList<String> list = multiset.asList(); 494 assertEquals(ImmutableList.of("a", "a", "b", "b", "b"), list); 495 assertEquals(2, list.indexOf("b")); 496 assertEquals(4, list.lastIndexOf("b")); 497 } 498 499 @GwtIncompatible("SerializableTester") testSerialization_asList()500 public void testSerialization_asList() { 501 ImmutableMultiset<String> multiset 502 = ImmutableMultiset.of("a", "a", "b", "b", "b"); 503 SerializableTester.reserializeAndAssert(multiset.asList()); 504 } 505 testEquals()506 public void testEquals() { 507 new EqualsTester() 508 .addEqualityGroup(ImmutableMultiset.of(), ImmutableMultiset.of()) 509 .addEqualityGroup(ImmutableMultiset.of(1), ImmutableMultiset.of(1)) 510 .addEqualityGroup(ImmutableMultiset.of(1, 1), ImmutableMultiset.of(1, 1)) 511 .addEqualityGroup(ImmutableMultiset.of(1, 2, 1), ImmutableMultiset.of(2, 1, 1)) 512 .testEquals(); 513 } 514 } 515