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 }