• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.testing;
18 
19 import static com.google.common.base.Preconditions.checkNotNull;
20 import static com.google.common.base.Throwables.throwIfUnchecked;
21 
22 import com.google.common.annotations.GwtIncompatible;
23 import com.google.common.annotations.J2ktIncompatible;
24 import com.google.common.base.CharMatcher;
25 import com.google.common.base.Charsets;
26 import com.google.common.base.Equivalence;
27 import com.google.common.base.Joiner;
28 import com.google.common.base.Splitter;
29 import com.google.common.base.Ticker;
30 import com.google.common.collect.ArrayListMultimap;
31 import com.google.common.collect.BiMap;
32 import com.google.common.collect.HashBasedTable;
33 import com.google.common.collect.HashBiMap;
34 import com.google.common.collect.HashMultimap;
35 import com.google.common.collect.HashMultiset;
36 import com.google.common.collect.ImmutableBiMap;
37 import com.google.common.collect.ImmutableCollection;
38 import com.google.common.collect.ImmutableList;
39 import com.google.common.collect.ImmutableListMultimap;
40 import com.google.common.collect.ImmutableMap;
41 import com.google.common.collect.ImmutableMultimap;
42 import com.google.common.collect.ImmutableMultiset;
43 import com.google.common.collect.ImmutableSet;
44 import com.google.common.collect.ImmutableSetMultimap;
45 import com.google.common.collect.ImmutableSortedMap;
46 import com.google.common.collect.ImmutableSortedMultiset;
47 import com.google.common.collect.ImmutableSortedSet;
48 import com.google.common.collect.ImmutableTable;
49 import com.google.common.collect.Iterables;
50 import com.google.common.collect.LinkedHashMultimap;
51 import com.google.common.collect.LinkedHashMultiset;
52 import com.google.common.collect.ListMultimap;
53 import com.google.common.collect.Lists;
54 import com.google.common.collect.Maps;
55 import com.google.common.collect.Multimap;
56 import com.google.common.collect.Multiset;
57 import com.google.common.collect.Ordering;
58 import com.google.common.collect.Range;
59 import com.google.common.collect.RowSortedTable;
60 import com.google.common.collect.SetMultimap;
61 import com.google.common.collect.Sets;
62 import com.google.common.collect.SortedMultiset;
63 import com.google.common.collect.Table;
64 import com.google.common.collect.TreeBasedTable;
65 import com.google.common.collect.TreeMultiset;
66 import com.google.common.primitives.Primitives;
67 import com.google.common.primitives.UnsignedInteger;
68 import com.google.common.primitives.UnsignedLong;
69 import com.google.common.reflect.AbstractInvocationHandler;
70 import com.google.common.reflect.Invokable;
71 import com.google.common.reflect.Parameter;
72 import com.google.common.reflect.Reflection;
73 import com.google.common.reflect.TypeToken;
74 import java.io.ByteArrayInputStream;
75 import java.io.File;
76 import java.io.InputStream;
77 import java.io.Reader;
78 import java.io.StringReader;
79 import java.lang.annotation.ElementType;
80 import java.lang.annotation.Retention;
81 import java.lang.annotation.RetentionPolicy;
82 import java.lang.annotation.Target;
83 import java.lang.reflect.Array;
84 import java.lang.reflect.InvocationTargetException;
85 import java.lang.reflect.Method;
86 import java.lang.reflect.Type;
87 import java.lang.reflect.TypeVariable;
88 import java.math.BigDecimal;
89 import java.math.BigInteger;
90 import java.nio.Buffer;
91 import java.nio.ByteBuffer;
92 import java.nio.CharBuffer;
93 import java.nio.DoubleBuffer;
94 import java.nio.FloatBuffer;
95 import java.nio.IntBuffer;
96 import java.nio.LongBuffer;
97 import java.nio.ShortBuffer;
98 import java.nio.charset.Charset;
99 import java.util.ArrayList;
100 import java.util.Arrays;
101 import java.util.Collection;
102 import java.util.Comparator;
103 import java.util.Currency;
104 import java.util.HashMap;
105 import java.util.HashSet;
106 import java.util.LinkedHashMap;
107 import java.util.LinkedHashSet;
108 import java.util.LinkedList;
109 import java.util.List;
110 import java.util.Locale;
111 import java.util.Map;
112 import java.util.NavigableMap;
113 import java.util.NavigableSet;
114 import java.util.Set;
115 import java.util.SortedMap;
116 import java.util.SortedSet;
117 import java.util.TreeMap;
118 import java.util.TreeSet;
119 import java.util.concurrent.ConcurrentMap;
120 import java.util.concurrent.atomic.AtomicInteger;
121 import java.util.regex.Pattern;
122 import org.checkerframework.checker.nullness.qual.Nullable;
123 
124 /**
125  * Generates fresh instances of types that are different from each other (if possible).
126  *
127  * @author Ben Yu
128  */
129 @GwtIncompatible
130 @J2ktIncompatible
131 class FreshValueGenerator {
132 
133   private static final ImmutableMap<Class<?>, Method> GENERATORS;
134 
135   static {
136     ImmutableMap.Builder<Class<?>, Method> builder = ImmutableMap.builder();
137     for (Method method : FreshValueGenerator.class.getDeclaredMethods()) {
138       if (method.isAnnotationPresent(Generates.class)) {
method.getReturnType()139         builder.put(method.getReturnType(), method);
140       }
141     }
142     GENERATORS = builder.buildOrThrow();
143   }
144 
145   private static final ImmutableMap<Class<?>, Method> EMPTY_GENERATORS;
146 
147   static {
148     ImmutableMap.Builder<Class<?>, Method> builder = ImmutableMap.builder();
149     for (Method method : FreshValueGenerator.class.getDeclaredMethods()) {
150       if (method.isAnnotationPresent(Empty.class)) {
method.getReturnType()151         builder.put(method.getReturnType(), method);
152       }
153     }
154     EMPTY_GENERATORS = builder.buildOrThrow();
155   }
156 
157   private final AtomicInteger freshness = new AtomicInteger(1);
158   private final ListMultimap<Class<?>, Object> sampleInstances = ArrayListMultimap.create();
159 
160   /**
161    * The freshness level at which the {@link Empty @Empty} annotated method was invoked to generate
162    * instance.
163    */
164   private final Map<Type, Integer> emptyInstanceGenerated = new HashMap<>();
165 
addSampleInstances(Class<T> type, Iterable<? extends T> instances)166   final <T> void addSampleInstances(Class<T> type, Iterable<? extends T> instances) {
167     sampleInstances.putAll(checkNotNull(type), checkNotNull(instances));
168   }
169 
170   /**
171    * Returns a fresh instance for {@code type} if possible. The returned instance could be:
172    *
173    * <ul>
174    *   <li>exactly of the given type, including generic type parameters, such as {@code
175    *       ImmutableList<String>};
176    *   <li>of the raw type;
177    *   <li>null if no value can be generated.
178    * </ul>
179    */
generateFresh(TypeToken<?> type)180   final @Nullable Object generateFresh(TypeToken<?> type) {
181     Object generated = generate(type);
182     if (generated != null) {
183       freshness.incrementAndGet();
184     }
185     return generated;
186   }
187 
generateFresh(Class<T> type)188   final <T> @Nullable T generateFresh(Class<T> type) {
189     return Primitives.wrap(type).cast(generateFresh(TypeToken.of(type)));
190   }
191 
newFreshProxy(final Class<T> interfaceType)192   final <T> T newFreshProxy(final Class<T> interfaceType) {
193     T proxy = newProxy(interfaceType);
194     freshness.incrementAndGet();
195     return proxy;
196   }
197 
198   /**
199    * Generates an instance for {@code type} using the current {@link #freshness}. The generated
200    * instance may or may not be unique across different calls.
201    */
generate(TypeToken<?> type)202   private @Nullable Object generate(TypeToken<?> type) {
203     Class<?> rawType = type.getRawType();
204     List<Object> samples = sampleInstances.get(rawType);
205     Object sample = pickInstance(samples, null);
206     if (sample != null) {
207       return sample;
208     }
209     if (rawType.isEnum()) {
210       return pickInstance(rawType.getEnumConstants(), null);
211     }
212     if (type.isArray()) {
213       TypeToken<?> componentType = checkNotNull(type.getComponentType());
214       Object array = Array.newInstance(componentType.getRawType(), 1);
215       Array.set(array, 0, generate(componentType));
216       return array;
217     }
218     Method emptyGenerate = EMPTY_GENERATORS.get(rawType);
219     if (emptyGenerate != null) {
220       if (emptyInstanceGenerated.containsKey(type.getType())) {
221         // empty instance already generated
222         if (emptyInstanceGenerated.get(type.getType()).intValue() == freshness.get()) {
223           // same freshness, generate again.
224           return invokeGeneratorMethod(emptyGenerate);
225         } else {
226           // Cannot use empty generator. Proceed with other generators.
227         }
228       } else {
229         // never generated empty instance for this type before.
230         Object emptyInstance = invokeGeneratorMethod(emptyGenerate);
231         emptyInstanceGenerated.put(type.getType(), freshness.get());
232         return emptyInstance;
233       }
234     }
235     Method generate = GENERATORS.get(rawType);
236     if (generate != null) {
237       ImmutableList<Parameter> params = Invokable.from(generate).getParameters();
238       List<Object> args = Lists.newArrayListWithCapacity(params.size());
239       TypeVariable<?>[] typeVars = rawType.getTypeParameters();
240       for (int i = 0; i < params.size(); i++) {
241         TypeToken<?> paramType = type.resolveType(typeVars[i]);
242         // We require all @Generates methods to either be parameter-less or accept non-null
243         // values for their generic parameter types.
244         Object argValue = generate(paramType);
245         if (argValue == null) {
246           // When a parameter of a @Generates method cannot be created,
247           // The type most likely is a collection.
248           // Our distinct proxy doesn't work for collections.
249           // So just refuse to generate.
250           return null;
251         }
252         args.add(argValue);
253       }
254       return invokeGeneratorMethod(generate, args.toArray());
255     }
256     return defaultGenerate(rawType);
257   }
258 
defaultGenerate(Class<T> rawType)259   private <T> @Nullable T defaultGenerate(Class<T> rawType) {
260     if (rawType.isInterface()) {
261       // always create a new proxy
262       return newProxy(rawType);
263     }
264     return ArbitraryInstances.get(rawType);
265   }
266 
newProxy(final Class<T> interfaceType)267   private <T> T newProxy(final Class<T> interfaceType) {
268     return Reflection.newProxy(interfaceType, new FreshInvocationHandler(interfaceType));
269   }
270 
invokeGeneratorMethod(Method generator, Object... args)271   private Object invokeGeneratorMethod(Method generator, Object... args) {
272     try {
273       return generator.invoke(this, args);
274     } catch (InvocationTargetException e) {
275       throwIfUnchecked(e.getCause());
276       throw new RuntimeException(e.getCause());
277     } catch (Exception e) {
278       throwIfUnchecked(e);
279       throw new RuntimeException(e);
280     }
281   }
282 
283   private final class FreshInvocationHandler extends AbstractInvocationHandler {
284     private final int identity = generateInt();
285     private final Class<?> interfaceType;
286 
FreshInvocationHandler(Class<?> interfaceType)287     FreshInvocationHandler(Class<?> interfaceType) {
288       this.interfaceType = interfaceType;
289     }
290 
291     @Override
handleInvocation(Object proxy, Method method, @Nullable Object[] args)292     protected Object handleInvocation(Object proxy, Method method, @Nullable Object[] args) {
293       return interfaceMethodCalled(interfaceType, method);
294     }
295 
296     @Override
hashCode()297     public int hashCode() {
298       return identity;
299     }
300 
301     @Override
equals(@ullable Object obj)302     public boolean equals(@Nullable Object obj) {
303       if (obj instanceof FreshInvocationHandler) {
304         FreshInvocationHandler that = (FreshInvocationHandler) obj;
305         return identity == that.identity;
306       }
307       return false;
308     }
309 
310     @Override
toString()311     public String toString() {
312       return paramString(interfaceType, identity);
313     }
314   }
315 
316   /** Subclasses can override to provide different return value for proxied interface methods. */
interfaceMethodCalled(Class<?> interfaceType, Method method)317   Object interfaceMethodCalled(Class<?> interfaceType, Method method) {
318     throw new UnsupportedOperationException();
319   }
320 
pickInstance(T[] instances, T defaultValue)321   private <T> T pickInstance(T[] instances, T defaultValue) {
322     return pickInstance(Arrays.asList(instances), defaultValue);
323   }
324 
pickInstance(Collection<T> instances, T defaultValue)325   private <T> T pickInstance(Collection<T> instances, T defaultValue) {
326     if (instances.isEmpty()) {
327       return defaultValue;
328     }
329     // generateInt() is 1-based.
330     return Iterables.get(instances, (generateInt() - 1) % instances.size());
331   }
332 
paramString(Class<?> type, int i)333   private static String paramString(Class<?> type, int i) {
334     return type.getSimpleName() + '@' + i;
335   }
336 
337   /**
338    * Annotates a method to be the instance generator of a certain type. The return type is the
339    * generated type. The method parameters correspond to the generated type's type parameters. For
340    * example, if the annotated method returns {@code Map<K, V>}, the method signature should be:
341    * {@code Map<K, V> generateMap(K key, V value)}.
342    */
343   @Target(ElementType.METHOD)
344   @Retention(RetentionPolicy.RUNTIME)
345   private @interface Generates {}
346 
347   /**
348    * Annotates a method to generate the "empty" instance of a collection. This method should accept
349    * no parameter. The value it generates should be unequal to the values generated by methods
350    * annotated with {@link Generates}.
351    */
352   @Target(ElementType.METHOD)
353   @Retention(RetentionPolicy.RUNTIME)
354   private @interface Empty {}
355 
356   @Generates
generateClass()357   Class<?> generateClass() {
358     return pickInstance(
359         ImmutableList.of(
360             int.class, long.class, void.class, Object.class, Object[].class, Iterable.class),
361         Object.class);
362   }
363 
364   @Generates
generateObject()365   Object generateObject() {
366     return generateString();
367   }
368 
369   @Generates
generateNumber()370   Number generateNumber() {
371     return generateInt();
372   }
373 
374   @Generates
generateInt()375   int generateInt() {
376     return freshness.get();
377   }
378 
379   @Generates
generateInteger()380   Integer generateInteger() {
381     return new Integer(generateInt());
382   }
383 
384   @Generates
generateLong()385   long generateLong() {
386     return generateInt();
387   }
388 
389   @Generates
generateLongObject()390   Long generateLongObject() {
391     return new Long(generateLong());
392   }
393 
394   @Generates
generateFloat()395   float generateFloat() {
396     return generateInt();
397   }
398 
399   @Generates
generateFloatObject()400   Float generateFloatObject() {
401     return new Float(generateFloat());
402   }
403 
404   @Generates
generateDouble()405   double generateDouble() {
406     return generateInt();
407   }
408 
409   @Generates
generateDoubleObject()410   Double generateDoubleObject() {
411     return new Double(generateDouble());
412   }
413 
414   @Generates
generateShort()415   short generateShort() {
416     return (short) generateInt();
417   }
418 
419   @Generates
generateShortObject()420   Short generateShortObject() {
421     return new Short(generateShort());
422   }
423 
424   @Generates
generateByte()425   byte generateByte() {
426     return (byte) generateInt();
427   }
428 
429   @Generates
generateByteObject()430   Byte generateByteObject() {
431     return new Byte(generateByte());
432   }
433 
434   @Generates
generateChar()435   char generateChar() {
436     return generateString().charAt(0);
437   }
438 
439   @Generates
generateCharacter()440   Character generateCharacter() {
441     return new Character(generateChar());
442   }
443 
444   @Generates
generateBoolean()445   boolean generateBoolean() {
446     return generateInt() % 2 == 0;
447   }
448 
449   @Generates
generateBooleanObject()450   Boolean generateBooleanObject() {
451     return new Boolean(generateBoolean());
452   }
453 
454   @Generates
generateUnsignedInteger()455   UnsignedInteger generateUnsignedInteger() {
456     return UnsignedInteger.fromIntBits(generateInt());
457   }
458 
459   @Generates
generateUnsignedLong()460   UnsignedLong generateUnsignedLong() {
461     return UnsignedLong.fromLongBits(generateLong());
462   }
463 
464   @Generates
generateBigInteger()465   BigInteger generateBigInteger() {
466     return BigInteger.valueOf(generateInt());
467   }
468 
469   @Generates
generateBigDecimal()470   BigDecimal generateBigDecimal() {
471     return BigDecimal.valueOf(generateInt());
472   }
473 
474   @Generates
generateCharSequence()475   CharSequence generateCharSequence() {
476     return generateString();
477   }
478 
479   @Generates
generateString()480   String generateString() {
481     return Integer.toString(generateInt());
482   }
483 
484   @Generates
generateComparable()485   Comparable<?> generateComparable() {
486     return generateString();
487   }
488 
489   @Generates
generatePattern()490   Pattern generatePattern() {
491     return Pattern.compile(generateString());
492   }
493 
494   @Generates
generateCharset()495   Charset generateCharset() {
496     return pickInstance(Charset.availableCharsets().values(), Charsets.UTF_8);
497   }
498 
499   @Generates
generateLocale()500   Locale generateLocale() {
501     return pickInstance(Locale.getAvailableLocales(), Locale.US);
502   }
503 
504   @Generates
generateCurrency()505   Currency generateCurrency() {
506     try {
507       Method method = Currency.class.getMethod("getAvailableCurrencies");
508       @SuppressWarnings("unchecked") // getAvailableCurrencies() returns Set<Currency>.
509       Set<Currency> currencies = (Set<Currency>) method.invoke(null);
510       return pickInstance(currencies, Currency.getInstance(Locale.US));
511       /*
512        * Do not merge the 2 catch blocks below. javac would infer a type of
513        * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of
514        * Android don't *seem* to mind, but there might be edge cases of which we're unaware.)
515        */
516     } catch (NoSuchMethodException notJava7) {
517       return preJava7FreshCurrency();
518     } catch (InvocationTargetException notJava7) {
519       return preJava7FreshCurrency();
520     } catch (IllegalAccessException impossible) {
521       throw new AssertionError(impossible);
522     }
523   }
524 
preJava7FreshCurrency()525   private Currency preJava7FreshCurrency() {
526     for (Set<Locale> uselessLocales = Sets.newHashSet(); ; ) {
527       Locale locale = generateLocale();
528       if (uselessLocales.contains(locale)) { // exhausted all locales
529         return Currency.getInstance(Locale.US);
530       }
531       try {
532         return Currency.getInstance(locale);
533       } catch (IllegalArgumentException e) {
534         uselessLocales.add(locale);
535       }
536     }
537   }
538 
539   // common.base
540   @Empty
generateGoogleOptional()541   <T> com.google.common.base.Optional<T> generateGoogleOptional() {
542     return com.google.common.base.Optional.absent();
543   }
544 
545   @Generates
generateGoogleOptional(T value)546   <T> com.google.common.base.Optional<T> generateGoogleOptional(T value) {
547     return com.google.common.base.Optional.of(value);
548   }
549 
550   @Generates
generateJoiner()551   Joiner generateJoiner() {
552     return Joiner.on(generateString());
553   }
554 
555   @Generates
generateSplitter()556   Splitter generateSplitter() {
557     return Splitter.on(generateString());
558   }
559 
560   @Generates
generateEquivalence()561   <T> Equivalence<T> generateEquivalence() {
562     return new Equivalence<T>() {
563       @Override
564       protected boolean doEquivalent(T a, T b) {
565         return false;
566       }
567 
568       @Override
569       protected int doHash(T t) {
570         return 0;
571       }
572 
573       final String string = paramString(Equivalence.class, generateInt());
574 
575       @Override
576       public String toString() {
577         return string;
578       }
579     };
580   }
581 
582   @Generates
583   CharMatcher generateCharMatcher() {
584     return new CharMatcher() {
585       @Override
586       public boolean matches(char c) {
587         return false;
588       }
589 
590       final String string = paramString(CharMatcher.class, generateInt());
591 
592       @Override
593       public String toString() {
594         return string;
595       }
596     };
597   }
598 
599   @Generates
600   Ticker generateTicker() {
601     return new Ticker() {
602       @Override
603       public long read() {
604         return 0;
605       }
606 
607       final String string = paramString(Ticker.class, generateInt());
608 
609       @Override
610       public String toString() {
611         return string;
612       }
613     };
614   }
615 
616   // collect
617   @Generates
618   <T> Comparator<T> generateComparator() {
619     return generateOrdering();
620   }
621 
622   @Generates
623   <T extends @Nullable Object> Ordering<T> generateOrdering() {
624     return new Ordering<T>() {
625       @Override
626       public int compare(T left, T right) {
627         return 0;
628       }
629 
630       final String string = paramString(Ordering.class, generateInt());
631 
632       @Override
633       public String toString() {
634         return string;
635       }
636     };
637   }
638 
639   @Empty
640   static <C extends Comparable<?>> Range<C> generateRange() {
641     return Range.all();
642   }
643 
644   @Generates
645   static <C extends Comparable<?>> Range<C> generateRange(C freshElement) {
646     return Range.singleton(freshElement);
647   }
648 
649   @Generates
650   static <E> Iterable<E> generateIterable(@Nullable E freshElement) {
651     return generateList(freshElement);
652   }
653 
654   @Generates
655   static <E> Collection<E> generateCollection(@Nullable E freshElement) {
656     return generateList(freshElement);
657   }
658 
659   @Generates
660   static <E> List<E> generateList(@Nullable E freshElement) {
661     return generateArrayList(freshElement);
662   }
663 
664   @Generates
665   static <E> ArrayList<E> generateArrayList(@Nullable E freshElement) {
666     ArrayList<E> list = Lists.newArrayList();
667     list.add(freshElement);
668     return list;
669   }
670 
671   @Generates
672   static <E> LinkedList<E> generateLinkedList(@Nullable E freshElement) {
673     LinkedList<E> list = Lists.newLinkedList();
674     list.add(freshElement);
675     return list;
676   }
677 
678   @Generates
679   static <E> ImmutableList<E> generateImmutableList(E freshElement) {
680     return ImmutableList.of(freshElement);
681   }
682 
683   @Generates
684   static <E> ImmutableCollection<E> generateImmutableCollection(E freshElement) {
685     return generateImmutableList(freshElement);
686   }
687 
688   @Generates
689   static <E> Set<E> generateSet(@Nullable E freshElement) {
690     return generateHashSet(freshElement);
691   }
692 
693   @Generates
694   static <E> HashSet<E> generateHashSet(@Nullable E freshElement) {
695     return generateLinkedHashSet(freshElement);
696   }
697 
698   @Generates
699   static <E> LinkedHashSet<E> generateLinkedHashSet(@Nullable E freshElement) {
700     LinkedHashSet<E> set = Sets.newLinkedHashSet();
701     set.add(freshElement);
702     return set;
703   }
704 
705   @Generates
706   static <E> ImmutableSet<E> generateImmutableSet(E freshElement) {
707     return ImmutableSet.of(freshElement);
708   }
709 
710   @Generates
711   static <E extends Comparable<? super E>> SortedSet<E> generateSortedSet(E freshElement) {
712     return generateNavigableSet(freshElement);
713   }
714 
715   @Generates
716   static <E extends Comparable<? super E>> NavigableSet<E> generateNavigableSet(E freshElement) {
717     return generateTreeSet(freshElement);
718   }
719 
720   @Generates
721   static <E extends Comparable<? super E>> TreeSet<E> generateTreeSet(E freshElement) {
722     TreeSet<E> set = Sets.newTreeSet();
723     set.add(freshElement);
724     return set;
725   }
726 
727   @Generates
728   static <E extends Comparable<? super E>> ImmutableSortedSet<E> generateImmutableSortedSet(
729       E freshElement) {
730     return ImmutableSortedSet.of(freshElement);
731   }
732 
733   @Generates
734   static <E> Multiset<E> generateMultiset(@Nullable E freshElement) {
735     return generateHashMultiset(freshElement);
736   }
737 
738   @Generates
739   static <E> HashMultiset<E> generateHashMultiset(@Nullable E freshElement) {
740     HashMultiset<E> multiset = HashMultiset.create();
741     multiset.add(freshElement);
742     return multiset;
743   }
744 
745   @Generates
746   static <E> LinkedHashMultiset<E> generateLinkedHashMultiset(@Nullable E freshElement) {
747     LinkedHashMultiset<E> multiset = LinkedHashMultiset.create();
748     multiset.add(freshElement);
749     return multiset;
750   }
751 
752   @Generates
753   static <E> ImmutableMultiset<E> generateImmutableMultiset(E freshElement) {
754     return ImmutableMultiset.of(freshElement);
755   }
756 
757   @Generates
758   static <E extends Comparable<E>> SortedMultiset<E> generateSortedMultiset(E freshElement) {
759     return generateTreeMultiset(freshElement);
760   }
761 
762   @Generates
763   static <E extends Comparable<E>> TreeMultiset<E> generateTreeMultiset(E freshElement) {
764     TreeMultiset<E> multiset = TreeMultiset.create();
765     multiset.add(freshElement);
766     return multiset;
767   }
768 
769   @Generates
770   static <E extends Comparable<E>> ImmutableSortedMultiset<E> generateImmutableSortedMultiset(
771       E freshElement) {
772     return ImmutableSortedMultiset.of(freshElement);
773   }
774 
775   @Generates
776   static <K, V> Map<K, V> generateMap(@Nullable K key, @Nullable V value) {
777     return generateHashdMap(key, value);
778   }
779 
780   @Generates
781   static <K, V> HashMap<K, V> generateHashdMap(@Nullable K key, @Nullable V value) {
782     return generateLinkedHashMap(key, value);
783   }
784 
785   @Generates
786   static <K, V> LinkedHashMap<K, V> generateLinkedHashMap(@Nullable K key, @Nullable V value) {
787     LinkedHashMap<K, V> map = Maps.newLinkedHashMap();
788     map.put(key, value);
789     return map;
790   }
791 
792   @Generates
793   static <K, V> ImmutableMap<K, V> generateImmutableMap(K key, V value) {
794     return ImmutableMap.of(key, value);
795   }
796 
797   @Empty
798   static <K, V> ConcurrentMap<K, V> generateConcurrentMap() {
799     return Maps.newConcurrentMap();
800   }
801 
802   @Generates
803   static <K, V> ConcurrentMap<K, V> generateConcurrentMap(K key, V value) {
804     ConcurrentMap<K, V> map = Maps.newConcurrentMap();
805     map.put(key, value);
806     return map;
807   }
808 
809   @Generates
810   static <K extends Comparable<? super K>, V> SortedMap<K, V> generateSortedMap(
811       K key, @Nullable V value) {
812     return generateNavigableMap(key, value);
813   }
814 
815   @Generates
816   static <K extends Comparable<? super K>, V> NavigableMap<K, V> generateNavigableMap(
817       K key, @Nullable V value) {
818     return generateTreeMap(key, value);
819   }
820 
821   @Generates
822   static <K extends Comparable<? super K>, V> TreeMap<K, V> generateTreeMap(
823       K key, @Nullable V value) {
824     TreeMap<K, V> map = Maps.newTreeMap();
825     map.put(key, value);
826     return map;
827   }
828 
829   @Generates
830   static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> generateImmutableSortedMap(
831       K key, V value) {
832     return ImmutableSortedMap.of(key, value);
833   }
834 
835   @Generates
836   static <K, V> Multimap<K, V> generateMultimap(@Nullable K key, @Nullable V value) {
837     return generateListMultimap(key, value);
838   }
839 
840   @Generates
841   static <K, V> ImmutableMultimap<K, V> generateImmutableMultimap(K key, V value) {
842     return ImmutableMultimap.of(key, value);
843   }
844 
845   @Generates
846   static <K, V> ListMultimap<K, V> generateListMultimap(@Nullable K key, @Nullable V value) {
847     return generateArrayListMultimap(key, value);
848   }
849 
850   @Generates
851   static <K, V> ArrayListMultimap<K, V> generateArrayListMultimap(
852       @Nullable K key, @Nullable V value) {
853     ArrayListMultimap<K, V> multimap = ArrayListMultimap.create();
854     multimap.put(key, value);
855     return multimap;
856   }
857 
858   @Generates
859   static <K, V> ImmutableListMultimap<K, V> generateImmutableListMultimap(K key, V value) {
860     return ImmutableListMultimap.of(key, value);
861   }
862 
863   @Generates
864   static <K, V> SetMultimap<K, V> generateSetMultimap(@Nullable K key, @Nullable V value) {
865     return generateLinkedHashMultimap(key, value);
866   }
867 
868   @Generates
869   static <K, V> HashMultimap<K, V> generateHashMultimap(@Nullable K key, @Nullable V value) {
870     HashMultimap<K, V> multimap = HashMultimap.create();
871     multimap.put(key, value);
872     return multimap;
873   }
874 
875   @Generates
876   static <K, V> LinkedHashMultimap<K, V> generateLinkedHashMultimap(
877       @Nullable K key, @Nullable V value) {
878     LinkedHashMultimap<K, V> multimap = LinkedHashMultimap.create();
879     multimap.put(key, value);
880     return multimap;
881   }
882 
883   @Generates
884   static <K, V> ImmutableSetMultimap<K, V> generateImmutableSetMultimap(K key, V value) {
885     return ImmutableSetMultimap.of(key, value);
886   }
887 
888   @Generates
889   static <K, V> BiMap<K, V> generateBimap(@Nullable K key, @Nullable V value) {
890     return generateHashBiMap(key, value);
891   }
892 
893   @Generates
894   static <K, V> HashBiMap<K, V> generateHashBiMap(@Nullable K key, @Nullable V value) {
895     HashBiMap<K, V> bimap = HashBiMap.create();
896     bimap.put(key, value);
897     return bimap;
898   }
899 
900   @Generates
901   static <K, V> ImmutableBiMap<K, V> generateImmutableBimap(K key, V value) {
902     return ImmutableBiMap.of(key, value);
903   }
904 
905   @Generates
906   static <R, C, V> Table<R, C, V> generateTable(R row, C column, V value) {
907     return generateHashBasedTable(row, column, value);
908   }
909 
910   @Generates
911   static <R, C, V> HashBasedTable<R, C, V> generateHashBasedTable(R row, C column, V value) {
912     HashBasedTable<R, C, V> table = HashBasedTable.create();
913     table.put(row, column, value);
914     return table;
915   }
916 
917   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
918   @Generates
919   static <R extends Comparable, C extends Comparable, V>
920       RowSortedTable<R, C, V> generateRowSortedTable(R row, C column, V value) {
921     return generateTreeBasedTable(row, column, value);
922   }
923 
924   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
925   @Generates
926   static <R extends Comparable, C extends Comparable, V>
927       TreeBasedTable<R, C, V> generateTreeBasedTable(R row, C column, V value) {
928     TreeBasedTable<R, C, V> table = TreeBasedTable.create();
929     table.put(row, column, value);
930     return table;
931   }
932 
933   @Generates
934   static <R, C, V> ImmutableTable<R, C, V> generateImmutableTable(R row, C column, V value) {
935     return ImmutableTable.of(row, column, value);
936   }
937 
938   // common.reflect
939   @Generates
940   TypeToken<?> generateTypeToken() {
941     return TypeToken.of(generateClass());
942   }
943 
944   // io types
945   @Generates
946   File generateFile() {
947     return new File(generateString());
948   }
949 
950   @Generates
951   static ByteArrayInputStream generateByteArrayInputStream() {
952     return new ByteArrayInputStream(new byte[0]);
953   }
954 
955   @Generates
956   static InputStream generateInputStream() {
957     return generateByteArrayInputStream();
958   }
959 
960   @Generates
961   StringReader generateStringReader() {
962     return new StringReader(generateString());
963   }
964 
965   @Generates
966   Reader generateReader() {
967     return generateStringReader();
968   }
969 
970   @Generates
971   Readable generateReadable() {
972     return generateReader();
973   }
974 
975   @Generates
976   Buffer generateBuffer() {
977     return generateCharBuffer();
978   }
979 
980   @Generates
981   CharBuffer generateCharBuffer() {
982     return CharBuffer.allocate(generateInt());
983   }
984 
985   @Generates
986   ByteBuffer generateByteBuffer() {
987     return ByteBuffer.allocate(generateInt());
988   }
989 
990   @Generates
991   ShortBuffer generateShortBuffer() {
992     return ShortBuffer.allocate(generateInt());
993   }
994 
995   @Generates
996   IntBuffer generateIntBuffer() {
997     return IntBuffer.allocate(generateInt());
998   }
999 
1000   @Generates
1001   LongBuffer generateLongBuffer() {
1002     return LongBuffer.allocate(generateInt());
1003   }
1004 
1005   @Generates
1006   FloatBuffer generateFloatBuffer() {
1007     return FloatBuffer.allocate(generateInt());
1008   }
1009 
1010   @Generates
1011   DoubleBuffer generateDoubleBuffer() {
1012     return DoubleBuffer.allocate(generateInt());
1013   }
1014 }
1015