001/*
002 * Copyright (C) 2012 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.testing.Helpers.copyToList;
020
021import com.google.common.annotations.GwtIncompatible;
022import com.google.common.collect.ListMultimap;
023import com.google.common.collect.testing.AbstractTester;
024import com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder;
025import com.google.common.collect.testing.ListTestSuiteBuilder;
026import com.google.common.collect.testing.OneSizeTestContainerGenerator;
027import com.google.common.collect.testing.TestListGenerator;
028import com.google.common.collect.testing.features.CollectionFeature;
029import com.google.common.collect.testing.features.CollectionSize;
030import com.google.common.collect.testing.features.Feature;
031import com.google.common.collect.testing.features.ListFeature;
032import java.util.Collections;
033import java.util.EnumSet;
034import java.util.List;
035import java.util.Map.Entry;
036import java.util.Set;
037import junit.framework.TestSuite;
038
039/**
040 * Creates, based on your criteria, a JUnit test suite that exhaustively tests a {@code
041 * ListMultimap} implementation.
042 *
043 * @author Louis Wasserman
044 */
045@GwtIncompatible
046public class ListMultimapTestSuiteBuilder<K, V>
047    extends MultimapTestSuiteBuilder<K, V, ListMultimap<K, V>> {
048
049  public static <K, V> ListMultimapTestSuiteBuilder<K, V> using(
050      TestListMultimapGenerator<K, V> generator) {
051    ListMultimapTestSuiteBuilder<K, V> result = new ListMultimapTestSuiteBuilder<>();
052    result.usingGenerator(generator);
053    return result;
054  }
055
056  @SuppressWarnings("rawtypes") // class literals
057  @Override
058  protected List<Class<? extends AbstractTester>> getTesters() {
059    List<Class<? extends AbstractTester>> testers = copyToList(super.getTesters());
060    testers.add(ListMultimapAsMapTester.class);
061    testers.add(ListMultimapEqualsTester.class);
062    testers.add(ListMultimapPutTester.class);
063    testers.add(ListMultimapPutAllTester.class);
064    testers.add(ListMultimapRemoveTester.class);
065    testers.add(ListMultimapReplaceValuesTester.class);
066    return testers;
067  }
068
069  @Override
070  TestSuite computeMultimapGetTestSuite(
071      FeatureSpecificTestSuiteBuilder<
072              ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>>
073          parentBuilder) {
074    return ListTestSuiteBuilder.using(
075            new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
076        .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures()))
077        .named(parentBuilder.getName() + ".get[key]")
078        .suppressing(parentBuilder.getSuppressedTests())
079        .createTestSuite();
080  }
081
082  @Override
083  TestSuite computeMultimapAsMapGetTestSuite(
084      FeatureSpecificTestSuiteBuilder<
085              ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>>
086          parentBuilder) {
087    Set<Feature<?>> features = computeMultimapAsMapGetFeatures(parentBuilder.getFeatures());
088    if (Collections.disjoint(features, EnumSet.allOf(CollectionSize.class))) {
089      return new TestSuite();
090    } else {
091      return ListTestSuiteBuilder.using(
092              new MultimapAsMapGetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
093          .withFeatures(features)
094          .named(parentBuilder.getName() + ".asMap[].get[key]")
095          .suppressing(parentBuilder.getSuppressedTests())
096          .createTestSuite();
097    }
098  }
099
100  @Override
101  Set<Feature<?>> computeMultimapGetFeatures(Set<Feature<?>> multimapFeatures) {
102    Set<Feature<?>> derivedFeatures = super.computeMultimapGetFeatures(multimapFeatures);
103    if (derivedFeatures.contains(CollectionFeature.SUPPORTS_ADD)) {
104      derivedFeatures.add(ListFeature.SUPPORTS_ADD_WITH_INDEX);
105    }
106    if (derivedFeatures.contains(CollectionFeature.SUPPORTS_REMOVE)) {
107      derivedFeatures.add(ListFeature.SUPPORTS_REMOVE_WITH_INDEX);
108    }
109    if (derivedFeatures.contains(CollectionFeature.GENERAL_PURPOSE)) {
110      derivedFeatures.add(ListFeature.GENERAL_PURPOSE);
111    }
112    return derivedFeatures;
113  }
114
115  private static class MultimapGetGenerator<K, V>
116      extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, ListMultimap<K, V>>
117      implements TestListGenerator<V> {
118    public MultimapGetGenerator(
119        OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) {
120      super(multimapGenerator);
121    }
122
123    @Override
124    public List<V> create(Object... elements) {
125      return (List<V>) super.create(elements);
126    }
127  }
128
129  private static class MultimapAsMapGetGenerator<K, V>
130      extends MultimapTestSuiteBuilder.MultimapAsMapGetGenerator<K, V, ListMultimap<K, V>>
131      implements TestListGenerator<V> {
132    public MultimapAsMapGetGenerator(
133        OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) {
134      super(multimapGenerator);
135    }
136
137    @Override
138    public List<V> create(Object... elements) {
139      return (List<V>) super.create(elements);
140    }
141  }
142}