17dd252788645e940eada959bdde927426e2531c9Paul Duffin/* 27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2012 The Guava Authors 37dd252788645e940eada959bdde927426e2531c9Paul Duffin * 47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License. 67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at 77dd252788645e940eada959bdde927426e2531c9Paul Duffin * 87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 97dd252788645e940eada959bdde927426e2531c9Paul Duffin * 107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software 117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and 147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License. 157dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 167dd252788645e940eada959bdde927426e2531c9Paul Duffin 177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect.testing.google; 187dd252788645e940eada959bdde927426e2531c9Paul Duffin 197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ListMultimap; 207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.AbstractTester; 217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder; 227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.Helpers; 237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.ListTestSuiteBuilder; 247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.OneSizeTestContainerGenerator; 257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestListGenerator; 267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionFeature; 270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.features.CollectionSize; 287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.Feature; 297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.ListFeature; 307dd252788645e940eada959bdde927426e2531c9Paul Duffin 317dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestSuite; 327dd252788645e940eada959bdde927426e2531c9Paul Duffin 330888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections; 340888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.EnumSet; 357dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.List; 367dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Map.Entry; 377dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Set; 387dd252788645e940eada959bdde927426e2531c9Paul Duffin 397dd252788645e940eada959bdde927426e2531c9Paul Duffin/** 407dd252788645e940eada959bdde927426e2531c9Paul Duffin * Creates, based on your criteria, a JUnit test suite that exhaustively tests 417dd252788645e940eada959bdde927426e2531c9Paul Duffin * a {@code ListMultimap} implementation. 427dd252788645e940eada959bdde927426e2531c9Paul Duffin * 437dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Louis Wasserman 447dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 457dd252788645e940eada959bdde927426e2531c9Paul Duffinpublic class ListMultimapTestSuiteBuilder<K, V> extends 467dd252788645e940eada959bdde927426e2531c9Paul Duffin MultimapTestSuiteBuilder<K, V, ListMultimap<K, V>> { 477dd252788645e940eada959bdde927426e2531c9Paul Duffin 487dd252788645e940eada959bdde927426e2531c9Paul Duffin public static <K, V> ListMultimapTestSuiteBuilder<K, V> using( 497dd252788645e940eada959bdde927426e2531c9Paul Duffin TestListMultimapGenerator<K, V> generator) { 507dd252788645e940eada959bdde927426e2531c9Paul Duffin ListMultimapTestSuiteBuilder<K, V> result = new ListMultimapTestSuiteBuilder<K, V>(); 517dd252788645e940eada959bdde927426e2531c9Paul Duffin result.usingGenerator(generator); 527dd252788645e940eada959bdde927426e2531c9Paul Duffin return result; 537dd252788645e940eada959bdde927426e2531c9Paul Duffin } 547dd252788645e940eada959bdde927426e2531c9Paul Duffin 557dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override protected List<Class<? extends AbstractTester>> getTesters() { 567dd252788645e940eada959bdde927426e2531c9Paul Duffin List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters()); 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin testers.add(ListMultimapAsMapTester.class); 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin testers.add(ListMultimapEqualsTester.class); 597dd252788645e940eada959bdde927426e2531c9Paul Duffin testers.add(ListMultimapPutTester.class); 607dd252788645e940eada959bdde927426e2531c9Paul Duffin testers.add(ListMultimapPutAllTester.class); 617dd252788645e940eada959bdde927426e2531c9Paul Duffin testers.add(ListMultimapRemoveTester.class); 627dd252788645e940eada959bdde927426e2531c9Paul Duffin testers.add(ListMultimapReplaceValuesTester.class); 637dd252788645e940eada959bdde927426e2531c9Paul Duffin return testers; 647dd252788645e940eada959bdde927426e2531c9Paul Duffin } 657dd252788645e940eada959bdde927426e2531c9Paul Duffin 667dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 677dd252788645e940eada959bdde927426e2531c9Paul Duffin TestSuite computeMultimapGetTestSuite( 687dd252788645e940eada959bdde927426e2531c9Paul Duffin FeatureSpecificTestSuiteBuilder<?, ? extends 697dd252788645e940eada959bdde927426e2531c9Paul Duffin OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> parentBuilder) { 707dd252788645e940eada959bdde927426e2531c9Paul Duffin return ListTestSuiteBuilder.using( 717dd252788645e940eada959bdde927426e2531c9Paul Duffin new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator())) 727dd252788645e940eada959bdde927426e2531c9Paul Duffin .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures())) 737dd252788645e940eada959bdde927426e2531c9Paul Duffin .named(parentBuilder.getName() + ".get[key]") 747dd252788645e940eada959bdde927426e2531c9Paul Duffin .suppressing(parentBuilder.getSuppressedTests()) 757dd252788645e940eada959bdde927426e2531c9Paul Duffin .createTestSuite(); 767dd252788645e940eada959bdde927426e2531c9Paul Duffin } 777dd252788645e940eada959bdde927426e2531c9Paul Duffin 787dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin TestSuite computeMultimapAsMapGetTestSuite( 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin FeatureSpecificTestSuiteBuilder<?, ? extends 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> parentBuilder) { 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<Feature<?>> features = computeMultimapAsMapGetFeatures(parentBuilder.getFeatures()); 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (Collections.disjoint(features, EnumSet.allOf(CollectionSize.class))) { 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new TestSuite(); 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin } else { 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin return ListTestSuiteBuilder.using( 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin new MultimapAsMapGetGenerator<K, V>(parentBuilder.getSubjectGenerator())) 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin .withFeatures(features) 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin .named(parentBuilder.getName() + ".asMap[].get[key]") 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin .suppressing(parentBuilder.getSuppressedTests()) 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin .createTestSuite(); 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 967dd252788645e940eada959bdde927426e2531c9Paul Duffin Set<Feature<?>> computeMultimapGetFeatures( 977dd252788645e940eada959bdde927426e2531c9Paul Duffin Set<Feature<?>> multimapFeatures) { 987dd252788645e940eada959bdde927426e2531c9Paul Duffin Set<Feature<?>> derivedFeatures = super.computeMultimapGetFeatures(multimapFeatures); 997dd252788645e940eada959bdde927426e2531c9Paul Duffin if (derivedFeatures.contains(CollectionFeature.SUPPORTS_ADD)) { 1007dd252788645e940eada959bdde927426e2531c9Paul Duffin derivedFeatures.add(ListFeature.SUPPORTS_ADD_WITH_INDEX); 1017dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1027dd252788645e940eada959bdde927426e2531c9Paul Duffin if (derivedFeatures.contains(CollectionFeature.GENERAL_PURPOSE)) { 1037dd252788645e940eada959bdde927426e2531c9Paul Duffin derivedFeatures.add(ListFeature.GENERAL_PURPOSE); 1047dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1057dd252788645e940eada959bdde927426e2531c9Paul Duffin return derivedFeatures; 1067dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1077dd252788645e940eada959bdde927426e2531c9Paul Duffin 1087dd252788645e940eada959bdde927426e2531c9Paul Duffin private static class MultimapGetGenerator<K, V> 1097dd252788645e940eada959bdde927426e2531c9Paul Duffin extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, ListMultimap<K, V>> 1107dd252788645e940eada959bdde927426e2531c9Paul Duffin implements TestListGenerator<V> { 1117dd252788645e940eada959bdde927426e2531c9Paul Duffin public MultimapGetGenerator( 1127dd252788645e940eada959bdde927426e2531c9Paul Duffin OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) { 1137dd252788645e940eada959bdde927426e2531c9Paul Duffin super(multimapGenerator); 1147dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1157dd252788645e940eada959bdde927426e2531c9Paul Duffin 1167dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1177dd252788645e940eada959bdde927426e2531c9Paul Duffin public List<V> create(Object... elements) { 1187dd252788645e940eada959bdde927426e2531c9Paul Duffin return (List<V>) super.create(elements); 1197dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1207dd252788645e940eada959bdde927426e2531c9Paul Duffin 1217dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static class MultimapAsMapGetGenerator<K, V> 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends MultimapTestSuiteBuilder.MultimapAsMapGetGenerator<K, V, ListMultimap<K, V>> 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements TestListGenerator<V> { 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin public MultimapAsMapGetGenerator( 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) { 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(multimapGenerator); 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin public List<V> create(Object... elements) { 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (List<V>) super.create(elements); 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1367dd252788645e940eada959bdde927426e2531c9Paul Duffin} 137