Coverage Summary for Class: MultisetTestSuiteBuilder (com.google.common.collect.testing.google)
| Class | Method, % | Line, % |
|---|---|---|
| MultisetTestSuiteBuilder | 0% (0/8) | 0% (0/60) |
| MultisetTestSuiteBuilder$ElementSetGenerator | 0% (0/5) | 0% (0/10) |
| MultisetTestSuiteBuilder$EntrySetGenerator | 0% (0/6) | 0% (0/31) |
| MultisetTestSuiteBuilder$NoRecurse | 0% (0/2) | 0% (0/3) |
| MultisetTestSuiteBuilder$ReserializedMultisetGenerator | 0% (0/6) | 0% (0/7) |
| Total | 0% (0/27) | 0% (0/111) |
1 /* 2 * Copyright (C) 2008 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 static com.google.common.base.Preconditions.checkArgument; 20 21 import com.google.common.annotations.GwtIncompatible; 22 import com.google.common.collect.Multiset; 23 import com.google.common.collect.Multiset.Entry; 24 import com.google.common.collect.Multisets; 25 import com.google.common.collect.testing.AbstractCollectionTestSuiteBuilder; 26 import com.google.common.collect.testing.AbstractTester; 27 import com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder; 28 import com.google.common.collect.testing.Helpers; 29 import com.google.common.collect.testing.OneSizeTestContainerGenerator; 30 import com.google.common.collect.testing.SampleElements; 31 import com.google.common.collect.testing.SetTestSuiteBuilder; 32 import com.google.common.collect.testing.TestSetGenerator; 33 import com.google.common.collect.testing.features.CollectionFeature; 34 import com.google.common.collect.testing.features.Feature; 35 import com.google.common.collect.testing.testers.CollectionSerializationEqualTester; 36 import com.google.common.testing.SerializableTester; 37 import java.util.ArrayList; 38 import java.util.Collection; 39 import java.util.Collections; 40 import java.util.HashSet; 41 import java.util.LinkedHashMap; 42 import java.util.LinkedHashSet; 43 import java.util.List; 44 import java.util.Map; 45 import java.util.Set; 46 import junit.framework.TestSuite; 47 48 /** 49 * Creates, based on your criteria, a JUnit test suite that exhaustively tests a {@code Multiset} 50 * implementation. 51 * 52 * @author Jared Levy 53 * @author Louis Wasserman 54 */ 55 @GwtIncompatible 56 public class MultisetTestSuiteBuilder<E> 57 extends AbstractCollectionTestSuiteBuilder<MultisetTestSuiteBuilder<E>, E> { 58 public static <E> MultisetTestSuiteBuilder<E> using(TestMultisetGenerator<E> generator) { 59 return new MultisetTestSuiteBuilder<E>().usingGenerator(generator); 60 } 61 62 public enum NoRecurse implements Feature<Void> { 63 NO_ENTRY_SET; 64 65 @Override 66 public Set<Feature<? super Void>> getImpliedFeatures() { 67 return Collections.emptySet(); 68 } 69 } 70 71 @Override 72 protected List<Class<? extends AbstractTester>> getTesters() { 73 List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters()); 74 testers.add(CollectionSerializationEqualTester.class); 75 testers.add(MultisetAddTester.class); 76 testers.add(MultisetContainsTester.class); 77 testers.add(MultisetCountTester.class); 78 testers.add(MultisetElementSetTester.class); 79 testers.add(MultisetEqualsTester.class); 80 testers.add(MultisetForEachEntryTester.class); 81 testers.add(MultisetReadsTester.class); 82 testers.add(MultisetSetCountConditionallyTester.class); 83 testers.add(MultisetSetCountUnconditionallyTester.class); 84 testers.add(MultisetRemoveTester.class); 85 testers.add(MultisetEntrySetTester.class); 86 testers.add(MultisetIteratorTester.class); 87 testers.add(MultisetSerializationTester.class); 88 return testers; 89 } 90 91 private static Set<Feature<?>> computeEntrySetFeatures(Set<Feature<?>> features) { 92 Set<Feature<?>> derivedFeatures = new HashSet<>(features); 93 derivedFeatures.remove(CollectionFeature.GENERAL_PURPOSE); 94 derivedFeatures.remove(CollectionFeature.SUPPORTS_ADD); 95 derivedFeatures.remove(CollectionFeature.ALLOWS_NULL_VALUES); 96 derivedFeatures.add(CollectionFeature.REJECTS_DUPLICATES_AT_CREATION); 97 if (!derivedFeatures.remove(CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS)) { 98 derivedFeatures.remove(CollectionFeature.SERIALIZABLE); 99 } 100 return derivedFeatures; 101 } 102 103 static Set<Feature<?>> computeElementSetFeatures(Set<Feature<?>> features) { 104 Set<Feature<?>> derivedFeatures = new HashSet<>(features); 105 derivedFeatures.remove(CollectionFeature.GENERAL_PURPOSE); 106 derivedFeatures.remove(CollectionFeature.SUPPORTS_ADD); 107 if (!derivedFeatures.remove(CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS)) { 108 derivedFeatures.remove(CollectionFeature.SERIALIZABLE); 109 } 110 return derivedFeatures; 111 } 112 113 private static Set<Feature<?>> computeReserializedMultisetFeatures(Set<Feature<?>> features) { 114 Set<Feature<?>> derivedFeatures = new HashSet<>(features); 115 derivedFeatures.remove(CollectionFeature.SERIALIZABLE); 116 derivedFeatures.remove(CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS); 117 return derivedFeatures; 118 } 119 120 @Override 121 protected List<TestSuite> createDerivedSuites( 122 FeatureSpecificTestSuiteBuilder<?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>> 123 parentBuilder) { 124 List<TestSuite> derivedSuites = new ArrayList<>(super.createDerivedSuites(parentBuilder)); 125 126 derivedSuites.add(createElementSetTestSuite(parentBuilder)); 127 128 if (!parentBuilder.getFeatures().contains(NoRecurse.NO_ENTRY_SET)) { 129 derivedSuites.add( 130 SetTestSuiteBuilder.using(new EntrySetGenerator<E>(parentBuilder.getSubjectGenerator())) 131 .named(getName() + ".entrySet") 132 .withFeatures(computeEntrySetFeatures(parentBuilder.getFeatures())) 133 .suppressing(parentBuilder.getSuppressedTests()) 134 .createTestSuite()); 135 } 136 137 if (parentBuilder.getFeatures().contains(CollectionFeature.SERIALIZABLE)) { 138 derivedSuites.add( 139 MultisetTestSuiteBuilder.using( 140 new ReserializedMultisetGenerator<E>(parentBuilder.getSubjectGenerator())) 141 .named(getName() + " reserialized") 142 .withFeatures(computeReserializedMultisetFeatures(parentBuilder.getFeatures())) 143 .suppressing(parentBuilder.getSuppressedTests()) 144 .createTestSuite()); 145 } 146 return derivedSuites; 147 } 148 149 TestSuite createElementSetTestSuite( 150 FeatureSpecificTestSuiteBuilder<?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>> 151 parentBuilder) { 152 return SetTestSuiteBuilder.using( 153 new ElementSetGenerator<E>(parentBuilder.getSubjectGenerator())) 154 .named(getName() + ".elementSet") 155 .withFeatures(computeElementSetFeatures(parentBuilder.getFeatures())) 156 .suppressing(parentBuilder.getSuppressedTests()) 157 .createTestSuite(); 158 } 159 160 static class ElementSetGenerator<E> implements TestSetGenerator<E> { 161 final OneSizeTestContainerGenerator<Collection<E>, E> gen; 162 163 ElementSetGenerator(OneSizeTestContainerGenerator<Collection<E>, E> gen) { 164 this.gen = gen; 165 } 166 167 @Override 168 public SampleElements<E> samples() { 169 return gen.samples(); 170 } 171 172 @Override 173 public Set<E> create(Object... elements) { 174 Object[] duplicated = new Object[elements.length * 2]; 175 for (int i = 0; i < elements.length; i++) { 176 duplicated[i] = elements[i]; 177 duplicated[i + elements.length] = elements[i]; 178 } 179 return ((Multiset<E>) gen.create(duplicated)).elementSet(); 180 } 181 182 @Override 183 public E[] createArray(int length) { 184 return gen.createArray(length); 185 } 186 187 @Override 188 public Iterable<E> order(List<E> insertionOrder) { 189 return gen.order(new ArrayList<E>(new LinkedHashSet<E>(insertionOrder))); 190 } 191 } 192 193 static class EntrySetGenerator<E> implements TestSetGenerator<Multiset.Entry<E>> { 194 final OneSizeTestContainerGenerator<Collection<E>, E> gen; 195 196 private EntrySetGenerator(OneSizeTestContainerGenerator<Collection<E>, E> gen) { 197 this.gen = gen; 198 } 199 200 @Override 201 public SampleElements<Multiset.Entry<E>> samples() { 202 SampleElements<E> samples = gen.samples(); 203 return new SampleElements<>( 204 Multisets.immutableEntry(samples.e0(), 3), 205 Multisets.immutableEntry(samples.e1(), 4), 206 Multisets.immutableEntry(samples.e2(), 1), 207 Multisets.immutableEntry(samples.e3(), 5), 208 Multisets.immutableEntry(samples.e4(), 2)); 209 } 210 211 @Override 212 public Set<Multiset.Entry<E>> create(Object... entries) { 213 List<Object> contents = new ArrayList<>(); 214 Set<E> elements = new HashSet<>(); 215 for (Object o : entries) { 216 @SuppressWarnings("unchecked") 217 Multiset.Entry<E> entry = (Entry<E>) o; 218 checkArgument( 219 elements.add(entry.getElement()), "Duplicate keys not allowed in EntrySetGenerator"); 220 for (int i = 0; i < entry.getCount(); i++) { 221 contents.add(entry.getElement()); 222 } 223 } 224 return ((Multiset<E>) gen.create(contents.toArray())).entrySet(); 225 } 226 227 @SuppressWarnings("unchecked") 228 @Override 229 public Multiset.Entry<E>[] createArray(int length) { 230 return new Multiset.Entry[length]; 231 } 232 233 @Override 234 public Iterable<Entry<E>> order(List<Entry<E>> insertionOrder) { 235 // We mimic the order from gen. 236 Map<E, Entry<E>> map = new LinkedHashMap<>(); 237 for (Entry<E> entry : insertionOrder) { 238 map.put(entry.getElement(), entry); 239 } 240 241 Set<E> seen = new HashSet<>(); 242 List<Entry<E>> order = new ArrayList<>(); 243 for (E e : gen.order(new ArrayList<E>(map.keySet()))) { 244 if (seen.add(e)) { 245 order.add(map.get(e)); 246 } 247 } 248 return order; 249 } 250 } 251 252 static class ReserializedMultisetGenerator<E> implements TestMultisetGenerator<E> { 253 final OneSizeTestContainerGenerator<Collection<E>, E> gen; 254 255 private ReserializedMultisetGenerator(OneSizeTestContainerGenerator<Collection<E>, E> gen) { 256 this.gen = gen; 257 } 258 259 @Override 260 public SampleElements<E> samples() { 261 return gen.samples(); 262 } 263 264 @Override 265 public Multiset<E> create(Object... elements) { 266 return (Multiset<E>) SerializableTester.reserialize(gen.create(elements)); 267 } 268 269 @Override 270 public E[] createArray(int length) { 271 return gen.createArray(length); 272 } 273 274 @Override 275 public Iterable<E> order(List<E> insertionOrder) { 276 return gen.order(insertionOrder); 277 } 278 } 279 }