/* * Copyright (C) 2008 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 com.google.common.collect.Maps.newHashMap; import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES; import static com.google.common.collect.testing.features.CollectionFeature.REMOVE_OPERATIONS; import static com.google.common.collect.testing.google.AbstractMultisetSetCountTester.getSetCountDuplicateInitializingMethods; import static com.google.common.collect.testing.google.MultisetIteratorTester.getIteratorDuplicateInitializingMethods; import static com.google.common.collect.testing.google.MultisetReadsTester.getReadsDuplicateInitializingMethods; import static java.lang.reflect.Proxy.newProxyInstance; import com.google.common.annotations.GwtIncompatible; import com.google.common.base.Functions; import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.collect.testing.CollectionTestSuiteBuilder; import com.google.common.collect.testing.ListTestSuiteBuilder; import com.google.common.collect.testing.SampleElements; import com.google.common.collect.testing.SetTestSuiteBuilder; import com.google.common.collect.testing.TestCollectionGenerator; import com.google.common.collect.testing.TestListGenerator; import com.google.common.collect.testing.TestStringCollectionGenerator; import com.google.common.collect.testing.TestStringListGenerator; import com.google.common.collect.testing.TestStringSetGenerator; import com.google.common.collect.testing.TestStringSortedSetGenerator; import com.google.common.collect.testing.features.CollectionFeature; import com.google.common.collect.testing.features.CollectionSize; import com.google.common.collect.testing.features.Feature; import com.google.common.collect.testing.features.ListFeature; import com.google.common.collect.testing.google.MultisetTestSuiteBuilder; import com.google.common.collect.testing.google.MultisetWritesTester; import com.google.common.collect.testing.google.TestStringMultisetGenerator; import com.google.common.collect.testing.testers.CollectionIteratorTester; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; /** * Run collection tests on {@link Multimap} implementations. * * @author Jared Levy */ @GwtIncompatible("suite") // TODO(cpovirk): set up collect/gwt/suites version public class MultimapCollectionTest extends TestCase { private static final Feature[] COLLECTION_FEATURES = { CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, CollectionFeature.GENERAL_PURPOSE }; static final Feature[] COLLECTION_FEATURES_ORDER = { CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, CollectionFeature.KNOWN_ORDER, CollectionFeature.GENERAL_PURPOSE }; static final Feature[] COLLECTION_FEATURES_REMOVE = { CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, CollectionFeature.REMOVE_OPERATIONS }; static final Feature[] COLLECTION_FEATURES_REMOVE_ORDER = { CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, CollectionFeature.KNOWN_ORDER, CollectionFeature.REMOVE_OPERATIONS }; private static final Feature[] LIST_FEATURES = { CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, ListFeature.GENERAL_PURPOSE }; private static final Feature[] LIST_FEATURES_REMOVE_SET = { CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, ListFeature.REMOVE_OPERATIONS, ListFeature.SUPPORTS_SET }; private static final Feature[] FOR_MAP_FEATURES_ONE = { CollectionSize.ONE, ALLOWS_NULL_VALUES, REMOVE_OPERATIONS, }; private static final Feature[] FOR_MAP_FEATURES_ANY = { CollectionSize.ANY, ALLOWS_NULL_VALUES, REMOVE_OPERATIONS, }; static final Supplier> STRING_TREESET_FACTORY = new Supplier>() { @Override public TreeSet get() { return new TreeSet(Ordering.natural().nullsLast()); } }; static void populateMultimapForGet( Multimap multimap, String[] elements) { multimap.put(2, "foo"); for (String element : elements) { multimap.put(3, element); } } static void populateMultimapForKeySet( Multimap multimap, String[] elements) { for (String element : elements) { multimap.put(element, 2); multimap.put(element, 3); } } static void populateMultimapForValues( Multimap multimap, String[] elements) { for (int i = 0; i < elements.length; i++) { multimap.put(i % 2, elements[i]); } } static void populateMultimapForKeys( Multimap multimap, String[] elements) { for (int i = 0; i < elements.length; i++) { multimap.put(elements[i], i); } } /** * Implements {@code Multimap.put()} -- and no other methods -- for a {@code * Map} by ignoring all but the latest value for each key. This class exists * only so that we can use * {@link MultimapCollectionTest#populateMultimapForGet(Multimap, String[])} * and similar methods to populate a map to be passed to * {@link Multimaps#forMap(Map)}. All tests should run against the result of * {@link #build()}. */ private static final class PopulatableMapAsMultimap extends ForwardingMultimap { final Map map; final SetMultimap unusableDelegate; static PopulatableMapAsMultimap create() { return new PopulatableMapAsMultimap(); } @SuppressWarnings("unchecked") // all methods throw immediately PopulatableMapAsMultimap() { this.map = newHashMap(); this.unusableDelegate = (SetMultimap) newProxyInstance( SetMultimap.class.getClassLoader(), new Class[] {SetMultimap.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { throw new UnsupportedOperationException(); } }); } @Override protected Multimap delegate() { return unusableDelegate; } @Override public boolean put(K key, V value) { map.put(key, value); return true; } SetMultimap build() { return Multimaps.forMap(map); } } static abstract class TestEntriesGenerator implements TestCollectionGenerator> { @Override public SampleElements> samples() { return new SampleElements>( Maps.immutableEntry("bar", 1), Maps.immutableEntry("bar", 2), Maps.immutableEntry("foo", 3), Maps.immutableEntry("bar", 3), Maps.immutableEntry("cat", 2)); } @Override public Collection> create(Object... elements) { Multimap multimap = createMultimap(); for (Object element : elements) { @SuppressWarnings("unchecked") Entry entry = (Entry) element; multimap.put(entry.getKey(), entry.getValue()); } return multimap.entries(); } abstract Multimap createMultimap(); @Override @SuppressWarnings("unchecked") public Entry[] createArray(int length) { return (Entry[]) new Entry[length]; } @Override public List> order( List> insertionOrder) { return insertionOrder; } } public static abstract class TestEntriesListGenerator extends TestEntriesGenerator implements TestListGenerator> { @Override public List> create(Object... elements) { return (List>) super.create(elements); } } private static abstract class TestEntrySetGenerator extends TestEntriesGenerator { @Override abstract SetMultimap createMultimap(); @Override public Set> create(Object... elements) { return (Set>) super.create(elements); } } private static final Predicate> FILTER_GET_PREDICATE = new Predicate>() { @Override public boolean apply(Entry entry) { return !"badvalue".equals(entry.getValue()) && 55556 != entry.getKey(); } }; private static final Predicate> FILTER_KEYSET_PREDICATE = new Predicate>() { @Override public boolean apply(Entry entry) { return !"badkey".equals(entry.getKey()) && 55556 != entry.getValue(); } }; public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { SetMultimap multimap = HashMultimap.create(); populateMultimapForGet(multimap, elements); return multimap.get(3); } }) .named("HashMultimap.get") .withFeatures(COLLECTION_FEATURES) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { SetMultimap multimap = LinkedHashMultimap.create(); populateMultimapForGet(multimap, elements); return multimap.get(3); } }) .named("LinkedHashMultimap.get") .withFeatures(COLLECTION_FEATURES_ORDER) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using( new TestStringSortedSetGenerator() { @Override protected SortedSet create(String[] elements) { SortedSetMultimap multimap = TreeMultimap.create(Ordering.natural().nullsFirst(), Ordering.natural().nullsLast()); populateMultimapForGet(multimap, elements); return multimap.get(3); } }) .named("TreeMultimap.get") .withFeatures(COLLECTION_FEATURES_ORDER) .createTestSuite()); suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() { @Override protected List create(String[] elements) { ListMultimap multimap = ArrayListMultimap.create(); populateMultimapForGet(multimap, elements); return multimap.get(3); } }) .named("ArrayListMultimap.get") .withFeatures(LIST_FEATURES) .createTestSuite()); suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() { @Override protected List create(String[] elements) { ListMultimap multimap = Multimaps.synchronizedListMultimap( ArrayListMultimap.create()); populateMultimapForGet(multimap, elements); return multimap.get(3); } }) .named("synchronized ArrayListMultimap.get") .withFeatures(LIST_FEATURES) .createTestSuite()); suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() { @Override protected List create(String[] elements) { ListMultimap multimap = LinkedListMultimap.create(); populateMultimapForGet(multimap, elements); return multimap.get(3); } }) .named("LinkedListMultimap.get") .withFeatures(LIST_FEATURES) .createTestSuite()); suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() { @Override protected List create(String[] elements) { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); ListMultimap multimap = builder.put(2, "foo") .putAll(3, elements) .build(); return multimap.get(3); } }) .named("ImmutableListMultimap.get") .withFeatures(CollectionSize.ANY) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using( new TestStringSetGenerator() { @Override protected Set create(String[] elements) { PopulatableMapAsMultimap multimap = PopulatableMapAsMultimap.create(); populateMultimapForGet(multimap, elements); return multimap.build().get(3); } }) .named("Multimaps.forMap.get") .withFeatures(FOR_MAP_FEATURES_ONE) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { SetMultimap multimap = LinkedHashMultimap.create(); populateMultimapForGet(multimap, elements); multimap.put(3, "badvalue"); multimap.put(55556, "foo"); return (Set) Multimaps.filterEntries(multimap, FILTER_GET_PREDICATE).get(3); } }) .named("Multimaps.filterEntries.get") .withFeatures(COLLECTION_FEATURES_ORDER) .suppressing(CollectionIteratorTester.getIteratorKnownOrderRemoveSupportedMethod()) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { Multimap multimap = HashMultimap.create(); populateMultimapForKeySet(multimap, elements); return multimap.keySet(); } }) .named("HashMultimap.keySet") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { Multimap multimap = LinkedHashMultimap.create(); populateMultimapForKeySet(multimap, elements); return multimap.keySet(); } }) .named("LinkedHashMultimap.keySet") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using( new TestStringSortedSetGenerator() { @Override protected SortedSet create(String[] elements) { TreeMultimap multimap = TreeMultimap.create(Ordering.natural().nullsFirst(), Ordering.natural().nullsLast()); populateMultimapForKeySet(multimap, elements); return multimap.keySet(); } }) .named("TreeMultimap.keySet") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { Multimap multimap = ArrayListMultimap.create(); populateMultimapForKeySet(multimap, elements); return multimap.keySet(); } }) .named("ArrayListMultimap.keySet") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { Multimap multimap = LinkedListMultimap.create(); populateMultimapForKeySet(multimap, elements); return multimap.keySet(); } }) .named("LinkedListMultimap.keySet") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); for (String element : elements) { builder.put(element, 2); builder.put(element, 3); } Multimap multimap = builder.build(); return multimap.keySet(); } }) .named("ImmutableListMultimap.keySet") .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using( new TestStringSetGenerator() { @Override protected Set create(String[] elements) { PopulatableMapAsMultimap multimap = PopulatableMapAsMultimap.create(); populateMultimapForKeySet(multimap, elements); return multimap.build().keySet(); } }) .named("Multimaps.forMap.keySet") .withFeatures(FOR_MAP_FEATURES_ANY) .createTestSuite()); suite.addTest(SetTestSuiteBuilder.using( new TestStringSetGenerator() { @Override protected Set create(String[] elements) { SetMultimap multimap = LinkedHashMultimap.create(); populateMultimapForKeySet(multimap, elements); multimap.put("badkey", 3); multimap.put("a", 55556); return Multimaps.filterEntries(multimap, FILTER_KEYSET_PREDICATE).keySet(); } }) .named("Multimaps.filterEntries.keySet") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .suppressing(CollectionIteratorTester.getIteratorKnownOrderRemoveSupportedMethod()) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestStringCollectionGenerator() { @Override public Collection create(String[] elements) { Multimap multimap = HashMultimap.create(); populateMultimapForValues(multimap, elements); return multimap.values(); } }) .named("HashMultimap.values") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestStringCollectionGenerator() { @Override public Collection create(String[] elements) { Multimap multimap = LinkedHashMultimap.create(); populateMultimapForValues(multimap, elements); return multimap.values(); } }) .named("LinkedHashMultimap.values") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestStringCollectionGenerator() { @Override public Collection create(String[] elements) { Multimap multimap = TreeMultimap.create(Ordering.natural().nullsFirst(), Ordering.natural().nullsLast()); populateMultimapForValues(multimap, elements); return multimap.values(); } }) .named("TreeMultimap.values") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestStringCollectionGenerator() { @Override public Collection create(String[] elements) { Multimap multimap = ArrayListMultimap.create(); populateMultimapForValues(multimap, elements); return multimap.values(); } }) .named("ArrayListMultimap.values") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest(ListTestSuiteBuilder.using( new TestStringListGenerator() { @Override public List create(String[] elements) { LinkedListMultimap multimap = LinkedListMultimap.create(); populateMultimapForValues(multimap, elements); return multimap.values(); } }) .named("LinkedListMultimap.values") .withFeatures(LIST_FEATURES_REMOVE_SET) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestStringCollectionGenerator() { @Override public Collection create(String[] elements) { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); for (int i = 0; i < elements.length; i++) { builder.put(i % 2, elements[i]); } return builder.build().values(); } }) .named("ImmutableListMultimap.values") .withFeatures(CollectionSize.ANY) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestStringCollectionGenerator() { @Override public Collection create(String[] elements) { Multimap multimap = LinkedHashMultimap.create(); populateMultimapForValues(multimap, elements); multimap.put(3, "badvalue"); multimap.put(55556, "foo"); return Multimaps.filterEntries(multimap, FILTER_GET_PREDICATE).values(); } }) .named("Multimaps.filterEntries.values") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .suppressing(CollectionIteratorTester.getIteratorKnownOrderRemoveSupportedMethod()) .createTestSuite()); // TODO: use collection testers on Multimaps.forMap.values suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { Multimap multimap = HashMultimap.create(); populateMultimapForKeys(multimap, elements); return multimap.keys(); } }) .named("HashMultimap.keys") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { Multimap multimap = LinkedHashMultimap.create(); populateMultimapForKeys(multimap, elements); return multimap.keys(); } }) .named("LinkedHashMultimap.keys") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { Multimap multimap = TreeMultimap.create(Ordering.natural().nullsFirst(), Ordering.natural().nullsLast()); populateMultimapForKeys(multimap, elements); return multimap.keys(); } @Override public List order(List insertionOrder) { Collections.sort(insertionOrder, Ordering.natural().nullsFirst()); return insertionOrder; } }) .named("TreeMultimap.keys") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { Multimap multimap = ArrayListMultimap.create(); populateMultimapForKeys(multimap, elements); return multimap.keys(); } }) .named("ArrayListMultimap.keys") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { Multimap multimap = Multimaps.synchronizedListMultimap( ArrayListMultimap.create()); populateMultimapForKeys(multimap, elements); return multimap.keys(); } }) .named("synchronized ArrayListMultimap.keys") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { Multimap multimap = LinkedListMultimap.create(); populateMultimapForKeys(multimap, elements); return multimap.keys(); } }) .named("LinkedListMultimap.keys") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); for (int i = 0; i < elements.length; i++) { builder.put(elements[i], i); } Multimap multimap = builder.build(); return multimap.keys(); } }) .named("ImmutableListMultimap.keys") .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER) .createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { PopulatableMapAsMultimap multimap = PopulatableMapAsMultimap.create(); populateMultimapForKeys(multimap, elements); return multimap.build().keys(); } }) .named("Multimaps.forMap.keys") .withFeatures(FOR_MAP_FEATURES_ANY) .suppressing(getReadsDuplicateInitializingMethods()) .suppressing(getSetCountDuplicateInitializingMethods()) .suppressing(getIteratorDuplicateInitializingMethods()) .createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { SetMultimap multimap = LinkedHashMultimap.create(); populateMultimapForKeys(multimap, elements); multimap.put("badkey", 3); multimap.put("a", 55556); return Multimaps.filterEntries(multimap, FILTER_KEYSET_PREDICATE).keys(); } }) .named("Multimaps.filterEntries.keys") .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER) .suppressing(CollectionIteratorTester.getIteratorKnownOrderRemoveSupportedMethod()) .suppressing(MultisetWritesTester.getEntrySetIteratorMethod()) .suppressing(getIteratorDuplicateInitializingMethods()) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestEntrySetGenerator() { @Override SetMultimap createMultimap() { return HashMultimap.create(); } }) .named("HashMultimap.entries") .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestEntrySetGenerator() { @Override SetMultimap createMultimap() { return LinkedHashMultimap.create(); } }) .named("LinkedHashMultimap.entries") .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS, CollectionFeature.KNOWN_ORDER) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestEntrySetGenerator() { @Override SetMultimap createMultimap() { return TreeMultimap.create(Ordering.natural().nullsFirst(), Ordering.natural().nullsLast()); } }) .named("TreeMultimap.entries") .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS, CollectionFeature.KNOWN_ORDER) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestEntriesGenerator() { @Override Multimap createMultimap() { return ArrayListMultimap.create(); } }) .named("ArrayListMultimap.entries") .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestEntriesGenerator() { @Override Multimap createMultimap() { return Multimaps.synchronizedListMultimap( ArrayListMultimap.create()); } }) .named("synchronized ArrayListMultimap.entries") .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS) .createTestSuite()); suite.addTest(ListTestSuiteBuilder.using( new TestEntriesListGenerator() { @Override Multimap createMultimap() { return LinkedListMultimap.create(); } }) .named("LinkedListMultimap.entries") .withFeatures(CollectionSize.ANY, ListFeature.REMOVE_OPERATIONS, CollectionFeature.KNOWN_ORDER) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestEntriesGenerator() { @Override Multimap createMultimap() { return ImmutableListMultimap.of(); } @Override public Collection> create( Object... elements) { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); for (Object element : elements) { @SuppressWarnings("unchecked") Entry entry = (Entry) element; builder.put(entry.getKey(), entry.getValue()); } return builder.build().entries(); } }) .named("ImmutableListMultimap.entries") .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER) .createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using( new TestEntriesGenerator() { @Override Multimap createMultimap() { Multimap multimap = LinkedHashMultimap.create(); multimap.put("badkey", 3); multimap.put("a", 55556); return Multimaps.filterEntries(multimap, FILTER_KEYSET_PREDICATE); } }) .named("Multimap.filterEntries.entries") .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS, CollectionFeature.KNOWN_ORDER) .suppressing(CollectionIteratorTester.getIteratorKnownOrderRemoveSupportedMethod()) .createTestSuite()); suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() { @Override protected List create(String[] elements) { ListMultimap multimap = ArrayListMultimap.create(); populateMultimapForGet(multimap, elements); return Multimaps.transformValues( multimap, Functions. identity()).get(3); } }).named("Multimaps.transformValues[ListMultimap].get").withFeatures( CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, CollectionFeature.REMOVE_OPERATIONS, ListFeature.SUPPORTS_REMOVE_WITH_INDEX).createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { ListMultimap multimap = ArrayListMultimap.create(); populateMultimapForKeySet(multimap, elements); return Multimaps.transformValues( multimap, Functions. identity()).keySet(); } }).named("Multimaps.transformValues[ListMultimap].keySet").withFeatures( CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, CollectionFeature.REMOVE_OPERATIONS).createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { ListMultimap multimap = ArrayListMultimap.create(); populateMultimapForKeys(multimap, elements); return Multimaps.transformValues( multimap, Functions. identity()).keys(); } }) .named("Multimaps.transform[ListMultimap].keys") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest( CollectionTestSuiteBuilder.using(new TestStringCollectionGenerator() { @Override public Collection create(String[] elements) { ListMultimap multimap = ArrayListMultimap.create(); populateMultimapForValues(multimap, elements); return Multimaps.transformValues( multimap, Functions. identity()).values(); } }).named("Multimaps.transformValues[ListMultimap].values").withFeatures( COLLECTION_FEATURES_REMOVE).createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using(new TestEntriesGenerator() { @Override public Collection> create( Object... elements) { ListMultimap multimap = ArrayListMultimap.create(); for (Object element : elements) { @SuppressWarnings("unchecked") Entry entry = (Entry) element; multimap.put(entry.getKey(), entry.getValue()); } return Multimaps.transformValues( multimap, Functions. identity()).entries(); } @Override Multimap createMultimap() { return Multimaps.transformValues( ArrayListMultimap. create(), Functions. identity()); } }).named("Multimaps.transformValues[ListMultimap].entries") .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS) .createTestSuite()); suite.addTest( CollectionTestSuiteBuilder.using(new TestStringCollectionGenerator() { @Override protected Collection create(String[] elements) { Multimap multimap = ArrayListMultimap.create(); populateMultimapForGet(multimap, elements); return Multimaps.transformValues( multimap, Functions. identity()).get(3); } }).named("Multimaps.transformValues[Multimap].get").withFeatures( CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES, CollectionFeature.REMOVE_OPERATIONS).createTestSuite()); suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { @Override protected Set create(String[] elements) { Multimap multimap = ArrayListMultimap.create(); populateMultimapForKeySet(multimap, elements); return Multimaps.transformValues( multimap, Functions. identity()).keySet(); } }).named("Multimaps.transformValues[Multimap].keySet").withFeatures( COLLECTION_FEATURES_REMOVE).createTestSuite()); suite.addTest(MultisetTestSuiteBuilder.using( new TestStringMultisetGenerator() { @Override protected Multiset create(String[] elements) { Multimap multimap = ArrayListMultimap.create(); populateMultimapForKeys(multimap, elements); return Multimaps.transformValues( multimap, Functions. identity()).keys(); } }) .named("Multimaps.transformValues[Multimap].keys") .withFeatures(COLLECTION_FEATURES_REMOVE) .createTestSuite()); suite.addTest( CollectionTestSuiteBuilder.using(new TestStringCollectionGenerator() { @Override public Collection create(String[] elements) { Multimap multimap = ArrayListMultimap.create(); populateMultimapForValues(multimap, elements); return Multimaps.transformValues( multimap, Functions. identity()).values(); } }).named("Multimaps.transformValues[Multimap].values").withFeatures( COLLECTION_FEATURES_REMOVE).createTestSuite()); suite.addTest(CollectionTestSuiteBuilder.using(new TestEntriesGenerator() { @Override public Collection> create( Object... elements) { Multimap multimap = ArrayListMultimap.create(); for (Object element : elements) { @SuppressWarnings("unchecked") Entry entry = (Entry) element; multimap.put(entry.getKey(), entry.getValue()); } return Multimaps.transformValues( multimap, Functions. identity()).entries(); } @Override Multimap createMultimap() { return Multimaps.transformValues( (Multimap) ArrayListMultimap. create(), Functions. identity()); } }).named("Multimaps.transformValues[Multimap].entries") .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS) .createTestSuite()); // TODO: use collection testers on Multimaps.forMap.entries return suite; } }