• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.google.common.collect.testing.google;
18 
19 import com.google.common.annotations.GwtIncompatible;
20 import com.google.common.collect.SetMultimap;
21 import com.google.common.collect.testing.AbstractTester;
22 import com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder;
23 import com.google.common.collect.testing.Helpers;
24 import com.google.common.collect.testing.OneSizeTestContainerGenerator;
25 import com.google.common.collect.testing.SetTestSuiteBuilder;
26 import com.google.common.collect.testing.TestSetGenerator;
27 import com.google.common.collect.testing.features.CollectionSize;
28 import com.google.common.collect.testing.features.Feature;
29 import java.util.Collections;
30 import java.util.EnumSet;
31 import java.util.List;
32 import java.util.Map.Entry;
33 import java.util.Set;
34 import junit.framework.TestSuite;
35 
36 /**
37  * Creates, based on your criteria, a JUnit test suite that exhaustively tests a {@code SetMultimap}
38  * implementation.
39  *
40  * @author Louis Wasserman
41  */
42 @GwtIncompatible
43 public class SetMultimapTestSuiteBuilder<K, V>
44     extends MultimapTestSuiteBuilder<K, V, SetMultimap<K, V>> {
45 
using( TestSetMultimapGenerator<K, V> generator)46   public static <K, V> SetMultimapTestSuiteBuilder<K, V> using(
47       TestSetMultimapGenerator<K, V> generator) {
48     SetMultimapTestSuiteBuilder<K, V> result = new SetMultimapTestSuiteBuilder<>();
49     result.usingGenerator(generator);
50     return result;
51   }
52 
53   @Override
getTesters()54   protected List<Class<? extends AbstractTester>> getTesters() {
55     List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters());
56     testers.add(SetMultimapAsMapTester.class);
57     testers.add(SetMultimapEqualsTester.class);
58     testers.add(SetMultimapPutTester.class);
59     testers.add(SetMultimapPutAllTester.class);
60     testers.add(SetMultimapReplaceValuesTester.class);
61     return testers;
62   }
63 
64   @Override
computeMultimapGetTestSuite( FeatureSpecificTestSuiteBuilder< ?, ? extends OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>>> parentBuilder)65   TestSuite computeMultimapGetTestSuite(
66       FeatureSpecificTestSuiteBuilder<
67               ?, ? extends OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>>>
68           parentBuilder) {
69     return SetTestSuiteBuilder.using(
70             new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator()))
71         .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures()))
72         .named(parentBuilder.getName() + ".get[key]")
73         .suppressing(parentBuilder.getSuppressedTests())
74         .createTestSuite();
75   }
76 
77   @Override
computeMultimapAsMapGetTestSuite( FeatureSpecificTestSuiteBuilder< ?, ? extends OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>>> parentBuilder)78   TestSuite computeMultimapAsMapGetTestSuite(
79       FeatureSpecificTestSuiteBuilder<
80               ?, ? extends OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>>>
81           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 SetTestSuiteBuilder.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
computeEntriesTestSuite( FeatureSpecificTestSuiteBuilder< ?, ? extends OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>>> parentBuilder)96   TestSuite computeEntriesTestSuite(
97       FeatureSpecificTestSuiteBuilder<
98               ?, ? extends OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>>>
99           parentBuilder) {
100     return SetTestSuiteBuilder.using(
101             new EntriesGenerator<K, V>(parentBuilder.getSubjectGenerator()))
102         .withFeatures(computeEntriesFeatures(parentBuilder.getFeatures()))
103         .named(parentBuilder.getName() + ".entries")
104         .suppressing(parentBuilder.getSuppressedTests())
105         .createTestSuite();
106   }
107 
108   private static class EntriesGenerator<K, V>
109       extends MultimapTestSuiteBuilder.EntriesGenerator<K, V, SetMultimap<K, V>>
110       implements TestSetGenerator<Entry<K, V>> {
111 
EntriesGenerator( OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>> multimapGenerator)112     public EntriesGenerator(
113         OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>> multimapGenerator) {
114       super(multimapGenerator);
115     }
116 
117     @Override
create(Object... elements)118     public Set<Entry<K, V>> create(Object... elements) {
119       return (Set<Entry<K, V>>) super.create(elements);
120     }
121   }
122 
123   static class MultimapGetGenerator<K, V>
124       extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, SetMultimap<K, V>>
125       implements TestSetGenerator<V> {
MultimapGetGenerator( OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>> multimapGenerator)126     public MultimapGetGenerator(
127         OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>> multimapGenerator) {
128       super(multimapGenerator);
129     }
130 
131     @Override
create(Object... elements)132     public Set<V> create(Object... elements) {
133       return (Set<V>) super.create(elements);
134     }
135   }
136 
137   static class MultimapAsMapGetGenerator<K, V>
138       extends MultimapTestSuiteBuilder.MultimapAsMapGetGenerator<K, V, SetMultimap<K, V>>
139       implements TestSetGenerator<V> {
MultimapAsMapGetGenerator( OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>> multimapGenerator)140     public MultimapAsMapGetGenerator(
141         OneSizeTestContainerGenerator<SetMultimap<K, V>, Entry<K, V>> multimapGenerator) {
142       super(multimapGenerator);
143     }
144 
145     @Override
create(Object... elements)146     public Set<V> create(Object... elements) {
147       return (Set<V>) super.create(elements);
148     }
149   }
150 }
151