blob: b45fc03c6ed0469893413121e141a46dd99aa87a [file] [log] [blame]
/*
* Copyright (C) 2012 The Guava Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.testing;
import com.google.common.base.CharMatcher;
import com.google.common.base.Equivalence;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.base.Ticker;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableMultiset;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.ImmutableSortedMultiset;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.ImmutableTable;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.LinkedHashMultiset;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.Ordering;
import com.google.common.collect.Range;
import com.google.common.collect.RowSortedTable;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.Sets;
import com.google.common.collect.SortedMultiset;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import com.google.common.collect.TreeMultiset;
import com.google.common.primitives.UnsignedInteger;
import com.google.common.primitives.UnsignedLong;
import com.google.common.reflect.TypeToken;
import junit.framework.TestCase;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.nio.ShortBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Currency;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.NavigableMap;
import java.util.NavigableSet;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
/**
* Tests for {@link FreshValueGenerator}.
*
* @author Ben Yu
*/
public class FreshValueGeneratorTest extends TestCase {
public void testFreshInstance() {
assertFreshInstances(
String.class, CharSequence.class,
Appendable.class, StringBuffer.class, StringBuilder.class,
Pattern.class, MatchResult.class,
Number.class, int.class, Integer.class,
long.class, Long.class,
short.class, Short.class,
byte.class, Byte.class,
boolean.class, Boolean.class,
char.class, Character.class,
int[].class, Object[].class,
UnsignedInteger.class, UnsignedLong.class,
BigInteger.class, BigDecimal.class,
Throwable.class, Error.class, Exception.class, RuntimeException.class,
Charset.class, Locale.class, Currency.class,
List.class, Map.Entry.class,
Object.class,
Equivalence.class, Predicate.class, Function.class,
Comparable.class, Comparator.class, Ordering.class,
Class.class, Type.class, TypeToken.class,
TimeUnit.class, Ticker.class,
Joiner.class, Splitter.class, CharMatcher.class,
InputStream.class, ByteArrayInputStream.class,
Reader.class, Readable.class, StringReader.class,
OutputStream.class, ByteArrayOutputStream.class,
Writer.class, StringWriter.class, File.class,
Buffer.class, ByteBuffer.class, CharBuffer.class,
ShortBuffer.class, IntBuffer.class, LongBuffer.class,
FloatBuffer.class, DoubleBuffer.class,
String[].class, Object[].class, int[].class);
}
public void testStringArray() {
FreshValueGenerator generator = new FreshValueGenerator();
String[] a1 = generator.generate(String[].class);
String[] a2 = generator.generate(String[].class);
assertFalse(a1[0].equals(a2[0]));
}
public void testPrimitiveArray() {
FreshValueGenerator generator = new FreshValueGenerator();
int[] a1 = generator.generate(int[].class);
int[] a2 = generator.generate(int[].class);
assertTrue(a1[0] != a2[0]);
}
public void testRange() {
assertFreshInstance(new TypeToken<Range<String>>() {});
}
public void testImmutableList() {
assertFreshInstance(new TypeToken<ImmutableList<String>>() {});
assertValueAndTypeEquals(ImmutableList.of(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableList<String>>() {}));
assertValueAndTypeEquals(ImmutableList.of(new FreshValueGenerator().generate(int.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableList<Integer>>() {}));
assertValueAndTypeEquals(ImmutableList.of(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableList<?>>() {}));
}
public void testImmutableSet() {
assertFreshInstance(new TypeToken<ImmutableSet<String>>() {});
assertValueAndTypeEquals(ImmutableSet.of(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableSet<String>>() {}));
assertValueAndTypeEquals(ImmutableSet.of(new FreshValueGenerator().generate(Number.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableSet<Number>>() {}));
assertValueAndTypeEquals(ImmutableSet.of(new FreshValueGenerator().generate(Number.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableSet<? extends Number>>() {}));
}
public void testImmutableSortedSet() {
assertFreshInstance(new TypeToken<ImmutableSortedSet<String>>() {});
assertValueAndTypeEquals(
ImmutableSortedSet.of(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableSortedSet<String>>() {}));
}
public void testImmutableMultiset() {
assertFreshInstance(new TypeToken<ImmutableSortedSet<String>>() {});
assertValueAndTypeEquals(ImmutableMultiset.of(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableMultiset<String>>() {}));
assertValueAndTypeEquals(ImmutableMultiset.of(new FreshValueGenerator().generate(Number.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableMultiset<Number>>() {}));
assertNotInstantiable(new TypeToken<ImmutableMultiset<EmptyEnum>>() {});
}
public void testImmutableCollection() {
assertFreshInstance(new TypeToken<ImmutableCollection<String>>() {});
assertValueAndTypeEquals(ImmutableList.of(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableCollection<String>>() {}));
assertNotInstantiable(new TypeToken<ImmutableCollection<EmptyEnum>>() {});
}
public void testImmutableMap() {
assertFreshInstance(new TypeToken<ImmutableMap<String, Integer>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
assertValueAndTypeEquals(
ImmutableMap.of(generator.generate(String.class), generator.generate(int.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableMap<String, Integer>>() {}));
}
public void testImmutableSortedMap() {
assertFreshInstance(new TypeToken<ImmutableSortedMap<String, Integer>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
assertValueAndTypeEquals(
ImmutableSortedMap.of(generator.generate(String.class), generator.generate(int.class)),
new FreshValueGenerator().generate(
new TypeToken<ImmutableSortedMap<String, Integer>>() {}));
}
public void testImmutableMultimap() {
assertFreshInstance(new TypeToken<ImmutableMultimap<String, Integer>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
assertValueAndTypeEquals(
ImmutableMultimap.of(generator.generate(String.class), generator.generate(int.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableMultimap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<ImmutableMultimap<EmptyEnum, String>>() {});
}
public void testImmutableListMultimap() {
assertFreshInstance(new TypeToken<ImmutableListMultimap<String, Integer>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
assertValueAndTypeEquals(
ImmutableListMultimap.of(generator.generate(String.class), generator.generate(int.class)),
new FreshValueGenerator().generate(
new TypeToken<ImmutableListMultimap<String, Integer>>() {}));
}
public void testImmutableSetMultimap() {
assertFreshInstance(new TypeToken<ImmutableSetMultimap<String, Integer>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
assertValueAndTypeEquals(
ImmutableSetMultimap.of(generator.generate(String.class), generator.generate(int.class)),
new FreshValueGenerator().generate(
new TypeToken<ImmutableSetMultimap<String, Integer>>() {}));
}
public void testImmutableBiMap() {
assertFreshInstance(new TypeToken<ImmutableBiMap<String, Integer>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
assertValueAndTypeEquals(
ImmutableBiMap.of(generator.generate(String.class), generator.generate(int.class)),
new FreshValueGenerator().generate(
new TypeToken<ImmutableBiMap<String, Integer>>() {}));
}
public void testImmutableTable() {
assertFreshInstance(new TypeToken<ImmutableTable<String, Integer, ImmutableList<String>>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
assertValueAndTypeEquals(
ImmutableTable.of(
generator.generate(String.class), generator.generate(int.class),
generator.generate(new TypeToken<ImmutableList<String>>() {})),
new FreshValueGenerator().generate(
new TypeToken<ImmutableTable<String, Integer, ImmutableList<String>>>() {}));
}
public void testList() {
assertFreshInstance(new TypeToken<List<String>>() {});
assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<List<String>>() {}));
assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(int.class)),
new FreshValueGenerator().generate(new TypeToken<List<Integer>>() {}));
assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<List<?>>() {}));
assertNotInstantiable(new TypeToken<List<EmptyEnum>>() {});
}
public void testArrayList() {
assertFreshInstance(new TypeToken<ArrayList<String>>() {});
assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ArrayList<String>>() {}));
assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(int.class)),
new FreshValueGenerator().generate(new TypeToken<ArrayList<Integer>>() {}));
assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ArrayList<?>>() {}));
assertNotInstantiable(new TypeToken<ArrayList<EmptyEnum>>() {});
}
public void testLinkedList() {
assertFreshInstance(new TypeToken<LinkedList<String>>() {});
assertValueAndTypeEquals(newLinkedList(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<LinkedList<String>>() {}));
}
public void testSet() {
assertFreshInstance(new TypeToken<Set<String>>() {});
assertValueAndTypeEquals(
newLinkedHashSet(new FreshValueGenerator().generate(Number.class)),
new FreshValueGenerator().generate(new TypeToken<Set<? extends Number>>() {}));
assertNotInstantiable(new TypeToken<Set<EmptyEnum>>() {});
}
public void testHashSet() {
assertFreshInstance(new TypeToken<HashSet<String>>() {});
assertValueAndTypeEquals(
newLinkedHashSet(new FreshValueGenerator().generate(Number.class)),
new FreshValueGenerator().generate(new TypeToken<HashSet<? extends Number>>() {}));
}
public void testLinkedHashSet() {
assertFreshInstance(new TypeToken<LinkedHashSet<String>>() {});
assertValueAndTypeEquals(
newLinkedHashSet(new FreshValueGenerator().generate(Number.class)),
new FreshValueGenerator().generate(new TypeToken<LinkedHashSet<? extends Number>>() {}));
}
public void testTreeSet() {
assertFreshInstance(new TypeToken<TreeSet<String>>() {});
TreeSet<String> expected = Sets.newTreeSet();
expected.add(new FreshValueGenerator().generate(String.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<TreeSet<? extends CharSequence>>() {}));
assertNotInstantiable(new TypeToken<TreeSet<EmptyEnum>>() {});
}
public void testSortedSet() {
assertFreshInstance(new TypeToken<SortedSet<String>>() {});
TreeSet<String> expected = Sets.newTreeSet();
expected.add(new FreshValueGenerator().generate(String.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<SortedSet<String>>() {}));
assertNotInstantiable(new TypeToken<SortedSet<EmptyEnum>>() {});
}
public void testNavigableSet() {
assertFreshInstance(new TypeToken<NavigableSet<String>>() {});
TreeSet<String> expected = Sets.newTreeSet();
expected.add(new FreshValueGenerator().generate(String.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<NavigableSet<String>>() {}));
assertNotInstantiable(new TypeToken<NavigableSet<EmptyEnum>>() {});
}
public void testMultiset() {
assertFreshInstance(new TypeToken<Multiset<String>>() {});
Multiset<String> expected = HashMultiset.create();
expected.add(new FreshValueGenerator().generate(String.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<Multiset<String>>() {}));
assertNotInstantiable(new TypeToken<Multiset<EmptyEnum>>() {});
}
public void testSortedMultiset() {
assertFreshInstance(new TypeToken<SortedMultiset<String>>() {});
SortedMultiset<String> expected = TreeMultiset.create();
expected.add(new FreshValueGenerator().generate(String.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<SortedMultiset<String>>() {}));
assertNotInstantiable(new TypeToken<Multiset<EmptyEnum>>() {});
}
public void testHashMultiset() {
assertFreshInstance(new TypeToken<HashMultiset<String>>() {});
HashMultiset<String> expected = HashMultiset.create();
expected.add(new FreshValueGenerator().generate(String.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<HashMultiset<String>>() {}));
}
public void testLinkedHashMultiset() {
assertFreshInstance(new TypeToken<LinkedHashMultiset<String>>() {});
LinkedHashMultiset<String> expected = LinkedHashMultiset.create();
expected.add(new FreshValueGenerator().generate(String.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<LinkedHashMultiset<String>>() {}));
}
public void testTreeMultiset() {
assertFreshInstance(new TypeToken<TreeMultiset<String>>() {});
TreeMultiset<String> expected = TreeMultiset.create();
expected.add(new FreshValueGenerator().generate(String.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<TreeMultiset<String>>() {}));
}
public void testImmutableSortedMultiset() {
assertFreshInstance(new TypeToken<ImmutableSortedMultiset<String>>() {});
assertValueAndTypeEquals(
ImmutableSortedMultiset.of(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<ImmutableSortedMultiset<String>>() {}));
assertNotInstantiable(new TypeToken<Multiset<EmptyEnum>>() {});
}
public void testCollection() {
assertFreshInstance(new TypeToken<Collection<String>>() {});
assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<Collection<String>>() {}));
assertNotInstantiable(new TypeToken<Collection<EmptyEnum>>() {});
}
public void testIterable() {
assertFreshInstance(new TypeToken<Iterable<String>>() {});
assertValueAndTypeEquals(Lists.newArrayList(new FreshValueGenerator().generate(String.class)),
new FreshValueGenerator().generate(new TypeToken<Iterable<String>>() {}));
assertNotInstantiable(new TypeToken<Iterable<EmptyEnum>>() {});
}
public void testMap() {
assertFreshInstance(new TypeToken<Map<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
Map<String, Integer> expected = Maps.newLinkedHashMap();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<Map<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<Map<EmptyEnum, String>>() {});
}
public void testHashMap() {
assertFreshInstance(new TypeToken<HashMap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
HashMap<String, Integer> expected = Maps.newLinkedHashMap();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<HashMap<String, Integer>>() {}));
}
public void testLinkedHashMap() {
assertFreshInstance(new TypeToken<LinkedHashMap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
LinkedHashMap<String, Integer> expected = Maps.newLinkedHashMap();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<LinkedHashMap<String, Integer>>() {}));
}
public void testTreeMap() {
assertFreshInstance(new TypeToken<TreeMap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
TreeMap<String, Integer> expected = Maps.newTreeMap();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<TreeMap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<LinkedHashSet<EmptyEnum>>() {});
}
public void testSortedMap() {
assertFreshInstance(new TypeToken<SortedMap<?, String>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
TreeMap<String, Integer> expected = Maps.newTreeMap();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<SortedMap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<SortedMap<EmptyEnum, String>>() {});
}
public void testNavigableMap() {
assertFreshInstance(new TypeToken<NavigableMap<?, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
TreeMap<String, Integer> expected = Maps.newTreeMap();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<NavigableMap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<NavigableMap<EmptyEnum, String>>() {});
}
public void testConcurrentMap() {
assertFreshInstance(new TypeToken<ConcurrentMap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
ConcurrentMap<String, Integer> expected = Maps.newConcurrentMap();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<ConcurrentMap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<ConcurrentMap<EmptyEnum, String>>() {});
}
public void testMultimap() {
assertFreshInstance(new TypeToken<Multimap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
Multimap<String, Integer> expected = ArrayListMultimap.create();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<Multimap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<Multimap<EmptyEnum, String>>() {});
}
public void testHashMultimap() {
assertFreshInstance(new TypeToken<HashMultimap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
HashMultimap<String, Integer> expected = HashMultimap.create();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(new TypeToken<HashMultimap<String, Integer>>() {}));
}
public void testLinkedHashMultimap() {
assertFreshInstance(new TypeToken<LinkedHashMultimap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
LinkedHashMultimap<String, Integer> expected = LinkedHashMultimap.create();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<LinkedHashMultimap<String, Integer>>() {}));
}
public void testListMultimap() {
assertFreshInstance(new TypeToken<ListMultimap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
ListMultimap<String, Integer> expected = ArrayListMultimap.create();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<ListMultimap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<ListMultimap<EmptyEnum, String>>() {});
}
public void testArrayListMultimap() {
assertFreshInstance(new TypeToken<ArrayListMultimap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
ArrayListMultimap<String, Integer> expected = ArrayListMultimap.create();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<ArrayListMultimap<String, Integer>>() {}));
}
public void testSetMultimap() {
assertFreshInstance(new TypeToken<SetMultimap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
SetMultimap<String, Integer> expected = LinkedHashMultimap.create();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<SetMultimap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<SetMultimap<EmptyEnum, String>>() {});
}
public void testBiMap() {
assertFreshInstance(new TypeToken<BiMap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
BiMap<String, Integer> expected = HashBiMap.create();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<BiMap<String, Integer>>() {}));
assertNotInstantiable(new TypeToken<BiMap<EmptyEnum, String>>() {});
}
public void testHashBiMap() {
assertFreshInstance(new TypeToken<HashBiMap<String, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
HashBiMap<String, Integer> expected = HashBiMap.create();
expected.put(generator.generate(String.class), generator.generate(int.class));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<HashBiMap<String, Integer>>() {}));
}
public void testTable() {
assertFreshInstance(new TypeToken<Table<String, ?, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
Table<String, Integer, Object> expected = HashBasedTable.create();
expected.put(generator.generate(String.class), generator.generate(int.class),
generator.generate(new TypeToken<List<String>>() {}));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<Table<String, Integer, List<String>>>() {}));
assertNotInstantiable(new TypeToken<Table<EmptyEnum, String, Integer>>() {});
}
public void testHashBasedTable() {
assertFreshInstance(new TypeToken<HashBasedTable<String, ?, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
HashBasedTable<String, Integer, Object> expected = HashBasedTable.create();
expected.put(generator.generate(String.class), generator.generate(int.class),
generator.generate(new TypeToken<List<String>>() {}));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<HashBasedTable<String, Integer, List<String>>>() {}));
}
public void testRowSortedTable() {
assertFreshInstance(new TypeToken<RowSortedTable<String, ?, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
RowSortedTable<String, Integer, Object> expected = TreeBasedTable.create();
expected.put(generator.generate(String.class), generator.generate(int.class),
generator.generate(new TypeToken<List<String>>() {}));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<RowSortedTable<String, Integer, List<String>>>() {}));
assertNotInstantiable(new TypeToken<RowSortedTable<EmptyEnum, String, Integer>>() {});
}
public void testTreeBasedTable() {
assertFreshInstance(new TypeToken<TreeBasedTable<String, ?, ?>>() {});
FreshValueGenerator generator = new FreshValueGenerator();
TreeBasedTable<String, Integer, Object> expected = TreeBasedTable.create();
expected.put(generator.generate(String.class), generator.generate(int.class),
generator.generate(new TypeToken<List<String>>() {}));
assertValueAndTypeEquals(expected,
new FreshValueGenerator().generate(
new TypeToken<TreeBasedTable<String, Integer, List<String>>>() {}));
}
public void testObject() {
assertEquals(new FreshValueGenerator().generate(String.class),
new FreshValueGenerator().generate(Object.class));
}
public void testEnums() {
assertEqualInstance(EmptyEnum.class, null);
assertEqualInstance(OneConstantEnum.class, OneConstantEnum.CONSTANT1);
assertFreshInstance(TwoConstantEnum.class);
assertFreshInstance(new TypeToken<Optional<OneConstantEnum>>() {});
}
public void testOptional() {
FreshValueGenerator generator = new FreshValueGenerator();
assertEquals(Optional.absent(), generator.generate(new TypeToken<Optional<String>>() {}));
assertEquals(Optional.of("1"), generator.generate(new TypeToken<Optional<String>>() {}));
// Test that the first generated instance for different Optional<T> is always absent().
// Having generated Optional<String> instances doesn't prevent absent() from being generated for
// other Optional types.
assertEquals(Optional.absent(),
generator.generate(new TypeToken<Optional<OneConstantEnum>>() {}));
assertEquals(Optional.of(OneConstantEnum.CONSTANT1),
generator.generate(new TypeToken<Optional<OneConstantEnum>>() {}));
}
public void testAddSampleInstances_twoInstances() {
FreshValueGenerator generator = new FreshValueGenerator();
generator.addSampleInstances(String.class, ImmutableList.of("a", "b"));
assertEquals("a", generator.generate(String.class));
assertEquals("b", generator.generate(String.class));
assertEquals("a", generator.generate(String.class));
}
public void testAddSampleInstances_oneInstance() {
FreshValueGenerator generator = new FreshValueGenerator();
generator.addSampleInstances(String.class, ImmutableList.of("a"));
assertEquals("a", generator.generate(String.class));
assertEquals("a", generator.generate(String.class));
}
public void testAddSampleInstances_noInstance() {
FreshValueGenerator generator = new FreshValueGenerator();
generator.addSampleInstances(String.class, ImmutableList.<String>of());
assertEquals(new FreshValueGenerator().generate(String.class),
generator.generate(String.class));
}
public void testFreshCurrency() {
FreshValueGenerator generator = new FreshValueGenerator();
// repeat a few times to make sure we don't stumble upon a bad Locale
assertNotNull(generator.generate(Currency.class));
assertNotNull(generator.generate(Currency.class));
assertNotNull(generator.generate(Currency.class));
}
public void testNulls() throws Exception {
new ClassSanityTester()
.setDefault(Method.class, FreshValueGeneratorTest.class.getDeclaredMethod("testNulls"))
.testNulls(FreshValueGenerator.class);
}
private static void assertFreshInstances(Class<?>... types) {
for (Class<?> type : types) {
assertFreshInstance(type);
}
}
private static void assertFreshInstance(TypeToken<?> type) {
FreshValueGenerator generator = new FreshValueGenerator();
Object value1 = generator.generate(type);
Object value2 = generator.generate(type);
assertNotNull("Null returned for " + type, value1);
assertFalse("Equal instance " + value1 + " returned for " + type, value1.equals(value2));
}
private static <T> void assertFreshInstance(Class<T> type) {
assertFreshInstance(TypeToken.of(type));
}
private static <T> void assertEqualInstance(Class<T> type, T value) {
FreshValueGenerator generator = new FreshValueGenerator();
assertEquals(value, generator.generate(type));
assertEquals(value, generator.generate(type));
}
private enum EmptyEnum {}
private enum OneConstantEnum {
CONSTANT1
}
private enum TwoConstantEnum {
CONSTANT1, CONSTANT2
}
private static void assertValueAndTypeEquals(Object expected, Object actual) {
assertEquals(expected, actual);
assertEquals(expected.getClass(), actual.getClass());
}
private static void assertNotInstantiable(TypeToken<?> type) {
assertNull(new FreshValueGenerator().generate(type));
}
private static <E> LinkedHashSet<E> newLinkedHashSet(E element) {
LinkedHashSet<E> set = Sets.newLinkedHashSet();
set.add(element);
return set;
}
private static <E> LinkedList<E> newLinkedList(E element) {
LinkedList<E> list = Lists.newLinkedList();
list.add(element);
return list;
}
}