Coverage Summary for Class: FreshValueGenerator (com.google.common.testing)

Class Method, % Line, %
FreshValueGenerator 99.2% (124/125) 91% (213/234)
FreshValueGenerator$1 50% (2/4) 60% (3/5)
FreshValueGenerator$2 66.7% (2/3) 75% (3/4)
FreshValueGenerator$3 66.7% (2/3) 75% (3/4)
FreshValueGenerator$4 66.7% (2/3) 75% (3/4)
FreshValueGenerator$Empty
FreshValueGenerator$FreshInvocationHandler 80% (4/5) 81.8% (9/11)
FreshValueGenerator$Generates
Total 95.1% (136/143) 89.3% (234/262)


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