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