• 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.base.CharMatcher;
24 import com.google.common.base.Charsets;
25 import com.google.common.base.Equivalence;
26 import com.google.common.base.Joiner;
27 import com.google.common.base.Splitter;
28 import com.google.common.base.Ticker;
29 import com.google.common.collect.ArrayListMultimap;
30 import com.google.common.collect.BiMap;
31 import com.google.common.collect.HashBasedTable;
32 import com.google.common.collect.HashBiMap;
33 import com.google.common.collect.HashMultimap;
34 import com.google.common.collect.HashMultiset;
35 import com.google.common.collect.ImmutableBiMap;
36 import com.google.common.collect.ImmutableCollection;
37 import com.google.common.collect.ImmutableList;
38 import com.google.common.collect.ImmutableListMultimap;
39 import com.google.common.collect.ImmutableMap;
40 import com.google.common.collect.ImmutableMultimap;
41 import com.google.common.collect.ImmutableMultiset;
42 import com.google.common.collect.ImmutableSet;
43 import com.google.common.collect.ImmutableSetMultimap;
44 import com.google.common.collect.ImmutableSortedMap;
45 import com.google.common.collect.ImmutableSortedMultiset;
46 import com.google.common.collect.ImmutableSortedSet;
47 import com.google.common.collect.ImmutableTable;
48 import com.google.common.collect.Iterables;
49 import com.google.common.collect.LinkedHashMultimap;
50 import com.google.common.collect.LinkedHashMultiset;
51 import com.google.common.collect.ListMultimap;
52 import com.google.common.collect.Lists;
53 import com.google.common.collect.Maps;
54 import com.google.common.collect.Multimap;
55 import com.google.common.collect.Multiset;
56 import com.google.common.collect.Ordering;
57 import com.google.common.collect.Range;
58 import com.google.common.collect.RowSortedTable;
59 import com.google.common.collect.SetMultimap;
60 import com.google.common.collect.Sets;
61 import com.google.common.collect.SortedMultiset;
62 import com.google.common.collect.Table;
63 import com.google.common.collect.TreeBasedTable;
64 import com.google.common.collect.TreeMultiset;
65 import com.google.common.primitives.Primitives;
66 import com.google.common.primitives.UnsignedInteger;
67 import com.google.common.primitives.UnsignedLong;
68 import com.google.common.reflect.AbstractInvocationHandler;
69 import com.google.common.reflect.Invokable;
70 import com.google.common.reflect.Parameter;
71 import com.google.common.reflect.Reflection;
72 import com.google.common.reflect.TypeToken;
73 import java.io.ByteArrayInputStream;
74 import java.io.File;
75 import java.io.InputStream;
76 import java.io.Reader;
77 import java.io.StringReader;
78 import java.lang.annotation.ElementType;
79 import java.lang.annotation.Retention;
80 import java.lang.annotation.RetentionPolicy;
81 import java.lang.annotation.Target;
82 import java.lang.reflect.Array;
83 import java.lang.reflect.InvocationTargetException;
84 import java.lang.reflect.Method;
85 import java.lang.reflect.Type;
86 import java.lang.reflect.TypeVariable;
87 import java.math.BigDecimal;
88 import java.math.BigInteger;
89 import java.nio.Buffer;
90 import java.nio.ByteBuffer;
91 import java.nio.CharBuffer;
92 import java.nio.DoubleBuffer;
93 import java.nio.FloatBuffer;
94 import java.nio.IntBuffer;
95 import java.nio.LongBuffer;
96 import java.nio.ShortBuffer;
97 import java.nio.charset.Charset;
98 import java.util.ArrayList;
99 import java.util.Arrays;
100 import java.util.Collection;
101 import java.util.Comparator;
102 import java.util.Currency;
103 import java.util.HashMap;
104 import java.util.HashSet;
105 import java.util.LinkedHashMap;
106 import java.util.LinkedHashSet;
107 import java.util.LinkedList;
108 import java.util.List;
109 import java.util.Locale;
110 import java.util.Map;
111 import java.util.NavigableMap;
112 import java.util.NavigableSet;
113 import java.util.Set;
114 import java.util.SortedMap;
115 import java.util.SortedSet;
116 import java.util.TreeMap;
117 import java.util.TreeSet;
118 import java.util.concurrent.ConcurrentMap;
119 import java.util.concurrent.atomic.AtomicInteger;
120 import java.util.regex.Pattern;
121 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
122 
123 /**
124  * Generates fresh instances of types that are different from each other (if possible).
125  *
126  * @author Ben Yu
127  */
128 @GwtIncompatible
129 class FreshValueGenerator {
130 
131   private static final ImmutableMap<Class<?>, Method> GENERATORS;
132 
133   static {
134     ImmutableMap.Builder<Class<?>, Method> builder = ImmutableMap.builder();
135     for (Method method : FreshValueGenerator.class.getDeclaredMethods()) {
136       if (method.isAnnotationPresent(Generates.class)) {
method.getReturnType()137         builder.put(method.getReturnType(), method);
138       }
139     }
140     GENERATORS = builder.build();
141   }
142 
143   private static final ImmutableMap<Class<?>, Method> EMPTY_GENERATORS;
144 
145   static {
146     ImmutableMap.Builder<Class<?>, Method> builder = ImmutableMap.builder();
147     for (Method method : FreshValueGenerator.class.getDeclaredMethods()) {
148       if (method.isAnnotationPresent(Empty.class)) {
method.getReturnType()149         builder.put(method.getReturnType(), method);
150       }
151     }
152     EMPTY_GENERATORS = builder.build();
153   }
154 
155   private final AtomicInteger freshness = new AtomicInteger(1);
156   private final ListMultimap<Class<?>, Object> sampleInstances = ArrayListMultimap.create();
157 
158   /**
159    * The freshness level at which the {@link Empty @Empty} annotated method was invoked to generate
160    * instance.
161    */
162   private final Map<Type, Integer> emptyInstanceGenerated = new HashMap<>();
163 
addSampleInstances(Class<T> type, Iterable<? extends T> instances)164   final <T> void addSampleInstances(Class<T> type, Iterable<? extends T> instances) {
165     sampleInstances.putAll(checkNotNull(type), checkNotNull(instances));
166   }
167 
168   /**
169    * Returns a fresh instance for {@code type} if possible. The returned instance could be:
170    *
171    * <ul>
172    *   <li>exactly of the given type, including generic type parameters, such as {@code
173    *       ImmutableList<String>};
174    *   <li>of the raw type;
175    *   <li>null if no value can be generated.
176    * </ul>
177    */
178   @NullableDecl
generateFresh(TypeToken<?> type)179   final Object generateFresh(TypeToken<?> type) {
180     Object generated = generate(type);
181     if (generated != null) {
182       freshness.incrementAndGet();
183     }
184     return generated;
185   }
186 
187   @NullableDecl
generateFresh(Class<T> type)188   final <T> 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 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 = 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> 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, Object[] args)292     protected Object handleInvocation(Object proxy, Method method, Object[] args) {
293       return interfaceMethodCalled(interfaceType, method);
294     }
295 
296     @Override
hashCode()297     public int hashCode() {
298       return identity;
299     }
300 
301     @Override
equals(@ullableDecl Object obj)302     public boolean equals(@NullableDecl 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> 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(@NullableDecl E freshElement) {
651     return generateList(freshElement);
652   }
653 
654   @Generates
655   static <E> Collection<E> generateCollection(@NullableDecl E freshElement) {
656     return generateList(freshElement);
657   }
658 
659   @Generates
660   static <E> List<E> generateList(@NullableDecl E freshElement) {
661     return generateArrayList(freshElement);
662   }
663 
664   @Generates
665   static <E> ArrayList<E> generateArrayList(@NullableDecl 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(@NullableDecl 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(@NullableDecl E freshElement) {
690     return generateHashSet(freshElement);
691   }
692 
693   @Generates
694   static <E> HashSet<E> generateHashSet(@NullableDecl E freshElement) {
695     return generateLinkedHashSet(freshElement);
696   }
697 
698   @Generates
699   static <E> LinkedHashSet<E> generateLinkedHashSet(@NullableDecl 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(@NullableDecl E freshElement) {
735     return generateHashMultiset(freshElement);
736   }
737 
738   @Generates
739   static <E> HashMultiset<E> generateHashMultiset(@NullableDecl 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(@NullableDecl 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(@NullableDecl K key, @NullableDecl V value) {
777     return generateHashdMap(key, value);
778   }
779 
780   @Generates
781   static <K, V> HashMap<K, V> generateHashdMap(@NullableDecl K key, @NullableDecl V value) {
782     return generateLinkedHashMap(key, value);
783   }
784 
785   @Generates
786   static <K, V> LinkedHashMap<K, V> generateLinkedHashMap(
787       @NullableDecl K key, @NullableDecl V value) {
788     LinkedHashMap<K, V> map = Maps.newLinkedHashMap();
789     map.put(key, value);
790     return map;
791   }
792 
793   @Generates
794   static <K, V> ImmutableMap<K, V> generateImmutableMap(K key, V value) {
795     return ImmutableMap.of(key, value);
796   }
797 
798   @Empty
799   static <K, V> ConcurrentMap<K, V> generateConcurrentMap() {
800     return Maps.newConcurrentMap();
801   }
802 
803   @Generates
804   static <K, V> ConcurrentMap<K, V> generateConcurrentMap(K key, V value) {
805     ConcurrentMap<K, V> map = Maps.newConcurrentMap();
806     map.put(key, value);
807     return map;
808   }
809 
810   @Generates
811   static <K extends Comparable<? super K>, V> SortedMap<K, V> generateSortedMap(
812       K key, @NullableDecl V value) {
813     return generateNavigableMap(key, value);
814   }
815 
816   @Generates
817   static <K extends Comparable<? super K>, V> NavigableMap<K, V> generateNavigableMap(
818       K key, @NullableDecl V value) {
819     return generateTreeMap(key, value);
820   }
821 
822   @Generates
823   static <K extends Comparable<? super K>, V> TreeMap<K, V> generateTreeMap(
824       K key, @NullableDecl V value) {
825     TreeMap<K, V> map = Maps.newTreeMap();
826     map.put(key, value);
827     return map;
828   }
829 
830   @Generates
831   static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> generateImmutableSortedMap(
832       K key, V value) {
833     return ImmutableSortedMap.of(key, value);
834   }
835 
836   @Generates
837   static <K, V> Multimap<K, V> generateMultimap(@NullableDecl K key, @NullableDecl V value) {
838     return generateListMultimap(key, value);
839   }
840 
841   @Generates
842   static <K, V> ImmutableMultimap<K, V> generateImmutableMultimap(K key, V value) {
843     return ImmutableMultimap.of(key, value);
844   }
845 
846   @Generates
847   static <K, V> ListMultimap<K, V> generateListMultimap(
848       @NullableDecl K key, @NullableDecl V value) {
849     return generateArrayListMultimap(key, value);
850   }
851 
852   @Generates
853   static <K, V> ArrayListMultimap<K, V> generateArrayListMultimap(
854       @NullableDecl K key, @NullableDecl V value) {
855     ArrayListMultimap<K, V> multimap = ArrayListMultimap.create();
856     multimap.put(key, value);
857     return multimap;
858   }
859 
860   @Generates
861   static <K, V> ImmutableListMultimap<K, V> generateImmutableListMultimap(K key, V value) {
862     return ImmutableListMultimap.of(key, value);
863   }
864 
865   @Generates
866   static <K, V> SetMultimap<K, V> generateSetMultimap(@NullableDecl K key, @NullableDecl V value) {
867     return generateLinkedHashMultimap(key, value);
868   }
869 
870   @Generates
871   static <K, V> HashMultimap<K, V> generateHashMultimap(
872       @NullableDecl K key, @NullableDecl V value) {
873     HashMultimap<K, V> multimap = HashMultimap.create();
874     multimap.put(key, value);
875     return multimap;
876   }
877 
878   @Generates
879   static <K, V> LinkedHashMultimap<K, V> generateLinkedHashMultimap(
880       @NullableDecl K key, @NullableDecl V value) {
881     LinkedHashMultimap<K, V> multimap = LinkedHashMultimap.create();
882     multimap.put(key, value);
883     return multimap;
884   }
885 
886   @Generates
887   static <K, V> ImmutableSetMultimap<K, V> generateImmutableSetMultimap(K key, V value) {
888     return ImmutableSetMultimap.of(key, value);
889   }
890 
891   @Generates
892   static <K, V> BiMap<K, V> generateBimap(@NullableDecl K key, @NullableDecl V value) {
893     return generateHashBiMap(key, value);
894   }
895 
896   @Generates
897   static <K, V> HashBiMap<K, V> generateHashBiMap(@NullableDecl K key, @NullableDecl V value) {
898     HashBiMap<K, V> bimap = HashBiMap.create();
899     bimap.put(key, value);
900     return bimap;
901   }
902 
903   @Generates
904   static <K, V> ImmutableBiMap<K, V> generateImmutableBimap(K key, V value) {
905     return ImmutableBiMap.of(key, value);
906   }
907 
908   @Generates
909   static <R, C, V> Table<R, C, V> generateTable(
910       @NullableDecl R row, @NullableDecl C column, @NullableDecl V value) {
911     return generateHashBasedTable(row, column, value);
912   }
913 
914   @Generates
915   static <R, C, V> HashBasedTable<R, C, V> generateHashBasedTable(
916       @NullableDecl R row, @NullableDecl C column, @NullableDecl V value) {
917     HashBasedTable<R, C, V> table = HashBasedTable.create();
918     table.put(row, column, value);
919     return table;
920   }
921 
922   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
923   @Generates
924   static <R extends Comparable, C extends Comparable, V>
925       RowSortedTable<R, C, V> generateRowSortedTable(R row, C column, V value) {
926     return generateTreeBasedTable(row, column, value);
927   }
928 
929   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
930   @Generates
931   static <R extends Comparable, C extends Comparable, V>
932       TreeBasedTable<R, C, V> generateTreeBasedTable(R row, C column, V value) {
933     TreeBasedTable<R, C, V> table = TreeBasedTable.create();
934     table.put(row, column, value);
935     return table;
936   }
937 
938   @Generates
939   static <R, C, V> ImmutableTable<R, C, V> generateImmutableTable(R row, C column, V value) {
940     return ImmutableTable.of(row, column, value);
941   }
942 
943   // common.reflect
944   @Generates
945   TypeToken<?> generateTypeToken() {
946     return TypeToken.of(generateClass());
947   }
948 
949   // io types
950   @Generates
951   File generateFile() {
952     return new File(generateString());
953   }
954 
955   @Generates
956   static ByteArrayInputStream generateByteArrayInputStream() {
957     return new ByteArrayInputStream(new byte[0]);
958   }
959 
960   @Generates
961   static InputStream generateInputStream() {
962     return generateByteArrayInputStream();
963   }
964 
965   @Generates
966   StringReader generateStringReader() {
967     return new StringReader(generateString());
968   }
969 
970   @Generates
971   Reader generateReader() {
972     return generateStringReader();
973   }
974 
975   @Generates
976   Readable generateReadable() {
977     return generateReader();
978   }
979 
980   @Generates
981   Buffer generateBuffer() {
982     return generateCharBuffer();
983   }
984 
985   @Generates
986   CharBuffer generateCharBuffer() {
987     return CharBuffer.allocate(generateInt());
988   }
989 
990   @Generates
991   ByteBuffer generateByteBuffer() {
992     return ByteBuffer.allocate(generateInt());
993   }
994 
995   @Generates
996   ShortBuffer generateShortBuffer() {
997     return ShortBuffer.allocate(generateInt());
998   }
999 
1000   @Generates
1001   IntBuffer generateIntBuffer() {
1002     return IntBuffer.allocate(generateInt());
1003   }
1004 
1005   @Generates
1006   LongBuffer generateLongBuffer() {
1007     return LongBuffer.allocate(generateInt());
1008   }
1009 
1010   @Generates
1011   FloatBuffer generateFloatBuffer() {
1012     return FloatBuffer.allocate(generateInt());
1013   }
1014 
1015   @Generates
1016   DoubleBuffer generateDoubleBuffer() {
1017     return DoubleBuffer.allocate(generateInt());
1018   }
1019 }
1020