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 static com.google.common.collect.testing.Helpers.copyToList; 020 021import com.google.common.annotations.GwtIncompatible; 022import com.google.common.collect.ListMultimap; 023import com.google.common.collect.testing.AbstractTester; 024import com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder; 025import com.google.common.collect.testing.ListTestSuiteBuilder; 026import com.google.common.collect.testing.OneSizeTestContainerGenerator; 027import com.google.common.collect.testing.TestListGenerator; 028import com.google.common.collect.testing.features.CollectionFeature; 029import com.google.common.collect.testing.features.CollectionSize; 030import com.google.common.collect.testing.features.Feature; 031import com.google.common.collect.testing.features.ListFeature; 032import java.util.Collections; 033import java.util.EnumSet; 034import java.util.List; 035import java.util.Map.Entry; 036import java.util.Set; 037import junit.framework.TestSuite; 038 039/** 040 * Creates, based on your criteria, a JUnit test suite that exhaustively tests a {@code 041 * ListMultimap} implementation. 042 * 043 * @author Louis Wasserman 044 */ 045@GwtIncompatible 046public class ListMultimapTestSuiteBuilder<K, V> 047 extends MultimapTestSuiteBuilder<K, V, ListMultimap<K, V>> { 048 049 public static <K, V> ListMultimapTestSuiteBuilder<K, V> using( 050 TestListMultimapGenerator<K, V> generator) { 051 ListMultimapTestSuiteBuilder<K, V> result = new ListMultimapTestSuiteBuilder<>(); 052 result.usingGenerator(generator); 053 return result; 054 } 055 056 @SuppressWarnings("rawtypes") // class literals 057 @Override 058 protected List<Class<? extends AbstractTester>> getTesters() { 059 List<Class<? extends AbstractTester>> testers = copyToList(super.getTesters()); 060 testers.add(ListMultimapAsMapTester.class); 061 testers.add(ListMultimapEqualsTester.class); 062 testers.add(ListMultimapPutTester.class); 063 testers.add(ListMultimapPutAllTester.class); 064 testers.add(ListMultimapRemoveTester.class); 065 testers.add(ListMultimapReplaceValuesTester.class); 066 return testers; 067 } 068 069 @Override 070 TestSuite computeMultimapGetTestSuite( 071 FeatureSpecificTestSuiteBuilder< 072 ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> 073 parentBuilder) { 074 return ListTestSuiteBuilder.using( 075 new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator())) 076 .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures())) 077 .named(parentBuilder.getName() + ".get[key]") 078 .suppressing(parentBuilder.getSuppressedTests()) 079 .createTestSuite(); 080 } 081 082 @Override 083 TestSuite computeMultimapAsMapGetTestSuite( 084 FeatureSpecificTestSuiteBuilder< 085 ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> 086 parentBuilder) { 087 Set<Feature<?>> features = computeMultimapAsMapGetFeatures(parentBuilder.getFeatures()); 088 if (Collections.disjoint(features, EnumSet.allOf(CollectionSize.class))) { 089 return new TestSuite(); 090 } else { 091 return ListTestSuiteBuilder.using( 092 new MultimapAsMapGetGenerator<K, V>(parentBuilder.getSubjectGenerator())) 093 .withFeatures(features) 094 .named(parentBuilder.getName() + ".asMap[].get[key]") 095 .suppressing(parentBuilder.getSuppressedTests()) 096 .createTestSuite(); 097 } 098 } 099 100 @Override 101 Set<Feature<?>> computeMultimapGetFeatures(Set<Feature<?>> multimapFeatures) { 102 Set<Feature<?>> derivedFeatures = super.computeMultimapGetFeatures(multimapFeatures); 103 if (derivedFeatures.contains(CollectionFeature.SUPPORTS_ADD)) { 104 derivedFeatures.add(ListFeature.SUPPORTS_ADD_WITH_INDEX); 105 } 106 if (derivedFeatures.contains(CollectionFeature.SUPPORTS_REMOVE)) { 107 derivedFeatures.add(ListFeature.SUPPORTS_REMOVE_WITH_INDEX); 108 } 109 if (derivedFeatures.contains(CollectionFeature.GENERAL_PURPOSE)) { 110 derivedFeatures.add(ListFeature.GENERAL_PURPOSE); 111 } 112 return derivedFeatures; 113 } 114 115 private static class MultimapGetGenerator<K, V> 116 extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, ListMultimap<K, V>> 117 implements TestListGenerator<V> { 118 public MultimapGetGenerator( 119 OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) { 120 super(multimapGenerator); 121 } 122 123 @Override 124 public List<V> create(Object... elements) { 125 return (List<V>) super.create(elements); 126 } 127 } 128 129 private static class MultimapAsMapGetGenerator<K, V> 130 extends MultimapTestSuiteBuilder.MultimapAsMapGetGenerator<K, V, ListMultimap<K, V>> 131 implements TestListGenerator<V> { 132 public MultimapAsMapGetGenerator( 133 OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) { 134 super(multimapGenerator); 135 } 136 137 @Override 138 public List<V> create(Object... elements) { 139 return (List<V>) super.create(elements); 140 } 141 } 142}