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 @Override 056 protected List<Class<? extends AbstractTester>> getTesters() { 057 List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters()); 058 testers.add(ListMultimapAsMapTester.class); 059 testers.add(ListMultimapEqualsTester.class); 060 testers.add(ListMultimapPutTester.class); 061 testers.add(ListMultimapPutAllTester.class); 062 testers.add(ListMultimapRemoveTester.class); 063 testers.add(ListMultimapReplaceValuesTester.class); 064 return testers; 065 } 066 067 @Override 068 TestSuite computeMultimapGetTestSuite( 069 FeatureSpecificTestSuiteBuilder< 070 ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> 071 parentBuilder) { 072 return ListTestSuiteBuilder.using( 073 new MultimapGetGenerator<K, V>(parentBuilder.getSubjectGenerator())) 074 .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures())) 075 .named(parentBuilder.getName() + ".get[key]") 076 .suppressing(parentBuilder.getSuppressedTests()) 077 .createTestSuite(); 078 } 079 080 @Override 081 TestSuite computeMultimapAsMapGetTestSuite( 082 FeatureSpecificTestSuiteBuilder< 083 ?, ? extends OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>>> 084 parentBuilder) { 085 Set<Feature<?>> features = computeMultimapAsMapGetFeatures(parentBuilder.getFeatures()); 086 if (Collections.disjoint(features, EnumSet.allOf(CollectionSize.class))) { 087 return new TestSuite(); 088 } else { 089 return ListTestSuiteBuilder.using( 090 new MultimapAsMapGetGenerator<K, V>(parentBuilder.getSubjectGenerator())) 091 .withFeatures(features) 092 .named(parentBuilder.getName() + ".asMap[].get[key]") 093 .suppressing(parentBuilder.getSuppressedTests()) 094 .createTestSuite(); 095 } 096 } 097 098 @Override 099 Set<Feature<?>> computeMultimapGetFeatures(Set<Feature<?>> multimapFeatures) { 100 Set<Feature<?>> derivedFeatures = super.computeMultimapGetFeatures(multimapFeatures); 101 if (derivedFeatures.contains(CollectionFeature.SUPPORTS_ADD)) { 102 derivedFeatures.add(ListFeature.SUPPORTS_ADD_WITH_INDEX); 103 } 104 if (derivedFeatures.contains(CollectionFeature.GENERAL_PURPOSE)) { 105 derivedFeatures.add(ListFeature.GENERAL_PURPOSE); 106 } 107 return derivedFeatures; 108 } 109 110 private static class MultimapGetGenerator<K, V> 111 extends MultimapTestSuiteBuilder.MultimapGetGenerator<K, V, ListMultimap<K, V>> 112 implements TestListGenerator<V> { 113 public MultimapGetGenerator( 114 OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) { 115 super(multimapGenerator); 116 } 117 118 @Override 119 public List<V> create(Object... elements) { 120 return (List<V>) super.create(elements); 121 } 122 } 123 124 private static class MultimapAsMapGetGenerator<K, V> 125 extends MultimapTestSuiteBuilder.MultimapAsMapGetGenerator<K, V, ListMultimap<K, V>> 126 implements TestListGenerator<V> { 127 public MultimapAsMapGetGenerator( 128 OneSizeTestContainerGenerator<ListMultimap<K, V>, Entry<K, V>> multimapGenerator) { 129 super(multimapGenerator); 130 } 131 132 @Override 133 public List<V> create(Object... elements) { 134 return (List<V>) super.create(elements); 135 } 136 } 137}