Home | History | Annotate | Download | only in testing
      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 
     21 import com.google.common.base.CharMatcher;
     22 import com.google.common.base.Charsets;
     23 import com.google.common.base.Equivalence;
     24 import com.google.common.base.Joiner;
     25 import com.google.common.base.Optional;
     26 import com.google.common.base.Splitter;
     27 import com.google.common.base.Throwables;
     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 
     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 
    123 import javax.annotation.Nullable;
    124 
    125 /**
    126  * Generates fresh instances of types that are different from each other (if possible).
    127  *
    128  * @author Ben Yu
    129  */
    130 class FreshValueGenerator {
    131 
    132   private static final ImmutableMap<Class<?>, Method> GENERATORS;
    133   static {
    134     ImmutableMap.Builder<Class<?>, Method> builder =
    135         ImmutableMap.builder();
    136     for (Method method : FreshValueGenerator.class.getDeclaredMethods()) {
    137       if (method.isAnnotationPresent(Generates.class)) {
    138         builder.put(method.getReturnType(), method);
    139       }
    140     }
    141     GENERATORS = builder.build();
    142   }
    143 
    144   private final AtomicInteger differentiator = new AtomicInteger(1);
    145   private final ListMultimap<Class<?>, Object> sampleInstances = ArrayListMultimap.create();
    146   private final Set<Type> generatedOptionalTypes = Sets.newHashSet();
    147 
    148   <T> void addSampleInstances(Class<T> type, Iterable<? extends T> instances) {
    149     sampleInstances.putAll(checkNotNull(type), checkNotNull(instances));
    150   }
    151 
    152   /**
    153    * Returns a fresh instance for {@code type} if possible. The returned instance could be:
    154    * <ul>
    155    * <li>exactly of the given type, including generic type parameters, such as
    156    *     {@code ImmutableList<String>};
    157    * <li>of the raw type;
    158    * <li>null if no fresh value can be generated.
    159    * </ul>
    160    */
    161   @Nullable Object generate(TypeToken<?> type) {
    162     Class<?> rawType = type.getRawType();
    163     List<Object> samples = sampleInstances.get(rawType);
    164     Object sample = nextInstance(samples, null);
    165     if (sample != null) {
    166       return sample;
    167     }
    168     if (rawType.isEnum()) {
    169       return nextInstance(rawType.getEnumConstants(), null);
    170     }
    171     if (type.isArray()) {
    172       TypeToken<?> componentType = type.getComponentType();
    173       Object array = Array.newInstance(componentType.getRawType(), 1);
    174       Array.set(array, 0, generate(componentType));
    175       return array;
    176     }
    177     if (rawType == Optional.class && generatedOptionalTypes.add(type.getType())) {
    178       // For any Optional<T>, we'll first generate absent(). The next call generates a distinct
    179       // value of T to be wrapped in Optional.of().
    180       return Optional.absent();
    181     }
    182     Method generator = GENERATORS.get(rawType);
    183     if (generator != null) {
    184       ImmutableList<Parameter> params = Invokable.from(generator).getParameters();
    185       List<Object> args = Lists.newArrayListWithCapacity(params.size());
    186       TypeVariable<?>[] typeVars = rawType.getTypeParameters();
    187       for (int i = 0; i < params.size(); i++) {
    188         TypeToken<?> paramType = type.resolveType(typeVars[i]);
    189         // We require all @Generates methods to either be parameter-less or accept non-null
    190         // fresh values for their generic parameter types.
    191         Object argValue = generate(paramType);
    192         if (argValue == null) {
    193           // When a parameter of a @Generates method cannot be created,
    194           // The type most likely is a collection.
    195           // Our distinct proxy doesn't work for collections.
    196           // So just refuse to generate.
    197           return null;
    198         }
    199         args.add(argValue);
    200       }
    201       try {
    202         return generator.invoke(this, args.toArray());
    203       } catch (InvocationTargetException e) {
    204         Throwables.propagate(e.getCause());
    205       } catch (Exception e) {
    206         throw Throwables.propagate(e);
    207       }
    208     }
    209     return defaultGenerate(rawType);
    210   }
    211 
    212   @Nullable final <T> T generate(Class<T> type) {
    213     return Primitives.wrap(type).cast(generate(TypeToken.of(type)));
    214   }
    215 
    216   private <T> T defaultGenerate(Class<T> rawType) {
    217     if (rawType.isInterface()) {
    218       // always create a new proxy
    219       return newProxy(rawType);
    220     }
    221     return ArbitraryInstances.get(rawType);
    222   }
    223 
    224   final <T> T newProxy(final Class<T> interfaceType) {
    225     return Reflection.newProxy(interfaceType, new FreshInvocationHandler(interfaceType));
    226   }
    227 
    228   private final class FreshInvocationHandler extends AbstractInvocationHandler {
    229     private final int identity = freshInt();
    230     private final Class<?> interfaceType;
    231 
    232     FreshInvocationHandler(Class<?> interfaceType) {
    233       this.interfaceType = interfaceType;
    234     }
    235 
    236     @Override protected Object handleInvocation(Object proxy, Method method, Object[] args) {
    237       return interfaceMethodCalled(interfaceType, method);
    238     }
    239 
    240     @Override public int hashCode() {
    241       return identity;
    242     }
    243 
    244     @Override public boolean equals(@Nullable Object obj) {
    245       if (obj instanceof FreshInvocationHandler) {
    246         FreshInvocationHandler that = (FreshInvocationHandler) obj;
    247         return identity == that.identity;
    248       }
    249       return false;
    250     }
    251 
    252     @Override public String toString() {
    253       return paramString(interfaceType, identity);
    254     }
    255   }
    256 
    257   /** Subclasses can override to provide different return value for proxied interface methods. */
    258   Object interfaceMethodCalled(
    259       @SuppressWarnings("unused") Class<?> interfaceType,
    260       @SuppressWarnings("unused") Method method) {
    261     throw new UnsupportedOperationException();
    262   }
    263 
    264   private <T> T nextInstance(T[] instances, T defaultValue) {
    265     return nextInstance(Arrays.asList(instances), defaultValue);
    266   }
    267 
    268   private <T> T nextInstance(Collection<T> instances, T defaultValue) {
    269     if (instances.isEmpty()) {
    270       return defaultValue;
    271     }
    272     // freshInt() is 1-based.
    273     return Iterables.get(instances, (freshInt() - 1) % instances.size());
    274   }
    275 
    276   private static String paramString(Class<?> type, int i) {
    277     return type.getSimpleName() + '@' + i;
    278   }
    279 
    280   /**
    281    * Annotates a method to be the instance generator of a certain type. The return type is the
    282    * generated type. The method parameters are non-null fresh values for each method type variable
    283    * in the same type variable declaration order of the return type.
    284    */
    285   @Target(ElementType.METHOD)
    286   @Retention(RetentionPolicy.RUNTIME)
    287   private @interface Generates {}
    288 
    289   @Generates private Class<?> freshClass() {
    290     return nextInstance(
    291         ImmutableList.of(
    292             int.class, long.class, void.class,
    293             Object.class, Object[].class, Iterable.class),
    294         Object.class);
    295   }
    296 
    297   @Generates private Object freshObject() {
    298     return freshString();
    299   }
    300 
    301   @Generates private Number freshNumber() {
    302     return freshInt();
    303   }
    304 
    305   @Generates private int freshInt() {
    306     return differentiator.getAndIncrement();
    307   }
    308 
    309   @Generates private Integer freshInteger() {
    310     return new Integer(freshInt());
    311   }
    312 
    313   @Generates private long freshLong() {
    314     return freshInt();
    315   }
    316 
    317   @Generates private Long freshLongObject() {
    318     return new Long(freshLong());
    319   }
    320 
    321   @Generates private float freshFloat() {
    322     return freshInt();
    323   }
    324 
    325   @Generates private Float freshFloatObject() {
    326     return new Float(freshFloat());
    327   }
    328 
    329   @Generates private double freshDouble() {
    330     return freshInt();
    331   }
    332 
    333   @Generates private Double freshDoubleObject() {
    334     return new Double(freshDouble());
    335   }
    336 
    337   @Generates private short freshShort() {
    338     return (short) freshInt();
    339   }
    340 
    341   @Generates private Short freshShortObject() {
    342     return new Short(freshShort());
    343   }
    344 
    345   @Generates private byte freshByte() {
    346     return (byte) freshInt();
    347   }
    348 
    349   @Generates private Byte freshByteObject() {
    350     return new Byte(freshByte());
    351   }
    352 
    353   @Generates private char freshChar() {
    354     return freshString().charAt(0);
    355   }
    356 
    357   @Generates private Character freshCharacter() {
    358     return new Character(freshChar());
    359   }
    360 
    361   @Generates private boolean freshBoolean() {
    362     return freshInt() % 2 == 0;
    363   }
    364 
    365   @Generates private Boolean freshBooleanObject() {
    366     return new Boolean(freshBoolean());
    367   }
    368 
    369   @Generates private UnsignedInteger freshUnsignedInteger() {
    370     return UnsignedInteger.fromIntBits(freshInt());
    371   }
    372 
    373   @Generates private UnsignedLong freshUnsignedLong() {
    374     return UnsignedLong.fromLongBits(freshLong());
    375   }
    376 
    377   @Generates private BigInteger freshBigInteger() {
    378     return BigInteger.valueOf(freshInt());
    379   }
    380 
    381   @Generates private BigDecimal freshBigDecimal() {
    382     return BigDecimal.valueOf(freshInt());
    383   }
    384 
    385   @Generates private CharSequence freshCharSequence() {
    386     return freshString();
    387   }
    388 
    389   @Generates private String freshString() {
    390     return Integer.toString(freshInt());
    391   }
    392 
    393   @Generates private Comparable<?> freshComparable() {
    394     return freshString();
    395   }
    396 
    397   @Generates private Pattern freshPattern() {
    398     return Pattern.compile(freshString());
    399   }
    400 
    401   @Generates private Charset freshCharset() {
    402     return nextInstance(Charset.availableCharsets().values(), Charsets.UTF_8);
    403   }
    404 
    405   @Generates private Locale freshLocale() {
    406     return nextInstance(Locale.getAvailableLocales(), Locale.US);
    407   }
    408 
    409   @Generates private Currency freshCurrency() {
    410     for (Set<Locale> uselessLocales = Sets.newHashSet(); ; ) {
    411       Locale locale = freshLocale();
    412       if (uselessLocales.contains(locale)) { // exhausted all locales
    413         return Currency.getInstance(Locale.US);
    414       }
    415       try {
    416         return Currency.getInstance(locale);
    417       } catch (IllegalArgumentException e) {
    418         uselessLocales.add(locale);
    419       }
    420     }
    421   }
    422 
    423   // common.base
    424   @Generates private <T> Optional<T> freshOptional(T value) {
    425     return Optional.of(value);
    426   }
    427 
    428   @Generates private Joiner freshJoiner() {
    429     return Joiner.on(freshString());
    430   }
    431 
    432   @Generates private Splitter freshSplitter() {
    433     return Splitter.on(freshString());
    434   }
    435 
    436   @Generates private <T> Equivalence<T> freshEquivalence() {
    437     return new Equivalence<T>() {
    438       @Override protected boolean doEquivalent(T a, T b) {
    439         return false;
    440       }
    441       @Override protected int doHash(T t) {
    442         return 0;
    443       }
    444       final String string = paramString(Equivalence.class, freshInt());
    445       @Override public String toString() {
    446         return string;
    447       }
    448     };
    449   }
    450 
    451   @Generates private CharMatcher freshCharMatcher() {
    452     return new CharMatcher() {
    453       @Override public boolean matches(char c) {
    454         return false;
    455       }
    456       final String string = paramString(CharMatcher.class, freshInt());
    457       @Override public String toString() {
    458         return string;
    459       }
    460     };
    461   }
    462 
    463   @Generates private Ticker freshTicker() {
    464     return new Ticker() {
    465       @Override public long read() {
    466         return 0;
    467       }
    468       final String string = paramString(Ticker.class, freshInt());
    469       @Override public String toString() {
    470         return string;
    471       }
    472     };
    473   }
    474 
    475   // collect
    476   @Generates private <T> Comparator<T> freshComparator() {
    477     return freshOrdering();
    478   }
    479 
    480   @Generates private <T> Ordering<T> freshOrdering() {
    481     return new Ordering<T>() {
    482       @Override public int compare(T left, T right) {
    483         return 0;
    484       }
    485       final String string = paramString(Ordering.class, freshInt());
    486       @Override public String toString() {
    487         return string;
    488       }
    489     };
    490   }
    491 
    492   @Generates private static <C extends Comparable> Range<C> freshRange(C freshElement) {
    493     return Range.singleton(freshElement);
    494   }
    495 
    496   @Generates private static <E> Iterable<E> freshIterable(E freshElement) {
    497     return freshList(freshElement);
    498   }
    499 
    500   @Generates private static <E> Collection<E> freshCollection(E freshElement) {
    501     return freshList(freshElement);
    502   }
    503 
    504   @Generates private static <E> List<E> freshList(E freshElement) {
    505     return freshArrayList(freshElement);
    506   }
    507 
    508   @Generates private static <E> ArrayList<E> freshArrayList(E freshElement) {
    509     ArrayList<E> list = Lists.newArrayList();
    510     list.add(freshElement);
    511     return list;
    512   }
    513 
    514   @Generates private static <E> LinkedList<E> freshLinkedList(E freshElement) {
    515     LinkedList<E> list = Lists.newLinkedList();
    516     list.add(freshElement);
    517     return list;
    518   }
    519 
    520   @Generates private static <E> ImmutableList<E> freshImmutableList(E freshElement) {
    521     return ImmutableList.of(freshElement);
    522   }
    523 
    524   @Generates private static <E> ImmutableCollection<E> freshImmutableCollection(E freshElement) {
    525     return freshImmutableList(freshElement);
    526   }
    527 
    528   @Generates private static <E> Set<E> freshSet(E freshElement) {
    529     return freshHashSet(freshElement);
    530   }
    531 
    532   @Generates private static <E> HashSet<E> freshHashSet(E freshElement) {
    533     return freshLinkedHashSet(freshElement);
    534   }
    535 
    536   @Generates private static <E> LinkedHashSet<E> freshLinkedHashSet(E freshElement) {
    537     LinkedHashSet<E> set = Sets.newLinkedHashSet();
    538     set.add(freshElement);
    539     return set;
    540   }
    541 
    542   @Generates private static <E> ImmutableSet<E> freshImmutableSet(E freshElement) {
    543     return ImmutableSet.of(freshElement);
    544   }
    545 
    546   @Generates private static <E extends Comparable<? super E>> SortedSet<E>
    547       freshSortedSet(E freshElement) {
    548     return freshNavigableSet(freshElement);
    549   }
    550 
    551   @Generates private static <E extends Comparable<? super E>> NavigableSet<E>
    552       freshNavigableSet(E freshElement) {
    553     return freshTreeSet(freshElement);
    554   }
    555 
    556   @Generates private static <E extends Comparable<? super E>> TreeSet<E> freshTreeSet(
    557       E freshElement) {
    558     TreeSet<E> set = Sets.newTreeSet();
    559     set.add(freshElement);
    560     return set;
    561   }
    562 
    563   @Generates private static <E extends Comparable<? super E>> ImmutableSortedSet<E>
    564       freshImmutableSortedSet(E freshElement) {
    565     return ImmutableSortedSet.of(freshElement);
    566   }
    567 
    568   @Generates private static <E> Multiset<E> freshMultiset(E freshElement) {
    569     return freshHashMultiset(freshElement);
    570   }
    571 
    572   @Generates private static <E> HashMultiset<E> freshHashMultiset(E freshElement) {
    573     HashMultiset<E> multiset = HashMultiset.create();
    574     multiset.add(freshElement);
    575     return multiset;
    576   }
    577 
    578   @Generates private static <E> LinkedHashMultiset<E> freshLinkedHashMultiset(E freshElement) {
    579     LinkedHashMultiset<E> multiset = LinkedHashMultiset.create();
    580     multiset.add(freshElement);
    581     return multiset;
    582   }
    583 
    584   @Generates private static <E> ImmutableMultiset<E> freshImmutableMultiset(E freshElement) {
    585     return ImmutableMultiset.of(freshElement);
    586   }
    587 
    588   @Generates private static <E extends Comparable<E>> SortedMultiset<E> freshSortedMultiset(
    589       E freshElement) {
    590     return freshTreeMultiset(freshElement);
    591   }
    592 
    593   @Generates private static <E extends Comparable<E>> TreeMultiset<E> freshTreeMultiset(
    594       E freshElement) {
    595     TreeMultiset<E> multiset = TreeMultiset.create();
    596     multiset.add(freshElement);
    597     return multiset;
    598   }
    599 
    600   @Generates private static <E extends Comparable<E>> ImmutableSortedMultiset<E>
    601       freshImmutableSortedMultiset(E freshElement) {
    602     return ImmutableSortedMultiset.of(freshElement);
    603   }
    604 
    605   @Generates private static <K, V> Map<K, V> freshMap(K key, V value) {
    606     return freshHashdMap(key, value);
    607   }
    608 
    609   @Generates private static <K, V> HashMap<K, V> freshHashdMap(K key, V value) {
    610     return freshLinkedHashMap(key, value);
    611   }
    612 
    613   @Generates private static <K, V> LinkedHashMap<K, V> freshLinkedHashMap(K key, V value) {
    614     LinkedHashMap<K, V> map = Maps.newLinkedHashMap();
    615     map.put(key, value);
    616     return map;
    617   }
    618 
    619   @Generates private static <K, V> ImmutableMap<K, V> freshImmutableMap(K key, V value) {
    620     return ImmutableMap.of(key, value);
    621   }
    622 
    623   @Generates private static <K, V> ConcurrentMap<K, V> freshConcurrentMap(K key, V value) {
    624     ConcurrentMap<K, V> map = Maps.newConcurrentMap();
    625     map.put(key, value);
    626     return map;
    627   }
    628 
    629   @Generates private static <K extends Comparable<? super K>, V> SortedMap<K, V>
    630       freshSortedMap(K key, V value) {
    631     return freshNavigableMap(key, value);
    632   }
    633 
    634   @Generates private static <K extends Comparable<? super K>, V> NavigableMap<K, V>
    635       freshNavigableMap(K key, V value) {
    636     return freshTreeMap(key, value);
    637   }
    638 
    639   @Generates private static <K extends Comparable<? super K>, V> TreeMap<K, V> freshTreeMap(
    640       K key, V value) {
    641     TreeMap<K, V> map = Maps.newTreeMap();
    642     map.put(key, value);
    643     return map;
    644   }
    645 
    646   @Generates private static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V>
    647       freshImmutableSortedMap(K key, V value) {
    648     return ImmutableSortedMap.of(key, value);
    649   }
    650 
    651   @Generates private static <K, V> Multimap<K, V> freshMultimap(K key, V value) {
    652     return freshListMultimap(key, value);
    653   }
    654 
    655   @Generates private static <K, V> ImmutableMultimap<K, V> freshImmutableMultimap(K key, V value) {
    656     return ImmutableMultimap.of(key, value);
    657   }
    658 
    659   @Generates private static <K, V> ListMultimap<K, V> freshListMultimap(K key, V value) {
    660     return freshArrayListMultimap(key, value);
    661   }
    662 
    663   @Generates private static <K, V> ArrayListMultimap<K, V> freshArrayListMultimap(K key, V value) {
    664     ArrayListMultimap<K, V> multimap = ArrayListMultimap.create();
    665     multimap.put(key, value);
    666     return multimap;
    667   }
    668 
    669   @Generates private static <K, V> ImmutableListMultimap<K, V> freshImmutableListMultimap(
    670       K key, V value) {
    671     return ImmutableListMultimap.of(key, value);
    672   }
    673 
    674   @Generates private static <K, V> SetMultimap<K, V> freshSetMultimap(K key, V value) {
    675     return freshLinkedHashMultimap(key, value);
    676   }
    677 
    678   @Generates private static <K, V> HashMultimap<K, V> freshHashMultimap(K key, V value) {
    679     HashMultimap<K, V> multimap = HashMultimap.create();
    680     multimap.put(key, value);
    681     return multimap;
    682   }
    683 
    684   @Generates private static <K, V> LinkedHashMultimap<K, V> freshLinkedHashMultimap(
    685       K key, V value) {
    686     LinkedHashMultimap<K, V> multimap = LinkedHashMultimap.create();
    687     multimap.put(key, value);
    688     return multimap;
    689   }
    690 
    691   @Generates private static <K, V> ImmutableSetMultimap<K, V> freshImmutableSetMultimap(
    692       K key, V value) {
    693     return ImmutableSetMultimap.of(key, value);
    694   }
    695 
    696   @Generates private static <K, V> BiMap<K, V> freshBimap(K key, V value) {
    697     return freshHashBiMap(key, value);
    698   }
    699 
    700   @Generates private static <K, V> HashBiMap<K, V> freshHashBiMap(K key, V value) {
    701     HashBiMap<K, V> bimap = HashBiMap.create();
    702     bimap.put(key, value);
    703     return bimap;
    704   }
    705 
    706   @Generates private static <K, V> ImmutableBiMap<K, V> freshImmutableBimap(
    707       K key, V value) {
    708     return ImmutableBiMap.of(key, value);
    709   }
    710 
    711   @Generates private static <R, C, V> Table<R, C, V> freshTable(R row, C column, V value) {
    712     return freshHashBasedTable(row, column, value);
    713   }
    714 
    715   @Generates private static <R, C, V> HashBasedTable<R, C, V> freshHashBasedTable(
    716       R row, C column, V value) {
    717     HashBasedTable<R, C, V> table = HashBasedTable.create();
    718     table.put(row, column, value);
    719     return table;
    720   }
    721 
    722   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
    723   @Generates private static <R extends Comparable, C extends Comparable, V> RowSortedTable<R, C, V>
    724       freshRowSortedTable(R row, C column, V value) {
    725     return freshTreeBasedTable(row, column, value);
    726   }
    727 
    728   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
    729   @Generates private static <R extends Comparable, C extends Comparable, V> TreeBasedTable<R, C, V>
    730       freshTreeBasedTable(R row, C column, V value) {
    731     TreeBasedTable<R, C, V> table = TreeBasedTable.create();
    732     table.put(row, column, value);
    733     return table;
    734   }
    735 
    736   @Generates private static <R, C, V> ImmutableTable<R, C, V> freshImmutableTable(
    737       R row, C column, V value) {
    738     return ImmutableTable.of(row, column, value);
    739   }
    740 
    741   // common.reflect
    742   @Generates private TypeToken<?> freshTypeToken() {
    743     return TypeToken.of(freshClass());
    744   }
    745 
    746   // io types
    747   @Generates private File freshFile() {
    748     return new File(freshString());
    749   }
    750 
    751   @Generates private static ByteArrayInputStream freshByteArrayInputStream() {
    752     return new ByteArrayInputStream(new byte[0]);
    753   }
    754 
    755   @Generates private static InputStream freshInputStream() {
    756     return freshByteArrayInputStream();
    757   }
    758 
    759   @Generates private StringReader freshStringReader() {
    760     return new StringReader(freshString());
    761   }
    762 
    763   @Generates private Reader freshReader() {
    764     return freshStringReader();
    765   }
    766 
    767   @Generates private Readable freshReadable() {
    768     return freshReader();
    769   }
    770 
    771   @Generates private Buffer freshBuffer() {
    772     return freshCharBuffer();
    773   }
    774 
    775   @Generates private CharBuffer freshCharBuffer() {
    776     return CharBuffer.allocate(freshInt());
    777   }
    778 
    779   @Generates private ByteBuffer freshByteBuffer() {
    780     return ByteBuffer.allocate(freshInt());
    781   }
    782 
    783   @Generates private ShortBuffer freshShortBuffer() {
    784     return ShortBuffer.allocate(freshInt());
    785   }
    786 
    787   @Generates private IntBuffer freshIntBuffer() {
    788     return IntBuffer.allocate(freshInt());
    789   }
    790 
    791   @Generates private LongBuffer freshLongBuffer() {
    792     return LongBuffer.allocate(freshInt());
    793   }
    794 
    795   @Generates private FloatBuffer freshFloatBuffer() {
    796     return FloatBuffer.allocate(freshInt());
    797   }
    798 
    799   @Generates private DoubleBuffer freshDoubleBuffer() {
    800     return DoubleBuffer.allocate(freshInt());
    801   }
    802 }
    803