ListMultimapTestSuiteBuilder.java revision 0888a09821a98ac0680fad765217302858e70fa4
1/*
2 * Copyright (C) 2012 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.common.collect.testing.google;
18
19import com.google.common.collect.ListMultimap;
20import com.google.common.collect.testing.AbstractTester;
21import com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder;
22import com.google.common.collect.testing.Helpers;
23import com.google.common.collect.testing.ListTestSuiteBuilder;
24import com.google.common.collect.testing.OneSizeTestContainerGenerator;
25import com.google.common.collect.testing.TestListGenerator;
26import com.google.common.collect.testing.features.CollectionFeature;
27import com.google.common.collect.testing.features.CollectionSize;
28import com.google.common.collect.testing.features.Feature;
29import com.google.common.collect.testing.features.ListFeature;
30
31import junit.framework.TestSuite;
32
33import java.util.Collections;
34import java.util.EnumSet;
35import java.util.List;
36import java.util.Map.Entry;
37import java.util.Set;
38
39/**
40 * Creates, based on your criteria, a JUnit test suite that exhaustively tests
41 * a {@code ListMultimap} implementation.
42 *
43 * @author Louis Wasserman
44 */
45public class ListMultimapTestSuiteBuilder<K, V> extends
46    MultimapTestSuiteBuilder<K, V, ListMultimap<K, V>> {
47
48  public static <K, V> ListMultimapTestSuiteBuilder<K, V> using(
49      TestListMultimapGenerator<K, V> generator) {
50    ListMultimapTestSuiteBuilder<K, V> result = new ListMultimapTestSuiteBuilder<K, V>();
51    result.usingGenerator(generator);
52    return result;
53  }
54
55  @Override protected List<Class<? extends AbstractTester>> getTesters() {
56    List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters());
57    testers.add(ListMultimapAsMapTester.class);
58    testers.add(ListMultimapEqualsTester.class);
59    testers.add(ListMultimapPutTester.class);
60    testers.add(ListMultimapPutAllTester.class);
61    testers.add(ListMultimapRemoveTester.class);
62    testers.add(ListMultimapReplaceValuesTester.class);
63    return testers;
64  }
65
66  @Override
67  TestSuite computeMultimapGetTestSuite(
68      FeatureSpecificTestSuiteBuilder<?, ? extends
69      OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> parentBuilder) {
70    return ListTestSuiteBuilder.using(
71        new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
72        .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures()))
73        .named(parentBuilder.getName() + ".get[key]")
74        .suppressing(parentBuilder.getSuppressedTests())
75        .createTestSuite();
76  }
77
78  @Override
79  TestSuite computeMultimapAsMapGetTestSuite(
80      FeatureSpecificTestSuiteBuilder<?, ? extends
81      OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> parentBuilder) {
82    Set<Feature<?>> features = computeMultimapAsMapGetFeatures(parentBuilder.getFeatures());
83    if (Collections.disjoint(features, EnumSet.allOf(CollectionSize.class))) {
84      return new TestSuite();
85    } else {
86      return ListTestSuiteBuilder.using(
87          new MultimapAsMapGetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
88          .withFeatures(features)
89          .named(parentBuilder.getName() + ".asMap[].get[key]")
90          .suppressing(parentBuilder.getSuppressedTests())
91          .createTestSuite();
92    }
93  }
94
95  @Override
96  Set<Feature<?>> computeMultimapGetFeatures(
97      Set<Feature<?>> multimapFeatures) {
98    Set<Feature<?>> derivedFeatures = super.computeMultimapGetFeatures(multimapFeatures);
99    if (derivedFeatures.contains(CollectionFeature.SUPPORTS_ADD)) {
100      derivedFeatures.add(ListFeature.SUPPORTS_ADD_WITH_INDEX);
101    }
102    if (derivedFeatures.contains(CollectionFeature.GENERAL_PURPOSE)) {
103      derivedFeatures.add(ListFeature.GENERAL_PURPOSE);
104    }
105    return derivedFeatures;
106  }
107
108  private static class MultimapGetGenerator<K, V>
109      extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, ListMultimap<K, V>>
110      implements TestListGenerator<V> {
111    public MultimapGetGenerator(
112        OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) {
113      super(multimapGenerator);
114    }
115
116    @Override
117    public List<V> create(Object... elements) {
118      return (List<V>) super.create(elements);
119    }
120
121  }
122
123  private static class MultimapAsMapGetGenerator<K, V>
124      extends MultimapTestSuiteBuilder.MultimapAsMapGetGenerator<K, V, ListMultimap<K, V>>
125      implements TestListGenerator<V> {
126    public MultimapAsMapGetGenerator(
127        OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) {
128      super(multimapGenerator);
129    }
130
131    @Override
132    public List<V> create(Object... elements) {
133      return (List<V>) super.create(elements);
134    }
135  }
136}
137