Home | History | Annotate | Download | only in testing
      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;
     18 
     19 import com.google.common.collect.testing.features.CollectionFeature;
     20 import com.google.common.collect.testing.features.Feature;
     21 import com.google.common.collect.testing.testers.CollectionSerializationEqualTester;
     22 import com.google.common.collect.testing.testers.SetAddAllTester;
     23 import com.google.common.collect.testing.testers.SetAddTester;
     24 import com.google.common.collect.testing.testers.SetCreationTester;
     25 import com.google.common.collect.testing.testers.SetEqualsTester;
     26 import com.google.common.collect.testing.testers.SetHashCodeTester;
     27 import com.google.common.collect.testing.testers.SetRemoveTester;
     28 import com.google.common.testing.SerializableTester;
     29 
     30 import junit.framework.TestSuite;
     31 
     32 import java.util.ArrayList;
     33 import java.util.Collection;
     34 import java.util.HashSet;
     35 import java.util.List;
     36 import java.util.Set;
     37 
     38 /**
     39  * Creates, based on your criteria, a JUnit test suite that exhaustively tests
     40  * a Set implementation.
     41  *
     42  * @author George van den Driessche
     43  */
     44 public class SetTestSuiteBuilder<E>
     45     extends AbstractCollectionTestSuiteBuilder<SetTestSuiteBuilder<E>, E> {
     46   public static <E> SetTestSuiteBuilder<E> using(
     47       TestSetGenerator<E> generator) {
     48     return new SetTestSuiteBuilder<E>().usingGenerator(generator);
     49   }
     50 
     51   @Override protected List<Class<? extends AbstractTester>> getTesters() {
     52     List<Class<? extends AbstractTester>> testers
     53         = Helpers.copyToList(super.getTesters());
     54 
     55     testers.add(CollectionSerializationEqualTester.class);
     56     testers.add(SetAddAllTester.class);
     57     testers.add(SetAddTester.class);
     58     testers.add(SetCreationTester.class);
     59     testers.add(SetHashCodeTester.class);
     60     testers.add(SetEqualsTester.class);
     61     testers.add(SetRemoveTester.class);
     62     // SetRemoveAllTester doesn't exist because, Sets not permitting
     63     // duplicate elements, there are no tests for Set.removeAll() that aren't
     64     // covered by CollectionRemoveAllTester.
     65     return testers;
     66   }
     67 
     68   @Override
     69   protected
     70       List<TestSuite>
     71       createDerivedSuites(
     72           FeatureSpecificTestSuiteBuilder<
     73               ?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>> parentBuilder) {
     74     List<TestSuite> derivedSuites = new ArrayList<TestSuite>(
     75         super.createDerivedSuites(parentBuilder));
     76 
     77     if (parentBuilder.getFeatures().contains(CollectionFeature.SERIALIZABLE)) {
     78       derivedSuites.add(SetTestSuiteBuilder
     79           .using(new ReserializedSetGenerator<E>(parentBuilder.getSubjectGenerator()))
     80           .named(getName() + " reserialized")
     81           .withFeatures(computeReserializedCollectionFeatures(parentBuilder.getFeatures()))
     82           .suppressing(parentBuilder.getSuppressedTests())
     83           .createTestSuite());
     84     }
     85     return derivedSuites;
     86   }
     87 
     88   static class ReserializedSetGenerator<E> implements TestSetGenerator<E>{
     89     final OneSizeTestContainerGenerator<Collection<E>, E> gen;
     90 
     91     private ReserializedSetGenerator(OneSizeTestContainerGenerator<Collection<E>, E> gen) {
     92       this.gen = gen;
     93     }
     94 
     95     @Override
     96     public SampleElements<E> samples() {
     97       return gen.samples();
     98     }
     99 
    100     @Override
    101     public Set<E> create(Object... elements) {
    102       return (Set<E>) SerializableTester.reserialize(gen.create(elements));
    103     }
    104 
    105     @Override
    106     public E[] createArray(int length) {
    107       return gen.createArray(length);
    108     }
    109 
    110     @Override
    111     public Iterable<E> order(List<E> insertionOrder) {
    112       return gen.order(insertionOrder);
    113     }
    114   }
    115 
    116   private static Set<Feature<?>> computeReserializedCollectionFeatures(
    117       Set<Feature<?>> features) {
    118     Set<Feature<?>> derivedFeatures = new HashSet<Feature<?>>();
    119     derivedFeatures.addAll(features);
    120     derivedFeatures.remove(CollectionFeature.SERIALIZABLE);
    121     derivedFeatures.remove(CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS);
    122     return derivedFeatures;
    123   }
    124 }
    125