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