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