/* * Copyright (C) 2011 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.common.collect; import static java.util.Arrays.asList; import static org.junit.contrib.truth.Truth.ASSERT; import com.google.common.base.Function; import com.google.common.collect.testing.MinimalCollection; import com.google.common.collect.testing.SetTestSuiteBuilder; import com.google.common.collect.testing.TestStringSetGenerator; import com.google.common.collect.testing.features.CollectionFeature; import com.google.common.collect.testing.features.CollectionSize; import com.google.common.collect.testing.google.SortedMultisetTestSuiteBuilder; import com.google.common.collect.testing.google.TestStringMultisetGenerator; import com.google.common.collect.testing.google.UnmodifiableCollectionTests; import com.google.common.testing.NullPointerTester; import com.google.common.testing.SerializableTester; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Set; /** * Tests for {@link ImmutableSortedMultiset}. * * @author Louis Wasserman */ public class ImmutableSortedMultisetTest extends TestCase { public static Test suite() { TestSuite suite = new TestSuite(); suite.addTestSuite(ImmutableSortedMultisetTest.class); suite.addTest(SortedMultisetTestSuiteBuilder.using(new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { return ImmutableSortedMultiset.copyOf(elements); } @Override public List order(List insertionOrder) { return Ordering.natural().sortedCopy(insertionOrder); } }).named("ImmutableSortedMultiset").withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES) .createTestSuite()); suite.addTest(SortedMultisetTestSuiteBuilder.using(new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { return SerializableTester.reserialize(ImmutableSortedMultiset.copyOf(elements)); } @Override public List order(List insertionOrder) { return Ordering.natural().sortedCopy(insertionOrder); } }).named("ImmutableSortedMultiset, reserialized").withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES) .createTestSuite()); suite.addTest(SetTestSuiteBuilder .using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { return SerializableTester.reserialize(ImmutableSortedMultiset.copyOf(elements) .elementSet()); } @Override public List order(List insertionOrder) { return Ordering.natural().immutableSortedCopy(insertionOrder); } }).named("ImmutableSortedMultiset, element set").withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES) .createTestSuite()); return suite; } public void testCreation_noArgs() { Multiset multiset = ImmutableSortedMultiset.of(); assertTrue(multiset.isEmpty()); } public void testCreation_oneElement() { Multiset multiset = ImmutableSortedMultiset.of("a"); assertEquals(HashMultiset.create(asList("a")), multiset); } public void testCreation_twoElements() { Multiset multiset = ImmutableSortedMultiset.of("a", "b"); assertEquals(HashMultiset.create(asList("a", "b")), multiset); } public void testCreation_threeElements() { Multiset multiset = ImmutableSortedMultiset.of("a", "b", "c"); assertEquals(HashMultiset.create(asList("a", "b", "c")), multiset); } public void testCreation_fourElements() { Multiset multiset = ImmutableSortedMultiset.of("a", "b", "c", "d"); assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset); } public void testCreation_fiveElements() { Multiset multiset = ImmutableSortedMultiset.of("a", "b", "c", "d", "e"); assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e")), multiset); } public void testCreation_sixElements() { Multiset multiset = ImmutableSortedMultiset.of("a", "b", "c", "d", "e", "f"); assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e", "f")), multiset); } public void testCreation_sevenElements() { Multiset multiset = ImmutableSortedMultiset.of("a", "b", "c", "d", "e", "f", "g"); assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e", "f", "g")), multiset); } public void testCreation_emptyArray() { String[] array = new String[0]; Multiset multiset = ImmutableSortedMultiset.copyOf(array); assertTrue(multiset.isEmpty()); } public void testCreation_arrayOfOneElement() { String[] array = new String[] {"a"}; Multiset multiset = ImmutableSortedMultiset.copyOf(array); assertEquals(HashMultiset.create(asList("a")), multiset); } public void testCreation_arrayOfArray() { Comparator comparator = Ordering.natural().lexicographical() .onResultOf(new Function>() { @Override public Iterable apply(String[] input) { return Arrays.asList(input); } }); String[] array = new String[] {"a"}; Multiset multiset = ImmutableSortedMultiset.orderedBy(comparator).add(array).build(); Multiset expected = HashMultiset.create(); expected.add(array); assertEquals(expected, multiset); } public void testCreation_arrayContainingOnlyNull() { String[] array = new String[] {null}; try { ImmutableSortedMultiset.copyOf(array); fail(); } catch (NullPointerException expected) {} } public void testCopyOf_collection_empty() { // "" is required to work around a javac 1.5 bug. Collection c = MinimalCollection.of(); Multiset multiset = ImmutableSortedMultiset.copyOf(c); assertTrue(multiset.isEmpty()); } public void testCopyOf_collection_oneElement() { Collection c = MinimalCollection.of("a"); Multiset multiset = ImmutableSortedMultiset.copyOf(c); assertEquals(HashMultiset.create(asList("a")), multiset); } public void testCopyOf_collection_general() { Collection c = MinimalCollection.of("a", "b", "a"); Multiset multiset = ImmutableSortedMultiset.copyOf(c); assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset); } public void testCopyOf_collectionContainingNull() { Collection c = MinimalCollection.of("a", null, "b"); try { ImmutableSortedMultiset.copyOf(c); fail(); } catch (NullPointerException expected) {} } public void testCopyOf_multiset_empty() { Multiset c = HashMultiset.create(); Multiset multiset = ImmutableSortedMultiset.copyOf(c); assertTrue(multiset.isEmpty()); } public void testCopyOf_multiset_oneElement() { Multiset c = HashMultiset.create(asList("a")); Multiset multiset = ImmutableSortedMultiset.copyOf(c); assertEquals(HashMultiset.create(asList("a")), multiset); } public void testCopyOf_multiset_general() { Multiset c = HashMultiset.create(asList("a", "b", "a")); Multiset multiset = ImmutableSortedMultiset.copyOf(c); assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset); } public void testCopyOf_multisetContainingNull() { Multiset c = HashMultiset.create(asList("a", null, "b")); try { ImmutableSortedMultiset.copyOf(c); fail(); } catch (NullPointerException expected) {} } public void testCopyOf_iterator_empty() { Iterator iterator = Iterators.emptyIterator(); Multiset multiset = ImmutableSortedMultiset.copyOf(iterator); assertTrue(multiset.isEmpty()); } public void testCopyOf_iterator_oneElement() { Iterator iterator = Iterators.singletonIterator("a"); Multiset multiset = ImmutableSortedMultiset.copyOf(iterator); assertEquals(HashMultiset.create(asList("a")), multiset); } public void testCopyOf_iterator_general() { Iterator iterator = asList("a", "b", "a").iterator(); Multiset multiset = ImmutableSortedMultiset.copyOf(iterator); assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset); } public void testCopyOf_iteratorContainingNull() { Iterator iterator = asList("a", null, "b").iterator(); try { ImmutableSortedMultiset.copyOf(iterator); fail(); } catch (NullPointerException expected) {} } private static class CountingIterable implements Iterable { int count = 0; @Override public Iterator iterator() { count++; return asList("a", "b", "a").iterator(); } } public void testCopyOf_plainIterable() { CountingIterable iterable = new CountingIterable(); Multiset multiset = ImmutableSortedMultiset.copyOf(iterable); assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset); assertEquals(1, iterable.count); } public void testCopyOf_shortcut_empty() { Collection c = ImmutableSortedMultiset.of(); assertSame(c, ImmutableSortedMultiset.copyOf(c)); } public void testCopyOf_shortcut_singleton() { Collection c = ImmutableSortedMultiset.of("a"); assertSame(c, ImmutableSortedMultiset.copyOf(c)); } public void testCopyOf_shortcut_immutableMultiset() { Collection c = ImmutableSortedMultiset.of("a", "b", "c"); assertSame(c, ImmutableSortedMultiset.copyOf(c)); } public void testBuilderAdd() { ImmutableSortedMultiset multiset = ImmutableSortedMultiset.naturalOrder().add("a").add("b").add("a").add("c").build(); assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset); } public void testBuilderAddAll() { List a = asList("a", "b"); List b = asList("c", "d"); ImmutableSortedMultiset multiset = ImmutableSortedMultiset.naturalOrder().addAll(a).addAll(b).build(); assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset); } public void testBuilderAddAllMultiset() { Multiset a = HashMultiset.create(asList("a", "b", "b")); Multiset b = HashMultiset.create(asList("c", "b")); ImmutableSortedMultiset multiset = ImmutableSortedMultiset.naturalOrder().addAll(a).addAll(b).build(); assertEquals(HashMultiset.create(asList("a", "b", "b", "b", "c")), multiset); } public void testBuilderAddAllIterator() { Iterator iterator = asList("a", "b", "a", "c").iterator(); ImmutableSortedMultiset multiset = ImmutableSortedMultiset.naturalOrder().addAll(iterator).build(); assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset); } public void testBuilderAddCopies() { ImmutableSortedMultiset multiset = ImmutableSortedMultiset.naturalOrder().addCopies("a", 2).addCopies("b", 3) .addCopies("c", 0).build(); assertEquals(HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset); } public void testBuilderSetCount() { ImmutableSortedMultiset multiset = ImmutableSortedMultiset.naturalOrder().add("a").setCount("a", 2).setCount("b", 3) .build(); assertEquals(HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset); } public void testBuilderAddHandlesNullsCorrectly() { ImmutableSortedMultiset.Builder builder = ImmutableSortedMultiset.naturalOrder(); try { builder.add((String) null); fail("expected NullPointerException"); } catch (NullPointerException expected) {} } public void testBuilderAddAllHandlesNullsCorrectly() { ImmutableSortedMultiset.Builder builder = ImmutableSortedMultiset.naturalOrder(); try { builder.addAll((Collection) null); fail("expected NullPointerException"); } catch (NullPointerException expected) {} builder = ImmutableSortedMultiset.naturalOrder(); List listWithNulls = asList("a", null, "b"); try { builder.addAll(listWithNulls); fail("expected NullPointerException"); } catch (NullPointerException expected) {} builder = ImmutableSortedMultiset.naturalOrder(); Multiset multisetWithNull = LinkedHashMultiset.create(asList("a", null, "b")); try { builder.addAll(multisetWithNull); fail("expected NullPointerException"); } catch (NullPointerException expected) {} } public void testBuilderAddCopiesHandlesNullsCorrectly() { ImmutableSortedMultiset.Builder builder = ImmutableSortedMultiset.naturalOrder(); try { builder.addCopies(null, 2); fail("expected NullPointerException"); } catch (NullPointerException expected) {} } public void testBuilderAddCopiesIllegal() { ImmutableSortedMultiset.Builder builder = ImmutableSortedMultiset.naturalOrder(); try { builder.addCopies("a", -2); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException expected) {} } public void testBuilderSetCountHandlesNullsCorrectly() { ImmutableSortedMultiset.Builder builder = new ImmutableSortedMultiset.Builder(Ordering.natural().nullsFirst()); try { builder.setCount(null, 2); fail("expected NullPointerException"); } catch (NullPointerException expected) {} } public void testBuilderSetCountIllegal() { ImmutableSortedMultiset.Builder builder = ImmutableSortedMultiset.naturalOrder(); try { builder.setCount("a", -2); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException expected) {} } public void testNullPointers() throws Exception { NullPointerTester tester = new NullPointerTester(); tester.setDefault(Comparator.class, Ordering.natural()); tester.setDefault(Comparable.class, ""); tester.setDefault(Iterator.class, Iterators.emptyIterator()); tester.setDefault(Iterable.class, Collections.emptySet()); tester.setDefault(Comparable[].class, new Comparable[0]); tester.testAllPublicStaticMethods(ImmutableSortedMultiset.class); } public void testSerialization_empty() { Collection c = ImmutableSortedMultiset.of(); assertSame(c, SerializableTester.reserialize(c)); } public void testSerialization_multiple() { Collection c = ImmutableSortedMultiset.of("a", "b", "a"); Collection copy = SerializableTester.reserializeAndAssert(c); ASSERT.that(copy).hasContentsInOrder("a", "a", "b"); } public void testSerialization_elementSet() { Multiset c = ImmutableSortedMultiset.of("a", "b", "a"); Collection copy = SerializableTester.reserializeAndAssert(c.elementSet()); ASSERT.that(copy).hasContentsInOrder("a", "b"); } public void testSerialization_entrySet() { Multiset c = ImmutableSortedMultiset.of("a", "b", "c"); SerializableTester.reserializeAndAssert(c.entrySet()); } public void testEquals_immutableMultiset() { Collection c = ImmutableSortedMultiset.of("a", "b", "a"); assertEquals(c, ImmutableSortedMultiset.of("a", "b", "a")); assertEquals(c, ImmutableSortedMultiset.of("a", "a", "b")); ASSERT.that(c).isNotEqualTo(ImmutableSortedMultiset.of("a", "b")); ASSERT.that(c).isNotEqualTo(ImmutableSortedMultiset.of("a", "b", "c", "d")); } public void testIterationOrder() { Collection c = ImmutableSortedMultiset.of("a", "b", "a"); ASSERT.that(c).hasContentsInOrder("a", "a", "b"); } public void testMultisetWrites() { Multiset multiset = ImmutableSortedMultiset.of("a", "b", "a"); UnmodifiableCollectionTests.assertMultisetIsUnmodifiable(multiset, "test"); } public void testAsList() { ImmutableSortedMultiset multiset = ImmutableSortedMultiset.of("a", "a", "b", "b", "b"); ImmutableList list = multiset.asList(); assertEquals(ImmutableList.of("a", "a", "b", "b", "b"), list); assertTrue(list instanceof ImmutableAsList); ImmutableList copy = SerializableTester.reserializeAndAssert(list); assertTrue(copy instanceof ImmutableAsList); assertEquals(2, list.indexOf("b")); assertEquals(4, list.lastIndexOf("b")); } }