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.Set; 114 import java.util.SortedMap; 115 import java.util.SortedSet; 116 import java.util.TreeMap; 117 import java.util.TreeSet; 118 import java.util.concurrent.ConcurrentMap; 119 import java.util.concurrent.atomic.AtomicInteger; 120 import java.util.regex.Pattern; 121 import org.checkerframework.checker.nullness.compatqual.NullableDecl; 122 123 /** 124 * Generates fresh instances of types that are different from each other (if possible). 125 * 126 * @author Ben Yu 127 */ 128 @GwtIncompatible 129 class FreshValueGenerator { 130 131 private static final ImmutableMap<Class<?>, Method> GENERATORS; 132 133 static { 134 ImmutableMap.Builder<Class<?>, Method> builder = ImmutableMap.builder(); 135 for (Method method : FreshValueGenerator.class.getDeclaredMethods()) { 136 if (method.isAnnotationPresent(Generates.class)) { method.getReturnType()137 builder.put(method.getReturnType(), method); 138 } 139 } 140 GENERATORS = builder.build(); 141 } 142 143 private static final ImmutableMap<Class<?>, Method> EMPTY_GENERATORS; 144 145 static { 146 ImmutableMap.Builder<Class<?>, Method> builder = ImmutableMap.builder(); 147 for (Method method : FreshValueGenerator.class.getDeclaredMethods()) { 148 if (method.isAnnotationPresent(Empty.class)) { method.getReturnType()149 builder.put(method.getReturnType(), method); 150 } 151 } 152 EMPTY_GENERATORS = builder.build(); 153 } 154 155 private final AtomicInteger freshness = new AtomicInteger(1); 156 private final ListMultimap<Class<?>, Object> sampleInstances = ArrayListMultimap.create(); 157 158 /** 159 * The freshness level at which the {@link Empty @Empty} annotated method was invoked to generate 160 * instance. 161 */ 162 private final Map<Type, Integer> emptyInstanceGenerated = new HashMap<>(); 163 addSampleInstances(Class<T> type, Iterable<? extends T> instances)164 final <T> void addSampleInstances(Class<T> type, Iterable<? extends T> instances) { 165 sampleInstances.putAll(checkNotNull(type), checkNotNull(instances)); 166 } 167 168 /** 169 * Returns a fresh instance for {@code type} if possible. The returned instance could be: 170 * 171 * <ul> 172 * <li>exactly of the given type, including generic type parameters, such as {@code 173 * ImmutableList<String>}; 174 * <li>of the raw type; 175 * <li>null if no value can be generated. 176 * </ul> 177 */ 178 @NullableDecl generateFresh(TypeToken<?> type)179 final Object generateFresh(TypeToken<?> type) { 180 Object generated = generate(type); 181 if (generated != null) { 182 freshness.incrementAndGet(); 183 } 184 return generated; 185 } 186 187 @NullableDecl generateFresh(Class<T> type)188 final <T> 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 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 = 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> 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, Object[] args)292 protected Object handleInvocation(Object proxy, Method method, Object[] args) { 293 return interfaceMethodCalled(interfaceType, method); 294 } 295 296 @Override hashCode()297 public int hashCode() { 298 return identity; 299 } 300 301 @Override equals(@ullableDecl Object obj)302 public boolean equals(@NullableDecl 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> 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(@NullableDecl E freshElement) { 651 return generateList(freshElement); 652 } 653 654 @Generates 655 static <E> Collection<E> generateCollection(@NullableDecl E freshElement) { 656 return generateList(freshElement); 657 } 658 659 @Generates 660 static <E> List<E> generateList(@NullableDecl E freshElement) { 661 return generateArrayList(freshElement); 662 } 663 664 @Generates 665 static <E> ArrayList<E> generateArrayList(@NullableDecl 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(@NullableDecl 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(@NullableDecl E freshElement) { 690 return generateHashSet(freshElement); 691 } 692 693 @Generates 694 static <E> HashSet<E> generateHashSet(@NullableDecl E freshElement) { 695 return generateLinkedHashSet(freshElement); 696 } 697 698 @Generates 699 static <E> LinkedHashSet<E> generateLinkedHashSet(@NullableDecl 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(@NullableDecl E freshElement) { 735 return generateHashMultiset(freshElement); 736 } 737 738 @Generates 739 static <E> HashMultiset<E> generateHashMultiset(@NullableDecl 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(@NullableDecl 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(@NullableDecl K key, @NullableDecl V value) { 777 return generateHashdMap(key, value); 778 } 779 780 @Generates 781 static <K, V> HashMap<K, V> generateHashdMap(@NullableDecl K key, @NullableDecl V value) { 782 return generateLinkedHashMap(key, value); 783 } 784 785 @Generates 786 static <K, V> LinkedHashMap<K, V> generateLinkedHashMap( 787 @NullableDecl K key, @NullableDecl V value) { 788 LinkedHashMap<K, V> map = Maps.newLinkedHashMap(); 789 map.put(key, value); 790 return map; 791 } 792 793 @Generates 794 static <K, V> ImmutableMap<K, V> generateImmutableMap(K key, V value) { 795 return ImmutableMap.of(key, value); 796 } 797 798 @Empty 799 static <K, V> ConcurrentMap<K, V> generateConcurrentMap() { 800 return Maps.newConcurrentMap(); 801 } 802 803 @Generates 804 static <K, V> ConcurrentMap<K, V> generateConcurrentMap(K key, V value) { 805 ConcurrentMap<K, V> map = Maps.newConcurrentMap(); 806 map.put(key, value); 807 return map; 808 } 809 810 @Generates 811 static <K extends Comparable<? super K>, V> SortedMap<K, V> generateSortedMap( 812 K key, @NullableDecl V value) { 813 return generateNavigableMap(key, value); 814 } 815 816 @Generates 817 static <K extends Comparable<? super K>, V> NavigableMap<K, V> generateNavigableMap( 818 K key, @NullableDecl V value) { 819 return generateTreeMap(key, value); 820 } 821 822 @Generates 823 static <K extends Comparable<? super K>, V> TreeMap<K, V> generateTreeMap( 824 K key, @NullableDecl V value) { 825 TreeMap<K, V> map = Maps.newTreeMap(); 826 map.put(key, value); 827 return map; 828 } 829 830 @Generates 831 static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> generateImmutableSortedMap( 832 K key, V value) { 833 return ImmutableSortedMap.of(key, value); 834 } 835 836 @Generates 837 static <K, V> Multimap<K, V> generateMultimap(@NullableDecl K key, @NullableDecl V value) { 838 return generateListMultimap(key, value); 839 } 840 841 @Generates 842 static <K, V> ImmutableMultimap<K, V> generateImmutableMultimap(K key, V value) { 843 return ImmutableMultimap.of(key, value); 844 } 845 846 @Generates 847 static <K, V> ListMultimap<K, V> generateListMultimap( 848 @NullableDecl K key, @NullableDecl V value) { 849 return generateArrayListMultimap(key, value); 850 } 851 852 @Generates 853 static <K, V> ArrayListMultimap<K, V> generateArrayListMultimap( 854 @NullableDecl K key, @NullableDecl V value) { 855 ArrayListMultimap<K, V> multimap = ArrayListMultimap.create(); 856 multimap.put(key, value); 857 return multimap; 858 } 859 860 @Generates 861 static <K, V> ImmutableListMultimap<K, V> generateImmutableListMultimap(K key, V value) { 862 return ImmutableListMultimap.of(key, value); 863 } 864 865 @Generates 866 static <K, V> SetMultimap<K, V> generateSetMultimap(@NullableDecl K key, @NullableDecl V value) { 867 return generateLinkedHashMultimap(key, value); 868 } 869 870 @Generates 871 static <K, V> HashMultimap<K, V> generateHashMultimap( 872 @NullableDecl K key, @NullableDecl V value) { 873 HashMultimap<K, V> multimap = HashMultimap.create(); 874 multimap.put(key, value); 875 return multimap; 876 } 877 878 @Generates 879 static <K, V> LinkedHashMultimap<K, V> generateLinkedHashMultimap( 880 @NullableDecl K key, @NullableDecl V value) { 881 LinkedHashMultimap<K, V> multimap = LinkedHashMultimap.create(); 882 multimap.put(key, value); 883 return multimap; 884 } 885 886 @Generates 887 static <K, V> ImmutableSetMultimap<K, V> generateImmutableSetMultimap(K key, V value) { 888 return ImmutableSetMultimap.of(key, value); 889 } 890 891 @Generates 892 static <K, V> BiMap<K, V> generateBimap(@NullableDecl K key, @NullableDecl V value) { 893 return generateHashBiMap(key, value); 894 } 895 896 @Generates 897 static <K, V> HashBiMap<K, V> generateHashBiMap(@NullableDecl K key, @NullableDecl V value) { 898 HashBiMap<K, V> bimap = HashBiMap.create(); 899 bimap.put(key, value); 900 return bimap; 901 } 902 903 @Generates 904 static <K, V> ImmutableBiMap<K, V> generateImmutableBimap(K key, V value) { 905 return ImmutableBiMap.of(key, value); 906 } 907 908 @Generates 909 static <R, C, V> Table<R, C, V> generateTable( 910 @NullableDecl R row, @NullableDecl C column, @NullableDecl V value) { 911 return generateHashBasedTable(row, column, value); 912 } 913 914 @Generates 915 static <R, C, V> HashBasedTable<R, C, V> generateHashBasedTable( 916 @NullableDecl R row, @NullableDecl C column, @NullableDecl V value) { 917 HashBasedTable<R, C, V> table = HashBasedTable.create(); 918 table.put(row, column, value); 919 return table; 920 } 921 922 @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such 923 @Generates 924 static <R extends Comparable, C extends Comparable, V> 925 RowSortedTable<R, C, V> generateRowSortedTable(R row, C column, V value) { 926 return generateTreeBasedTable(row, column, value); 927 } 928 929 @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such 930 @Generates 931 static <R extends Comparable, C extends Comparable, V> 932 TreeBasedTable<R, C, V> generateTreeBasedTable(R row, C column, V value) { 933 TreeBasedTable<R, C, V> table = TreeBasedTable.create(); 934 table.put(row, column, value); 935 return table; 936 } 937 938 @Generates 939 static <R, C, V> ImmutableTable<R, C, V> generateImmutableTable(R row, C column, V value) { 940 return ImmutableTable.of(row, column, value); 941 } 942 943 // common.reflect 944 @Generates 945 TypeToken<?> generateTypeToken() { 946 return TypeToken.of(generateClass()); 947 } 948 949 // io types 950 @Generates 951 File generateFile() { 952 return new File(generateString()); 953 } 954 955 @Generates 956 static ByteArrayInputStream generateByteArrayInputStream() { 957 return new ByteArrayInputStream(new byte[0]); 958 } 959 960 @Generates 961 static InputStream generateInputStream() { 962 return generateByteArrayInputStream(); 963 } 964 965 @Generates 966 StringReader generateStringReader() { 967 return new StringReader(generateString()); 968 } 969 970 @Generates 971 Reader generateReader() { 972 return generateStringReader(); 973 } 974 975 @Generates 976 Readable generateReadable() { 977 return generateReader(); 978 } 979 980 @Generates 981 Buffer generateBuffer() { 982 return generateCharBuffer(); 983 } 984 985 @Generates 986 CharBuffer generateCharBuffer() { 987 return CharBuffer.allocate(generateInt()); 988 } 989 990 @Generates 991 ByteBuffer generateByteBuffer() { 992 return ByteBuffer.allocate(generateInt()); 993 } 994 995 @Generates 996 ShortBuffer generateShortBuffer() { 997 return ShortBuffer.allocate(generateInt()); 998 } 999 1000 @Generates 1001 IntBuffer generateIntBuffer() { 1002 return IntBuffer.allocate(generateInt()); 1003 } 1004 1005 @Generates 1006 LongBuffer generateLongBuffer() { 1007 return LongBuffer.allocate(generateInt()); 1008 } 1009 1010 @Generates 1011 FloatBuffer generateFloatBuffer() { 1012 return FloatBuffer.allocate(generateInt()); 1013 } 1014 1015 @Generates 1016 DoubleBuffer generateDoubleBuffer() { 1017 return DoubleBuffer.allocate(generateInt()); 1018 } 1019 } 1020