001/* 002 * Copyright (C) 2012 The Guava Authors 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package com.google.common.collect.testing.google; 018 019import com.google.common.annotations.GwtIncompatible; 020import com.google.common.collect.ListMultimap; 021import com.google.common.collect.testing.AbstractTester; 022import com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder; 023import com.google.common.collect.testing.Helpers; 024import com.google.common.collect.testing.ListTestSuiteBuilder; 025import com.google.common.collect.testing.OneSizeTestContainerGenerator; 026import com.google.common.collect.testing.TestListGenerator; 027import com.google.common.collect.testing.features.CollectionFeature; 028import com.google.common.collect.testing.features.CollectionSize; 029import com.google.common.collect.testing.features.Feature; 030import com.google.common.collect.testing.features.ListFeature; 031import java.util.Collections; 032import java.util.EnumSet; 033import java.util.List; 034import java.util.Map.Entry; 035import java.util.Set; 036import junit.framework.TestSuite; 037 038/** 039 * Creates, based on your criteria, a JUnit test suite that exhaustively tests a {@code 040 * ListMultimap} implementation. 041 * 042 * @author Louis Wasserman 043 */ 044@GwtIncompatible 045public class ListMultimapTestSuiteBuilder<K, V> 046 extends MultimapTestSuiteBuilder<K, V, ListMultimap<K, V>> { 047 048 public static <K, V> ListMultimapTestSuiteBuilder<K, V> using( 049 TestListMultimapGenerator<K, V> generator) { 050 ListMultimapTestSuiteBuilder<K, V> result = new ListMultimapTestSuiteBuilder<>(); 051 result.usingGenerator(generator); 052 return result; 053 } 054 055 @SuppressWarnings("rawtypes") // class literals 056 @Override 057 protected List<Class<? extends AbstractTester>> getTesters() { 058 List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters()); 059 testers.add(ListMultimapAsMapTester.class); 060 testers.add(ListMultimapEqualsTester.class); 061 testers.add(ListMultimapPutTester.class); 062 testers.add(ListMultimapPutAllTester.class); 063 testers.add(ListMultimapRemoveTester.class); 064 testers.add(ListMultimapReplaceValuesTester.class); 065 return testers; 066 } 067 068 @Override 069 TestSuite computeMultimapGetTestSuite( 070 FeatureSpecificTestSuiteBuilder< 071 ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> 072 parentBuilder) { 073 return ListTestSuiteBuilder.using( 074 new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator())) 075 .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures())) 076 .named(parentBuilder.getName() + ".get[key]") 077 .suppressing(parentBuilder.getSuppressedTests()) 078 .createTestSuite(); 079 } 080 081 @Override 082 TestSuite computeMultimapAsMapGetTestSuite( 083 FeatureSpecificTestSuiteBuilder< 084 ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> 085 parentBuilder) { 086 Set<Feature<?>> features = computeMultimapAsMapGetFeatures(parentBuilder.getFeatures()); 087 if (Collections.disjoint(features, EnumSet.allOf(CollectionSize.class))) { 088 return new TestSuite(); 089 } else { 090 return ListTestSuiteBuilder.using( 091 new MultimapAsMapGetGenerator<K, V>(parentBuilder.getSubjectGenerator())) 092 .withFeatures(features) 093 .named(parentBuilder.getName() + ".asMap[].get[key]") 094 .suppressing(parentBuilder.getSuppressedTests()) 095 .createTestSuite(); 096 } 097 } 098 099 @Override 100 Set<Feature<?>> computeMultimapGetFeatures(Set<Feature<?>> multimapFeatures) { 101 Set<Feature<?>> derivedFeatures = super.computeMultimapGetFeatures(multimapFeatures); 102 if (derivedFeatures.contains(CollectionFeature.SUPPORTS_ADD)) { 103 derivedFeatures.add(ListFeature.SUPPORTS_ADD_WITH_INDEX); 104 } 105 if (derivedFeatures.contains(CollectionFeature.GENERAL_PURPOSE)) { 106 derivedFeatures.add(ListFeature.GENERAL_PURPOSE); 107 } 108 return derivedFeatures; 109 } 110 111 private static class MultimapGetGenerator<K, V> 112 extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, ListMultimap<K, V>> 113 implements TestListGenerator<V> { 114 public MultimapGetGenerator( 115 OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) { 116 super(multimapGenerator); 117 } 118 119 @Override 120 public List<V> create(Object... elements) { 121 return (List<V>) super.create(elements); 122 } 123 } 124 125 private static class MultimapAsMapGetGenerator<K, V> 126 extends MultimapTestSuiteBuilder.MultimapAsMapGetGenerator<K, V, ListMultimap<K, V>> 127 implements TestListGenerator<V> { 128 public MultimapAsMapGetGenerator( 129 OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) { 130 super(multimapGenerator); 131 } 132 133 @Override 134 public List<V> create(Object... elements) { 135 return (List<V>) super.create(elements); 136 } 137 } 138}