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