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