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  @SuppressWarnings("rawtypes") // class literals
056  @Override
057  protected List<Class<? extends AbstractTester>> getTesters() {
058    List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters());
059    testers.add(ListMultimapAsMapTester.class);
060    testers.add(ListMultimapEqualsTester.class);
061    testers.add(ListMultimapPutTester.class);
062    testers.add(ListMultimapPutAllTester.class);
063    testers.add(ListMultimapRemoveTester.class);
064    testers.add(ListMultimapReplaceValuesTester.class);
065    return testers;
066  }
067
068  @Override
069  TestSuite computeMultimapGetTestSuite(
070      FeatureSpecificTestSuiteBuilder<
071              ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>>
072          parentBuilder) {
073    return ListTestSuiteBuilder.using(
074            new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
075        .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures()))
076        .named(parentBuilder.getName() + ".get[key]")
077        .suppressing(parentBuilder.getSuppressedTests())
078        .createTestSuite();
079  }
080
081  @Override
082  TestSuite computeMultimapAsMapGetTestSuite(
083      FeatureSpecificTestSuiteBuilder<
084              ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>>
085          parentBuilder) {
086    Set<Feature<?>> features = computeMultimapAsMapGetFeatures(parentBuilder.getFeatures());
087    if (Collections.disjoint(features, EnumSet.allOf(CollectionSize.class))) {
088      return new TestSuite();
089    } else {
090      return ListTestSuiteBuilder.using(
091              new MultimapAsMapGetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
092          .withFeatures(features)
093          .named(parentBuilder.getName() + ".asMap[].get[key]")
094          .suppressing(parentBuilder.getSuppressedTests())
095          .createTestSuite();
096    }
097  }
098
099  @Override
100  Set<Feature<?>> computeMultimapGetFeatures(Set<Feature<?>> multimapFeatures) {
101    Set<Feature<?>> derivedFeatures = super.computeMultimapGetFeatures(multimapFeatures);
102    if (derivedFeatures.contains(CollectionFeature.SUPPORTS_ADD)) {
103      derivedFeatures.add(ListFeature.SUPPORTS_ADD_WITH_INDEX);
104    }
105    if (derivedFeatures.contains(CollectionFeature.GENERAL_PURPOSE)) {
106      derivedFeatures.add(ListFeature.GENERAL_PURPOSE);
107    }
108    return derivedFeatures;
109  }
110
111  private static class MultimapGetGenerator<K, V>
112      extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, ListMultimap<K, V>>
113      implements TestListGenerator<V> {
114    public MultimapGetGenerator(
115        OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) {
116      super(multimapGenerator);
117    }
118
119    @Override
120    public List<V> create(Object... elements) {
121      return (List<V>) super.create(elements);
122    }
123  }
124
125  private static class MultimapAsMapGetGenerator<K, V>
126      extends MultimapTestSuiteBuilder.MultimapAsMapGetGenerator<K, V, ListMultimap<K, V>>
127      implements TestListGenerator<V> {
128    public MultimapAsMapGetGenerator(
129        OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) {
130      super(multimapGenerator);
131    }
132
133    @Override
134    public List<V> create(Object... elements) {
135      return (List<V>) super.create(elements);
136    }
137  }
138}