SetMultimapTestSuiteBuilder.java revision 3c77433663281544363151bf284b0240dfd22a42
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.SetMultimap;
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.OneSizeTestContainerGenerator;
24import com.google.common.collect.testing.SetTestSuiteBuilder;
25import com.google.common.collect.testing.TestSetGenerator;
26
27import junit.framework.TestSuite;
28
29import java.util.List;
30import java.util.Map;
31import java.util.Map.Entry;
32import java.util.Set;
33
34/**
35 * Creates, based on your criteria, a JUnit test suite that exhaustively tests
36 * a {@code SetMultimap} implementation.
37 *
38 * @author Louis Wasserman
39 */
40public class SetMultimapTestSuiteBuilder<K, V>
41    extends MultimapTestSuiteBuilder<K, V, SetMultimap<K, V>> {
42
43  public static <K, V> SetMultimapTestSuiteBuilder<K, V> using(
44      TestSetMultimapGenerator<K, V> generator) {
45    SetMultimapTestSuiteBuilder<K, V> result = new SetMultimapTestSuiteBuilder<K, V>();
46    result.usingGenerator(generator);
47    return result;
48  }
49
50  @Override protected List<Class<? extends AbstractTester>> getTesters() {
51    List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters());
52    testers.add(SetMultimapPutTester.class);
53    testers.add(SetMultimapPutAllTester.class);
54    testers.add(SetMultimapReplaceValuesTester.class);
55    return testers;
56  }
57
58  @Override
59  TestSuite computeMultimapGetTestSuite(
60      FeatureSpecificTestSuiteBuilder<?, ? extends
61      OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>>> parentBuilder) {
62    return SetTestSuiteBuilder.using(
63        new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
64        .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures()))
65        .named(parentBuilder.getName() + ".get[key]")
66        .suppressing(parentBuilder.getSuppressedTests())
67        .createTestSuite();
68  }
69
70  @Override
71  TestSuite computeEntriesTestSuite(
72      FeatureSpecificTestSuiteBuilder<?, ?  extends
73          OneSizeTestContainerGenerator<SetMultimap<K, V>, Map.Entry<K, V>>> parentBuilder) {
74    return SetTestSuiteBuilder.using(
75        new EntriesGenerator<K, V>(parentBuilder.getSubjectGenerator()))
76        .withFeatures(computeEntriesFeatures(parentBuilder.getFeatures()))
77        .named(parentBuilder.getName() + ".entries")
78        .suppressing(parentBuilder.getSuppressedTests())
79        .createTestSuite();
80  }
81
82  private static class EntriesGenerator<K, V>
83      extends MultimapTestSuiteBuilder.EntriesGenerator<K, V, SetMultimap<K, V>>
84      implements TestSetGenerator<Entry<K, V>> {
85
86    public EntriesGenerator(
87        OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>> multimapGenerator) {
88      super(multimapGenerator);
89    }
90
91    @Override
92    public Set<Entry<K, V>> create(Object... elements) {
93      return (Set<Entry<K, V>>) super.create(elements);
94    }
95  }
96
97  private static class MultimapGetGenerator<K, V>
98      extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, SetMultimap<K, V>>
99      implements TestSetGenerator<V> {
100    public MultimapGetGenerator(
101        OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>> multimapGenerator) {
102      super(multimapGenerator);
103    }
104
105    @Override
106    public Set<V> create(Object... elements) {
107      return (Set<V>) super.create(elements);
108    }
109
110  }
111}
112