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 com.google.common.base.CharMatcher; 20 import com.google.common.base.Equivalence; 21 import com.google.common.base.Function; 22 import com.google.common.base.Joiner; 23 import com.google.common.base.Optional; 24 import com.google.common.base.Predicate; 25 import com.google.common.base.Splitter; 26 import com.google.common.base.Ticker; 27 import com.google.common.collect.ArrayListMultimap; 28 import com.google.common.collect.BiMap; 29 import com.google.common.collect.HashBasedTable; 30 import com.google.common.collect.HashBiMap; 31 import com.google.common.collect.HashMultimap; 32 import com.google.common.collect.HashMultiset; 33 import com.google.common.collect.ImmutableBiMap; 34 import com.google.common.collect.ImmutableCollection; 35 import com.google.common.collect.ImmutableList; 36 import com.google.common.collect.ImmutableListMultimap; 37 import com.google.common.collect.ImmutableMap; 38 import com.google.common.collect.ImmutableMultimap; 39 import com.google.common.collect.ImmutableMultiset; 40 import com.google.common.collect.ImmutableSet; 41 import com.google.common.collect.ImmutableSetMultimap; 42 import com.google.common.collect.ImmutableSortedMap; 43 import com.google.common.collect.ImmutableSortedMultiset; 44 import com.google.common.collect.ImmutableSortedSet; 45 import com.google.common.collect.ImmutableTable; 46 import com.google.common.collect.LinkedHashMultimap; 47 import com.google.common.collect.LinkedHashMultiset; 48 import com.google.common.collect.ListMultimap; 49 import com.google.common.collect.Lists; 50 import com.google.common.collect.Maps; 51 import com.google.common.collect.Multimap; 52 import com.google.common.collect.Multiset; 53 import com.google.common.collect.Ordering; 54 import com.google.common.collect.Range; 55 import com.google.common.collect.RowSortedTable; 56 import com.google.common.collect.SetMultimap; 57 import com.google.common.collect.Sets; 58 import com.google.common.collect.SortedMultiset; 59 import com.google.common.collect.Table; 60 import com.google.common.collect.TreeBasedTable; 61 import com.google.common.collect.TreeMultiset; 62 import com.google.common.primitives.UnsignedInteger; 63 import com.google.common.primitives.UnsignedLong; 64 import com.google.common.reflect.TypeToken; 65 66 import junit.framework.TestCase; 67 68 import java.io.ByteArrayInputStream; 69 import java.io.ByteArrayOutputStream; 70 import java.io.File; 71 import java.io.InputStream; 72 import java.io.OutputStream; 73 import java.io.Reader; 74 import java.io.StringReader; 75 import java.io.StringWriter; 76 import java.io.Writer; 77 import java.lang.reflect.Method; 78 import java.lang.reflect.Type; 79 import java.math.BigDecimal; 80 import java.math.BigInteger; 81 import java.nio.Buffer; 82 import java.nio.ByteBuffer; 83 import java.nio.CharBuffer; 84 import java.nio.DoubleBuffer; 85 import java.nio.FloatBuffer; 86 import java.nio.IntBuffer; 87 import java.nio.LongBuffer; 88 import java.nio.ShortBuffer; 89 import java.nio.charset.Charset; 90 import java.util.ArrayList; 91 import java.util.Collection; 92 import java.util.Comparator; 93 import java.util.Currency; 94 import java.util.HashMap; 95 import java.util.HashSet; 96 import java.util.LinkedHashMap; 97 import java.util.LinkedHashSet; 98 import java.util.LinkedList; 99 import java.util.List; 100 import java.util.Locale; 101 import java.util.Map; 102 import java.util.NavigableMap; 103 import java.util.NavigableSet; 104 import java.util.Set; 105 import java.util.SortedMap; 106 import java.util.SortedSet; 107 import java.util.TreeMap; 108 import java.util.TreeSet; 109 import java.util.concurrent.ConcurrentMap; 110 import java.util.concurrent.TimeUnit; 111 import java.util.regex.MatchResult; 112 import java.util.regex.Pattern; 113 114 /** 115 * Tests for {@link FreshValueGenerator}. 116 * 117 * @author Ben Yu 118 */ 119 public class FreshValueGeneratorTest extends TestCase { 120 121 public void testFreshInstance() { 122 assertFreshInstances( 123 String.class, CharSequence.class, 124 Appendable.class, StringBuffer.class, StringBuilder.class, 125 Pattern.class, MatchResult.class, 126 Number.class, int.class, Integer.class, 127 long.class, Long.class, 128 short.class, Short.class, 129 byte.class, Byte.class, 130 boolean.class, Boolean.class, 131 char.class, Character.class, 132 int[].class, Object[].class, 133 UnsignedInteger.class, UnsignedLong.class, 134 BigInteger.class, BigDecimal.class, 135 Throwable.class, Error.class, Exception.class, RuntimeException.class, 136 Charset.class, Locale.class, Currency.class, 137 List.class, Map.Entry.class, 138 Object.class, 139 Equivalence.class, Predicate.class, Function.class, 140 Comparable.class, Comparator.class, Ordering.class, 141 Class.class, Type.class, TypeToken.class, 142 TimeUnit.class, Ticker.class, 143 Joiner.class, Splitter.class, CharMatcher.class, 144 InputStream.class, ByteArrayInputStream.class, 145 Reader.class, Readable.class, StringReader.class, 146 OutputStream.class, ByteArrayOutputStream.class, 147 Writer.class, StringWriter.class, File.class, 148 Buffer.class, ByteBuffer.class, CharBuffer.class, 149 ShortBuffer.class, IntBuffer.class, LongBuffer.class, 150 FloatBuffer.class, DoubleBuffer.class, 151 String[].class, Object[].class, int[].class); 152 } 153 154 public void testStringArray() { 155 FreshValueGenerator generator = new FreshValueGenerator(); 156 String[] a1 = generator.generate(String[].class); 157 String[] a2 = generator.generate(String[].class); 158 assertFalse(a1[0].equals(a2[0])); 159 } 160 161 public void testPrimitiveArray() { 162 FreshValueGenerator generator = new FreshValueGenerator(); 163 int[] a1 = generator.generate(int[].class); 164 int[] a2 = generator.generate(int[].class); 165 assertTrue(a1[0] != a2[0]); 166 } 167 168 public void testRange() { 169 assertFreshInstance(new TypeToken<Range<String>>() {}); 170 } 171 172 public void testImmutableList() { 173 assertFreshInstance(new TypeToken<ImmutableList<String>>() {}); 174 assertValueAndTypeEquals(ImmutableList.of(new FreshValueGenerator().generate(String.class)), 175 new FreshValueGenerator().generate(new TypeToken<ImmutableList<String>>() {})); 176 assertValueAndTypeEquals(ImmutableList.of(new FreshValueGenerator().generate(int.class)), 177 new FreshValueGenerator().generate(new TypeToken<ImmutableList<Integer>>() {})); 178 assertValueAndTypeEquals(ImmutableList.of(new FreshValueGenerator().generate(String.class)), 179 new FreshValueGenerator().generate(new TypeToken<ImmutableList<?>>() {})); 180 } 181 182 public void testImmutableSet() { 183 assertFreshInstance(new TypeToken<ImmutableSet<String>>() {}); 184 assertValueAndTypeEquals(ImmutableSet.of(new FreshValueGenerator().generate(String.class)), 185 new FreshValueGenerator().generate(new TypeToken<ImmutableSet<String>>() {})); 186 assertValueAndTypeEquals(ImmutableSet.of(new FreshValueGenerator().generate(Number.class)), 187 new FreshValueGenerator().generate(new TypeToken<ImmutableSet<Number>>() {})); 188 assertValueAndTypeEquals(ImmutableSet.of(new FreshValueGenerator().generate(Number.class)), 189 new FreshValueGenerator().generate(new TypeToken<ImmutableSet<? extends Number>>() {})); 190 } 191 192 public void testImmutableSortedSet() { 193 assertFreshInstance(new TypeToken<ImmutableSortedSet<String>>() {}); 194 assertValueAndTypeEquals( 195 ImmutableSortedSet.of(new FreshValueGenerator().generate(String.class)), 196 new FreshValueGenerator().generate(new TypeToken<ImmutableSortedSet<String>>() {})); 197 } 198 199 public void testImmutableMultiset() { 200 assertFreshInstance(new TypeToken<ImmutableSortedSet<String>>() {}); 201 assertValueAndTypeEquals(ImmutableMultiset.of(new FreshValueGenerator().generate(String.class)), 202 new FreshValueGenerator().generate(new TypeToken<ImmutableMultiset<String>>() {})); 203 assertValueAndTypeEquals(ImmutableMultiset.of(new FreshValueGenerator().generate(Number.class)), 204 new FreshValueGenerator().generate(new TypeToken<ImmutableMultiset<Number>>() {})); 205 assertNotInstantiable(new TypeToken<ImmutableMultiset<EmptyEnum>>() {}); 206 } 207 208 public void testImmutableCollection() { 209 assertFreshInstance(new TypeToken<ImmutableCollection<String>>() {}); 210 assertValueAndTypeEquals(ImmutableList.of(new FreshValueGenerator().generate(String.class)), 211 new FreshValueGenerator().generate(new TypeToken<ImmutableCollection<String>>() {})); 212 assertNotInstantiable(new TypeToken<ImmutableCollection<EmptyEnum>>() {}); 213 } 214 215 public void testImmutableMap() { 216 assertFreshInstance(new TypeToken<ImmutableMap<String, Integer>>() {}); 217 FreshValueGenerator generator = new FreshValueGenerator(); 218 assertValueAndTypeEquals( 219 ImmutableMap.of(generator.generate(String.class), generator.generate(int.class)), 220 new FreshValueGenerator().generate(new TypeToken<ImmutableMap<String, Integer>>() {})); 221 } 222 223 public void testImmutableSortedMap() { 224 assertFreshInstance(new TypeToken<ImmutableSortedMap<String, Integer>>() {}); 225 FreshValueGenerator generator = new FreshValueGenerator(); 226 assertValueAndTypeEquals( 227 ImmutableSortedMap.of(generator.generate(String.class), generator.generate(int.class)), 228 new FreshValueGenerator().generate( 229 new TypeToken<ImmutableSortedMap<String, Integer>>() {})); 230 } 231 232 public void testImmutableMultimap() { 233 assertFreshInstance(new TypeToken<ImmutableMultimap<String, Integer>>() {}); 234 FreshValueGenerator generator = new FreshValueGenerator(); 235 assertValueAndTypeEquals( 236 ImmutableMultimap.of(generator.generate(String.class), generator.generate(int.class)), 237 new FreshValueGenerator().generate(new TypeToken<ImmutableMultimap<String, Integer>>() {})); 238 assertNotInstantiable(new TypeToken<ImmutableMultimap<EmptyEnum, String>>() {}); 239 } 240 241 public void testImmutableListMultimap() { 242 assertFreshInstance(new TypeToken<ImmutableListMultimap<String, Integer>>() {}); 243 FreshValueGenerator generator = new FreshValueGenerator(); 244 assertValueAndTypeEquals( 245 ImmutableListMultimap.of(generator.generate(String.class), generator.generate(int.class)), 246 new FreshValueGenerator().generate( 247 new TypeToken<ImmutableListMultimap<String, Integer>>() {})); 248 } 249 250 public void testImmutableSetMultimap() { 251 assertFreshInstance(new TypeToken<ImmutableSetMultimap<String, Integer>>() {}); 252 FreshValueGenerator generator = new FreshValueGenerator(); 253 assertValueAndTypeEquals( 254 ImmutableSetMultimap.of(generator.generate(String.class), generator.generate(int.class)), 255 new FreshValueGenerator().generate( 256 new TypeToken<ImmutableSetMultimap<String, Integer>>() {})); 257 } 258 259 public void testImmutableBiMap() { 260 assertFreshInstance(new TypeToken<ImmutableBiMap<String, Integer>>() {}); 261 FreshValueGenerator generator = new FreshValueGenerator(); 262 assertValueAndTypeEquals( 263 ImmutableBiMap.of(generator.generate(String.class), generator.generate(int.class)), 264 new FreshValueGenerator().generate( 265 new TypeToken<ImmutableBiMap<String, Integer>>() {})); 266 } 267 268 public void testImmutableTable() { 269 assertFreshInstance(new TypeToken<ImmutableTable<String, Integer, ImmutableList<String>>>() {}); 270 FreshValueGenerator generator = new FreshValueGenerator(); 271 assertValueAndTypeEquals( 272 ImmutableTable.of( 273 generator.generate(String.class), generator.generate(int.class), 274 generator.generate(new TypeToken<ImmutableList<String>>() {})), 275 new FreshValueGenerator().generate( 276 new TypeToken<ImmutableTable<String, Integer, ImmutableList<String>>>() {})); 277 } 278 279 public void testList() { 280 assertFreshInstance(new TypeToken<List<String>>() {}); 281 assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)), 282 new FreshValueGenerator().generate(new TypeToken<List<String>>() {})); 283 assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(int.class)), 284 new FreshValueGenerator().generate(new TypeToken<List<Integer>>() {})); 285 assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)), 286 new FreshValueGenerator().generate(new TypeToken<List<?>>() {})); 287 assertNotInstantiable(new TypeToken<List<EmptyEnum>>() {}); 288 } 289 290 public void testArrayList() { 291 assertFreshInstance(new TypeToken<ArrayList<String>>() {}); 292 assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)), 293 new FreshValueGenerator().generate(new TypeToken<ArrayList<String>>() {})); 294 assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(int.class)), 295 new FreshValueGenerator().generate(new TypeToken<ArrayList<Integer>>() {})); 296 assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)), 297 new FreshValueGenerator().generate(new TypeToken<ArrayList<?>>() {})); 298 assertNotInstantiable(new TypeToken<ArrayList<EmptyEnum>>() {}); 299 } 300 301 public void testLinkedList() { 302 assertFreshInstance(new TypeToken<LinkedList<String>>() {}); 303 assertValueAndTypeEquals(newLinkedList(new FreshValueGenerator().generate(String.class)), 304 new FreshValueGenerator().generate(new TypeToken<LinkedList<String>>() {})); 305 } 306 307 public void testSet() { 308 assertFreshInstance(new TypeToken<Set<String>>() {}); 309 assertValueAndTypeEquals( 310 newLinkedHashSet(new FreshValueGenerator().generate(Number.class)), 311 new FreshValueGenerator().generate(new TypeToken<Set<? extends Number>>() {})); 312 assertNotInstantiable(new TypeToken<Set<EmptyEnum>>() {}); 313 } 314 315 public void testHashSet() { 316 assertFreshInstance(new TypeToken<HashSet<String>>() {}); 317 assertValueAndTypeEquals( 318 newLinkedHashSet(new FreshValueGenerator().generate(Number.class)), 319 new FreshValueGenerator().generate(new TypeToken<HashSet<? extends Number>>() {})); 320 } 321 322 public void testLinkedHashSet() { 323 assertFreshInstance(new TypeToken<LinkedHashSet<String>>() {}); 324 assertValueAndTypeEquals( 325 newLinkedHashSet(new FreshValueGenerator().generate(Number.class)), 326 new FreshValueGenerator().generate(new TypeToken<LinkedHashSet<? extends Number>>() {})); 327 } 328 329 public void testTreeSet() { 330 assertFreshInstance(new TypeToken<TreeSet<String>>() {}); 331 TreeSet<String> expected = Sets.newTreeSet(); 332 expected.add(new FreshValueGenerator().generate(String.class)); 333 assertValueAndTypeEquals(expected, 334 new FreshValueGenerator().generate(new TypeToken<TreeSet<? extends CharSequence>>() {})); 335 assertNotInstantiable(new TypeToken<TreeSet<EmptyEnum>>() {}); 336 } 337 338 public void testSortedSet() { 339 assertFreshInstance(new TypeToken<SortedSet<String>>() {}); 340 TreeSet<String> expected = Sets.newTreeSet(); 341 expected.add(new FreshValueGenerator().generate(String.class)); 342 assertValueAndTypeEquals(expected, 343 new FreshValueGenerator().generate(new TypeToken<SortedSet<String>>() {})); 344 assertNotInstantiable(new TypeToken<SortedSet<EmptyEnum>>() {}); 345 } 346 347 public void testNavigableSet() { 348 assertFreshInstance(new TypeToken<NavigableSet<String>>() {}); 349 TreeSet<String> expected = Sets.newTreeSet(); 350 expected.add(new FreshValueGenerator().generate(String.class)); 351 assertValueAndTypeEquals(expected, 352 new FreshValueGenerator().generate(new TypeToken<NavigableSet<String>>() {})); 353 assertNotInstantiable(new TypeToken<NavigableSet<EmptyEnum>>() {}); 354 } 355 356 public void testMultiset() { 357 assertFreshInstance(new TypeToken<Multiset<String>>() {}); 358 Multiset<String> expected = HashMultiset.create(); 359 expected.add(new FreshValueGenerator().generate(String.class)); 360 assertValueAndTypeEquals(expected, 361 new FreshValueGenerator().generate(new TypeToken<Multiset<String>>() {})); 362 assertNotInstantiable(new TypeToken<Multiset<EmptyEnum>>() {}); 363 } 364 365 public void testSortedMultiset() { 366 assertFreshInstance(new TypeToken<SortedMultiset<String>>() {}); 367 SortedMultiset<String> expected = TreeMultiset.create(); 368 expected.add(new FreshValueGenerator().generate(String.class)); 369 assertValueAndTypeEquals(expected, 370 new FreshValueGenerator().generate(new TypeToken<SortedMultiset<String>>() {})); 371 assertNotInstantiable(new TypeToken<Multiset<EmptyEnum>>() {}); 372 } 373 374 public void testHashMultiset() { 375 assertFreshInstance(new TypeToken<HashMultiset<String>>() {}); 376 HashMultiset<String> expected = HashMultiset.create(); 377 expected.add(new FreshValueGenerator().generate(String.class)); 378 assertValueAndTypeEquals(expected, 379 new FreshValueGenerator().generate(new TypeToken<HashMultiset<String>>() {})); 380 } 381 382 public void testLinkedHashMultiset() { 383 assertFreshInstance(new TypeToken<LinkedHashMultiset<String>>() {}); 384 LinkedHashMultiset<String> expected = LinkedHashMultiset.create(); 385 expected.add(new FreshValueGenerator().generate(String.class)); 386 assertValueAndTypeEquals(expected, 387 new FreshValueGenerator().generate(new TypeToken<LinkedHashMultiset<String>>() {})); 388 } 389 390 public void testTreeMultiset() { 391 assertFreshInstance(new TypeToken<TreeMultiset<String>>() {}); 392 TreeMultiset<String> expected = TreeMultiset.create(); 393 expected.add(new FreshValueGenerator().generate(String.class)); 394 assertValueAndTypeEquals(expected, 395 new FreshValueGenerator().generate(new TypeToken<TreeMultiset<String>>() {})); 396 } 397 398 public void testImmutableSortedMultiset() { 399 assertFreshInstance(new TypeToken<ImmutableSortedMultiset<String>>() {}); 400 assertValueAndTypeEquals( 401 ImmutableSortedMultiset.of(new FreshValueGenerator().generate(String.class)), 402 new FreshValueGenerator().generate(new TypeToken<ImmutableSortedMultiset<String>>() {})); 403 assertNotInstantiable(new TypeToken<Multiset<EmptyEnum>>() {}); 404 } 405 406 public void testCollection() { 407 assertFreshInstance(new TypeToken<Collection<String>>() {}); 408 assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)), 409 new FreshValueGenerator().generate(new TypeToken<Collection<String>>() {})); 410 assertNotInstantiable(new TypeToken<Collection<EmptyEnum>>() {}); 411 } 412 413 public void testIterable() { 414 assertFreshInstance(new TypeToken<Iterable<String>>() {}); 415 assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)), 416 new FreshValueGenerator().generate(new TypeToken<Iterable<String>>() {})); 417 assertNotInstantiable(new TypeToken<Iterable<EmptyEnum>>() {}); 418 } 419 420 public void testMap() { 421 assertFreshInstance(new TypeToken<Map<String, ?>>() {}); 422 FreshValueGenerator generator = new FreshValueGenerator(); 423 Map<String, Integer> expected = Maps.newLinkedHashMap(); 424 expected.put(generator.generate(String.class), generator.generate(int.class)); 425 assertValueAndTypeEquals(expected, 426 new FreshValueGenerator().generate(new TypeToken<Map<String, Integer>>() {})); 427 assertNotInstantiable(new TypeToken<Map<EmptyEnum, String>>() {}); 428 } 429 430 public void testHashMap() { 431 assertFreshInstance(new TypeToken<HashMap<String, ?>>() {}); 432 FreshValueGenerator generator = new FreshValueGenerator(); 433 HashMap<String, Integer> expected = Maps.newLinkedHashMap(); 434 expected.put(generator.generate(String.class), generator.generate(int.class)); 435 assertValueAndTypeEquals(expected, 436 new FreshValueGenerator().generate(new TypeToken<HashMap<String, Integer>>() {})); 437 } 438 439 public void testLinkedHashMap() { 440 assertFreshInstance(new TypeToken<LinkedHashMap<String, ?>>() {}); 441 FreshValueGenerator generator = new FreshValueGenerator(); 442 LinkedHashMap<String, Integer> expected = Maps.newLinkedHashMap(); 443 expected.put(generator.generate(String.class), generator.generate(int.class)); 444 assertValueAndTypeEquals(expected, 445 new FreshValueGenerator().generate(new TypeToken<LinkedHashMap<String, Integer>>() {})); 446 } 447 448 public void testTreeMap() { 449 assertFreshInstance(new TypeToken<TreeMap<String, ?>>() {}); 450 FreshValueGenerator generator = new FreshValueGenerator(); 451 TreeMap<String, Integer> expected = Maps.newTreeMap(); 452 expected.put(generator.generate(String.class), generator.generate(int.class)); 453 assertValueAndTypeEquals(expected, 454 new FreshValueGenerator().generate(new TypeToken<TreeMap<String, Integer>>() {})); 455 assertNotInstantiable(new TypeToken<LinkedHashSet<EmptyEnum>>() {}); 456 } 457 458 public void testSortedMap() { 459 assertFreshInstance(new TypeToken<SortedMap<?, String>>() {}); 460 FreshValueGenerator generator = new FreshValueGenerator(); 461 TreeMap<String, Integer> expected = Maps.newTreeMap(); 462 expected.put(generator.generate(String.class), generator.generate(int.class)); 463 assertValueAndTypeEquals(expected, 464 new FreshValueGenerator().generate( 465 new TypeToken<SortedMap<String, Integer>>() {})); 466 assertNotInstantiable(new TypeToken<SortedMap<EmptyEnum, String>>() {}); 467 } 468 469 public void testNavigableMap() { 470 assertFreshInstance(new TypeToken<NavigableMap<?, ?>>() {}); 471 FreshValueGenerator generator = new FreshValueGenerator(); 472 TreeMap<String, Integer> expected = Maps.newTreeMap(); 473 expected.put(generator.generate(String.class), generator.generate(int.class)); 474 assertValueAndTypeEquals(expected, 475 new FreshValueGenerator().generate( 476 new TypeToken<NavigableMap<String, Integer>>() {})); 477 assertNotInstantiable(new TypeToken<NavigableMap<EmptyEnum, String>>() {}); 478 } 479 480 public void testConcurrentMap() { 481 assertFreshInstance(new TypeToken<ConcurrentMap<String, ?>>() {}); 482 FreshValueGenerator generator = new FreshValueGenerator(); 483 ConcurrentMap<String, Integer> expected = Maps.newConcurrentMap(); 484 expected.put(generator.generate(String.class), generator.generate(int.class)); 485 assertValueAndTypeEquals(expected, 486 new FreshValueGenerator().generate(new TypeToken<ConcurrentMap<String, Integer>>() {})); 487 assertNotInstantiable(new TypeToken<ConcurrentMap<EmptyEnum, String>>() {}); 488 } 489 490 public void testMultimap() { 491 assertFreshInstance(new TypeToken<Multimap<String, ?>>() {}); 492 FreshValueGenerator generator = new FreshValueGenerator(); 493 Multimap<String, Integer> expected = ArrayListMultimap.create(); 494 expected.put(generator.generate(String.class), generator.generate(int.class)); 495 assertValueAndTypeEquals(expected, 496 new FreshValueGenerator().generate(new TypeToken<Multimap<String, Integer>>() {})); 497 assertNotInstantiable(new TypeToken<Multimap<EmptyEnum, String>>() {}); 498 } 499 500 public void testHashMultimap() { 501 assertFreshInstance(new TypeToken<HashMultimap<String, ?>>() {}); 502 FreshValueGenerator generator = new FreshValueGenerator(); 503 HashMultimap<String, Integer> expected = HashMultimap.create(); 504 expected.put(generator.generate(String.class), generator.generate(int.class)); 505 assertValueAndTypeEquals(expected, 506 new FreshValueGenerator().generate(new TypeToken<HashMultimap<String, Integer>>() {})); 507 } 508 509 public void testLinkedHashMultimap() { 510 assertFreshInstance(new TypeToken<LinkedHashMultimap<String, ?>>() {}); 511 FreshValueGenerator generator = new FreshValueGenerator(); 512 LinkedHashMultimap<String, Integer> expected = LinkedHashMultimap.create(); 513 expected.put(generator.generate(String.class), generator.generate(int.class)); 514 assertValueAndTypeEquals(expected, 515 new FreshValueGenerator().generate( 516 new TypeToken<LinkedHashMultimap<String, Integer>>() {})); 517 } 518 519 public void testListMultimap() { 520 assertFreshInstance(new TypeToken<ListMultimap<String, ?>>() {}); 521 FreshValueGenerator generator = new FreshValueGenerator(); 522 ListMultimap<String, Integer> expected = ArrayListMultimap.create(); 523 expected.put(generator.generate(String.class), generator.generate(int.class)); 524 assertValueAndTypeEquals(expected, 525 new FreshValueGenerator().generate( 526 new TypeToken<ListMultimap<String, Integer>>() {})); 527 assertNotInstantiable(new TypeToken<ListMultimap<EmptyEnum, String>>() {}); 528 } 529 530 public void testArrayListMultimap() { 531 assertFreshInstance(new TypeToken<ArrayListMultimap<String, ?>>() {}); 532 FreshValueGenerator generator = new FreshValueGenerator(); 533 ArrayListMultimap<String, Integer> expected = ArrayListMultimap.create(); 534 expected.put(generator.generate(String.class), generator.generate(int.class)); 535 assertValueAndTypeEquals(expected, 536 new FreshValueGenerator().generate( 537 new TypeToken<ArrayListMultimap<String, Integer>>() {})); 538 } 539 540 public void testSetMultimap() { 541 assertFreshInstance(new TypeToken<SetMultimap<String, ?>>() {}); 542 FreshValueGenerator generator = new FreshValueGenerator(); 543 SetMultimap<String, Integer> expected = LinkedHashMultimap.create(); 544 expected.put(generator.generate(String.class), generator.generate(int.class)); 545 assertValueAndTypeEquals(expected, 546 new FreshValueGenerator().generate( 547 new TypeToken<SetMultimap<String, Integer>>() {})); 548 assertNotInstantiable(new TypeToken<SetMultimap<EmptyEnum, String>>() {}); 549 } 550 551 public void testBiMap() { 552 assertFreshInstance(new TypeToken<BiMap<String, ?>>() {}); 553 FreshValueGenerator generator = new FreshValueGenerator(); 554 BiMap<String, Integer> expected = HashBiMap.create(); 555 expected.put(generator.generate(String.class), generator.generate(int.class)); 556 assertValueAndTypeEquals(expected, 557 new FreshValueGenerator().generate( 558 new TypeToken<BiMap<String, Integer>>() {})); 559 assertNotInstantiable(new TypeToken<BiMap<EmptyEnum, String>>() {}); 560 } 561 562 public void testHashBiMap() { 563 assertFreshInstance(new TypeToken<HashBiMap<String, ?>>() {}); 564 FreshValueGenerator generator = new FreshValueGenerator(); 565 HashBiMap<String, Integer> expected = HashBiMap.create(); 566 expected.put(generator.generate(String.class), generator.generate(int.class)); 567 assertValueAndTypeEquals(expected, 568 new FreshValueGenerator().generate( 569 new TypeToken<HashBiMap<String, Integer>>() {})); 570 } 571 572 public void testTable() { 573 assertFreshInstance(new TypeToken<Table<String, ?, ?>>() {}); 574 FreshValueGenerator generator = new FreshValueGenerator(); 575 Table<String, Integer, Object> expected = HashBasedTable.create(); 576 expected.put(generator.generate(String.class), generator.generate(int.class), 577 generator.generate(new TypeToken<List<String>>() {})); 578 assertValueAndTypeEquals(expected, 579 new FreshValueGenerator().generate( 580 new TypeToken<Table<String, Integer, List<String>>>() {})); 581 assertNotInstantiable(new TypeToken<Table<EmptyEnum, String, Integer>>() {}); 582 } 583 584 public void testHashBasedTable() { 585 assertFreshInstance(new TypeToken<HashBasedTable<String, ?, ?>>() {}); 586 FreshValueGenerator generator = new FreshValueGenerator(); 587 HashBasedTable<String, Integer, Object> expected = HashBasedTable.create(); 588 expected.put(generator.generate(String.class), generator.generate(int.class), 589 generator.generate(new TypeToken<List<String>>() {})); 590 assertValueAndTypeEquals(expected, 591 new FreshValueGenerator().generate( 592 new TypeToken<HashBasedTable<String, Integer, List<String>>>() {})); 593 } 594 595 public void testRowSortedTable() { 596 assertFreshInstance(new TypeToken<RowSortedTable<String, ?, ?>>() {}); 597 FreshValueGenerator generator = new FreshValueGenerator(); 598 RowSortedTable<String, Integer, Object> expected = TreeBasedTable.create(); 599 expected.put(generator.generate(String.class), generator.generate(int.class), 600 generator.generate(new TypeToken<List<String>>() {})); 601 assertValueAndTypeEquals(expected, 602 new FreshValueGenerator().generate( 603 new TypeToken<RowSortedTable<String, Integer, List<String>>>() {})); 604 assertNotInstantiable(new TypeToken<RowSortedTable<EmptyEnum, String, Integer>>() {}); 605 } 606 607 public void testTreeBasedTable() { 608 assertFreshInstance(new TypeToken<TreeBasedTable<String, ?, ?>>() {}); 609 FreshValueGenerator generator = new FreshValueGenerator(); 610 TreeBasedTable<String, Integer, Object> expected = TreeBasedTable.create(); 611 expected.put(generator.generate(String.class), generator.generate(int.class), 612 generator.generate(new TypeToken<List<String>>() {})); 613 assertValueAndTypeEquals(expected, 614 new FreshValueGenerator().generate( 615 new TypeToken<TreeBasedTable<String, Integer, List<String>>>() {})); 616 } 617 618 public void testObject() { 619 assertEquals(new FreshValueGenerator().generate(String.class), 620 new FreshValueGenerator().generate(Object.class)); 621 } 622 623 public void testEnums() { 624 assertEqualInstance(EmptyEnum.class, null); 625 assertEqualInstance(OneConstantEnum.class, OneConstantEnum.CONSTANT1); 626 assertFreshInstance(TwoConstantEnum.class); 627 assertFreshInstance(new TypeToken<Optional<OneConstantEnum>>() {}); 628 } 629 630 public void testOptional() { 631 FreshValueGenerator generator = new FreshValueGenerator(); 632 assertEquals(Optional.absent(), generator.generate(new TypeToken<Optional<String>>() {})); 633 assertEquals(Optional.of("1"), generator.generate(new TypeToken<Optional<String>>() {})); 634 // Test that the first generated instance for different Optional<T> is always absent(). 635 // Having generated Optional<String> instances doesn't prevent absent() from being generated for 636 // other Optional types. 637 assertEquals(Optional.absent(), 638 generator.generate(new TypeToken<Optional<OneConstantEnum>>() {})); 639 assertEquals(Optional.of(OneConstantEnum.CONSTANT1), 640 generator.generate(new TypeToken<Optional<OneConstantEnum>>() {})); 641 } 642 643 public void testAddSampleInstances_twoInstances() { 644 FreshValueGenerator generator = new FreshValueGenerator(); 645 generator.addSampleInstances(String.class, ImmutableList.of("a", "b")); 646 assertEquals("a", generator.generate(String.class)); 647 assertEquals("b", generator.generate(String.class)); 648 assertEquals("a", generator.generate(String.class)); 649 } 650 651 public void testAddSampleInstances_oneInstance() { 652 FreshValueGenerator generator = new FreshValueGenerator(); 653 generator.addSampleInstances(String.class, ImmutableList.of("a")); 654 assertEquals("a", generator.generate(String.class)); 655 assertEquals("a", generator.generate(String.class)); 656 } 657 658 public void testAddSampleInstances_noInstance() { 659 FreshValueGenerator generator = new FreshValueGenerator(); 660 generator.addSampleInstances(String.class, ImmutableList.<String>of()); 661 assertEquals(new FreshValueGenerator().generate(String.class), 662 generator.generate(String.class)); 663 } 664 665 public void testFreshCurrency() { 666 FreshValueGenerator generator = new FreshValueGenerator(); 667 // repeat a few times to make sure we don't stumble upon a bad Locale 668 assertNotNull(generator.generate(Currency.class)); 669 assertNotNull(generator.generate(Currency.class)); 670 assertNotNull(generator.generate(Currency.class)); 671 } 672 673 public void testNulls() throws Exception { 674 new ClassSanityTester() 675 .setDefault(Method.class, FreshValueGeneratorTest.class.getDeclaredMethod("testNulls")) 676 .testNulls(FreshValueGenerator.class); 677 } 678 679 private static void assertFreshInstances(Class<?>... types) { 680 for (Class<?> type : types) { 681 assertFreshInstance(type); 682 } 683 } 684 685 private static void assertFreshInstance(TypeToken<?> type) { 686 FreshValueGenerator generator = new FreshValueGenerator(); 687 Object value1 = generator.generate(type); 688 Object value2 = generator.generate(type); 689 assertNotNull("Null returned for " + type, value1); 690 assertFalse("Equal instance " + value1 + " returned for " + type, value1.equals(value2)); 691 } 692 693 private static <T> void assertFreshInstance(Class<T> type) { 694 assertFreshInstance(TypeToken.of(type)); 695 } 696 697 private static <T> void assertEqualInstance(Class<T> type, T value) { 698 FreshValueGenerator generator = new FreshValueGenerator(); 699 assertEquals(value, generator.generate(type)); 700 assertEquals(value, generator.generate(type)); 701 } 702 703 private enum EmptyEnum {} 704 705 private enum OneConstantEnum { 706 CONSTANT1 707 } 708 709 private enum TwoConstantEnum { 710 CONSTANT1, CONSTANT2 711 } 712 713 private static void assertValueAndTypeEquals(Object expected, Object actual) { 714 assertEquals(expected, actual); 715 assertEquals(expected.getClass(), actual.getClass()); 716 } 717 718 private static void assertNotInstantiable(TypeToken<?> type) { 719 assertNull(new FreshValueGenerator().generate(type)); 720 } 721 722 private static <E> LinkedHashSet<E> newLinkedHashSet(E element) { 723 LinkedHashSet<E> set = Sets.newLinkedHashSet(); 724 set.add(element); 725 return set; 726 } 727 728 private static <E> LinkedList<E> newLinkedList(E element) { 729 LinkedList<E> list = Lists.newLinkedList(); 730 list.add(element); 731 return list; 732 } 733 } 734