/
githubmirror
/
guava
Обзор
Документация
Войти
/
githubmirror
/
guava
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
android/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java
556 строк
23 KB
cpovirk
Tweak some tests after the migration of https://github.com/google/guava/commit/6dc6797207ef8c1282cdcf09bec77ecf6e5b8c3e.
26 июн 2026, 16:45
26 июн 2026, 16:45
1c3d864
Код
Авторство
О чём код?
/* * 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 static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.concurrent.TimeUnit.SECONDS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import com.google.common.base.CharMatcher; import com.google.common.base.Equivalence; import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.base.Splitter; import com.google.common.base.Stopwatch; import com.google.common.base.Ticker; import com.google.common.collect.BiMap; import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableClassToInstanceMap; 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.ImmutableSortedSet; import com.google.common.collect.ImmutableTable; import com.google.common.collect.ListMultimap; import com.google.common.collect.MapDifference; import com.google.common.collect.Multimap; import com.google.common.collect.Multiset; import com.google.common.collect.PeekingIterator; import com.google.common.collect.Range; import com.google.common.collect.RowSortedTable; import com.google.common.collect.SetMultimap; import com.google.common.collect.SortedMapDifference; import com.google.common.collect.SortedMultiset; import com.google.common.collect.SortedSetMultimap; import com.google.common.collect.Table; import com.google.common.io.ByteSink; import com.google.common.io.ByteSource; import com.google.common.io.CharSink; import com.google.common.io.CharSource; import com.google.common.primitives.UnsignedInteger; import com.google.common.primitives.UnsignedLong; import com.google.common.util.concurrent.AtomicDouble; import com.google.errorprone.annotations.Keep; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.GenericDeclaration; 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.BitSet; import java.util.Collection; import java.util.Comparator; import java.util.Currency; import java.util.Deque; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Locale; import java.util.Map; import java.util.NavigableMap; import java.util.NavigableSet; import java.util.PriorityQueue; import java.util.Queue; import java.util.Random; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import java.util.UUID; import java.util.concurrent.BlockingDeque; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentNavigableMap; import java.util.concurrent.DelayQueue; import java.util.concurrent.Executor; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.MatchResult; import java.util.regex.Pattern; import org.jspecify.annotations.NullUnmarked; import org.jspecify.annotations.Nullable; import org.junit.Test; /** * Unit test for {@link ArbitraryInstances}. * * @author Ben Yu */ @NullUnmarked public class ArbitraryInstancesTest { @Test public void get_primitives() { assertThat(ArbitraryInstances.get(void.class)).isNull(); assertThat(ArbitraryInstances.get(Void.class)).isNull(); assertThat(ArbitraryInstances.get(boolean.class)).isFalse(); assertThat(ArbitraryInstances.get(Boolean.class)).isFalse(); assertEquals(Character.valueOf('\0'), ArbitraryInstances.get(char.class)); assertEquals(Character.valueOf('\0'), ArbitraryInstances.get(Character.class)); assertEquals(Byte.valueOf((byte) 0), ArbitraryInstances.get(byte.class)); assertEquals(Byte.valueOf((byte) 0), ArbitraryInstances.get(Byte.class)); assertEquals(Short.valueOf((short) 0), ArbitraryInstances.get(short.class)); assertEquals(Short.valueOf((short) 0), ArbitraryInstances.get(Short.class)); assertEquals(Integer.valueOf(0), ArbitraryInstances.get(int.class)); assertEquals(Integer.valueOf(0), ArbitraryInstances.get(Integer.class)); assertEquals(Long.valueOf(0), ArbitraryInstances.get(long.class)); assertEquals(Long.valueOf(0), ArbitraryInstances.get(Long.class)); assertThat(ArbitraryInstances.get(float.class)).isEqualTo(Float.valueOf(0)); assertThat(ArbitraryInstances.get(Float.class)).isEqualTo(Float.valueOf(0)); assertThat(ArbitraryInstances.get(double.class)).isEqualTo(Double.valueOf(0)); assertThat(ArbitraryInstances.get(Double.class)).isEqualTo(Double.valueOf(0)); assertEquals(UnsignedInteger.ZERO, ArbitraryInstances.get(UnsignedInteger.class)); assertEquals(UnsignedLong.ZERO, ArbitraryInstances.get(UnsignedLong.class)); assertEquals(0, ArbitraryInstances.get(BigDecimal.class).intValue()); assertEquals(0, ArbitraryInstances.get(BigInteger.class).intValue()); assertThat(ArbitraryInstances.get(String.class)).isEqualTo(""); assertEquals("", ArbitraryInstances.get(CharSequence.class)); assertThat(ArbitraryInstances.get(TimeUnit.class)).isEqualTo(SECONDS); assertThat(ArbitraryInstances.get(Object.class)).isNotNull(); assertEquals(0, ArbitraryInstances.get(Number.class)); assertEquals(UTF_8, ArbitraryInstances.get(Charset.class)); assertThat(ArbitraryInstances.get(UUID.class)).isNotNull(); } @Test public void get_collections() { assertEquals(ImmutableSet.of().iterator(), ArbitraryInstances.get(Iterator.class)); assertFalse(ArbitraryInstances.get(PeekingIterator.class).hasNext()); assertFalse(ArbitraryInstances.get(ListIterator.class).hasNext()); assertEquals(ImmutableSet.of(), ArbitraryInstances.get(Iterable.class)); assertEquals(ImmutableSet.of(), ArbitraryInstances.get(Set.class)); assertEquals(ImmutableSet.of(), ArbitraryInstances.get(ImmutableSet.class)); assertEquals(ImmutableSortedSet.of(), ArbitraryInstances.get(SortedSet.class)); assertEquals(ImmutableSortedSet.of(), ArbitraryInstances.get(ImmutableSortedSet.class)); assertEquals(ImmutableList.of(), ArbitraryInstances.get(Collection.class)); assertEquals(ImmutableList.of(), ArbitraryInstances.get(ImmutableCollection.class)); assertEquals(ImmutableList.of(), ArbitraryInstances.get(List.class)); assertEquals(ImmutableList.of(), ArbitraryInstances.get(ImmutableList.class)); assertEquals(ImmutableMap.of(), ArbitraryInstances.get(Map.class)); assertEquals(ImmutableMap.of(), ArbitraryInstances.get(ImmutableMap.class)); assertEquals(ImmutableSortedMap.of(), ArbitraryInstances.get(SortedMap.class)); assertEquals(ImmutableSortedMap.of(), ArbitraryInstances.get(ImmutableSortedMap.class)); assertEquals(ImmutableMultiset.of(), ArbitraryInstances.get(Multiset.class)); assertEquals(ImmutableMultiset.of(), ArbitraryInstances.get(ImmutableMultiset.class)); assertTrue(ArbitraryInstances.get(SortedMultiset.class).isEmpty()); assertEquals(ImmutableMultimap.of(), ArbitraryInstances.get(Multimap.class)); assertEquals(ImmutableMultimap.of(), ArbitraryInstances.get(ImmutableMultimap.class)); assertTrue(ArbitraryInstances.get(SortedSetMultimap.class).isEmpty()); assertEquals(ImmutableTable.of(), ArbitraryInstances.get(Table.class)); assertEquals(ImmutableTable.of(), ArbitraryInstances.get(ImmutableTable.class)); assertTrue(ArbitraryInstances.get(RowSortedTable.class).isEmpty()); assertEquals(ImmutableBiMap.of(), ArbitraryInstances.get(BiMap.class)); assertEquals(ImmutableBiMap.of(), ArbitraryInstances.get(ImmutableBiMap.class)); assertTrue(ArbitraryInstances.get(ImmutableClassToInstanceMap.class).isEmpty()); assertTrue(ArbitraryInstances.get(ClassToInstanceMap.class).isEmpty()); assertTrue(ArbitraryInstances.get(ListMultimap.class).isEmpty()); assertTrue(ArbitraryInstances.get(ImmutableListMultimap.class).isEmpty()); assertTrue(ArbitraryInstances.get(SetMultimap.class).isEmpty()); assertTrue(ArbitraryInstances.get(ImmutableSetMultimap.class).isEmpty()); assertTrue(ArbitraryInstances.get(MapDifference.class).areEqual()); assertTrue(ArbitraryInstances.get(SortedMapDifference.class).areEqual()); assertEquals(Range.all(), ArbitraryInstances.get(Range.class)); assertTrue(ArbitraryInstances.get(NavigableSet.class).isEmpty()); assertTrue(ArbitraryInstances.get(NavigableMap.class).isEmpty()); assertTrue(ArbitraryInstances.get(LinkedList.class).isEmpty()); assertTrue(ArbitraryInstances.get(Deque.class).isEmpty()); assertTrue(ArbitraryInstances.get(Queue.class).isEmpty()); assertTrue(ArbitraryInstances.get(PriorityQueue.class).isEmpty()); assertTrue(ArbitraryInstances.get(BitSet.class).isEmpty()); assertTrue(ArbitraryInstances.get(TreeSet.class).isEmpty()); assertTrue(ArbitraryInstances.get(TreeMap.class).isEmpty()); assertFreshInstanceReturned( LinkedList.class, Deque.class, Queue.class, PriorityQueue.class, BitSet.class, TreeSet.class, TreeMap.class); } @Test public void get_misc() { assertThat(ArbitraryInstances.get(CharMatcher.class)).isNotNull(); assertThat(ArbitraryInstances.get(Currency.class).getCurrencyCode()).isNotNull(); assertThat(ArbitraryInstances.get(Locale.class)).isNotNull(); assertThat(ArbitraryInstances.get(Joiner.class).join(ImmutableList.of("a"))).isNotNull(); assertThat(ArbitraryInstances.get(Splitter.class).split("a,b")).isNotNull(); assertThat(ArbitraryInstances.get(com.google.common.base.Optional.class)).isAbsent(); ArbitraryInstances.get(Stopwatch.class).start(); assertThat(ArbitraryInstances.get(Ticker.class)).isNotNull(); assertFreshInstanceReturned(Random.class); assertEquals( ArbitraryInstances.get(Random.class).nextInt(), ArbitraryInstances.get(Random.class).nextInt()); } @Test public void get_concurrent() { assertTrue(ArbitraryInstances.get(BlockingDeque.class).isEmpty()); assertTrue(ArbitraryInstances.get(BlockingQueue.class).isEmpty()); assertTrue(ArbitraryInstances.get(DelayQueue.class).isEmpty()); assertTrue(ArbitraryInstances.get(SynchronousQueue.class).isEmpty()); assertTrue(ArbitraryInstances.get(PriorityBlockingQueue.class).isEmpty()); assertTrue(ArbitraryInstances.get(ConcurrentMap.class).isEmpty()); assertTrue(ArbitraryInstances.get(ConcurrentNavigableMap.class).isEmpty()); ArbitraryInstances.get(Executor.class).execute(ArbitraryInstances.get(Runnable.class)); assertThat(ArbitraryInstances.get(ThreadFactory.class)).isNotNull(); assertFreshInstanceReturned( BlockingQueue.class, BlockingDeque.class, PriorityBlockingQueue.class, DelayQueue.class, SynchronousQueue.class, ConcurrentMap.class, ConcurrentNavigableMap.class, AtomicReference.class, AtomicBoolean.class, AtomicInteger.class, AtomicLong.class, AtomicDouble.class); } @Test @SuppressWarnings("unchecked") // functor classes have no type parameters public void get_functors() { assertEquals(0, ArbitraryInstances.get(Comparator.class).compare("abc", 123)); assertTrue(ArbitraryInstances.get(Predicate.class).apply("abc")); assertTrue(ArbitraryInstances.get(Equivalence.class).equivalent(1, 1)); assertFalse(ArbitraryInstances.get(Equivalence.class).equivalent(1, 2)); } @Test @SuppressWarnings("SelfComparison") public void get_comparable() { @SuppressWarnings("unchecked") // The null value can compare with any Object Comparable<Object> comparable = ArbitraryInstances.get(Comparable.class); assertEquals(0, comparable.compareTo(comparable)); assertThat(comparable.compareTo("")).isGreaterThan(0); assertThrows(NullPointerException.class, () -> comparable.compareTo(null)); } @Test public void get_array() { assertThat(ArbitraryInstances.get(int[].class)).isEmpty(); assertThat(ArbitraryInstances.get(Object[].class)).isEmpty(); assertThat(ArbitraryInstances.get(String[].class)).isEmpty(); } @Test public void get_enum() { assertThat(ArbitraryInstances.get(EmptyEnum.class)).isNull(); assertThat(ArbitraryInstances.get(Direction.class)).isEqualTo(Direction.UP); } @Test public void get_interface() { assertThat(ArbitraryInstances.get(SomeInterface.class)).isNull(); } @Test public void get_runnable() { ArbitraryInstances.get(Runnable.class).run(); } @Test public void get_class() { assertThat(ArbitraryInstances.get(SomeAbstractClass.class)) .isSameInstanceAs(SomeAbstractClass.INSTANCE); assertThat(ArbitraryInstances.get(WithPrivateConstructor.class)) .isSameInstanceAs(WithPrivateConstructor.INSTANCE); assertThat(ArbitraryInstances.get(NoDefaultConstructor.class)).isNull(); assertThat(ArbitraryInstances.get(WithExceptionalConstructor.class)) .isSameInstanceAs(WithExceptionalConstructor.INSTANCE); assertThat(ArbitraryInstances.get(NonPublicClass.class)).isNull(); } @Test public void get_mutable() { assertEquals(0, ArbitraryInstances.get(ArrayList.class).size()); assertEquals(0, ArbitraryInstances.get(HashMap.class).size()); assertThat(ArbitraryInstances.get(Appendable.class).toString()).isEmpty(); assertThat(ArbitraryInstances.get(StringBuilder.class).toString()).isEmpty(); assertThat(ArbitraryInstances.get(StringBuffer.class).toString()).isEmpty(); assertFreshInstanceReturned( ArrayList.class, HashMap.class, Appendable.class, StringBuilder.class, StringBuffer.class, Throwable.class, Exception.class); } @Test public void get_io() throws IOException { assertEquals(-1, ArbitraryInstances.get(InputStream.class).read()); assertEquals(-1, ArbitraryInstances.get(ByteArrayInputStream.class).read()); assertEquals(-1, ArbitraryInstances.get(Readable.class).read(CharBuffer.allocate(1))); assertEquals(-1, ArbitraryInstances.get(Reader.class).read()); assertEquals(-1, ArbitraryInstances.get(StringReader.class).read()); assertEquals(0, ArbitraryInstances.get(Buffer.class).capacity()); assertEquals(0, ArbitraryInstances.get(CharBuffer.class).capacity()); assertEquals(0, ArbitraryInstances.get(ByteBuffer.class).capacity()); assertEquals(0, ArbitraryInstances.get(ShortBuffer.class).capacity()); assertEquals(0, ArbitraryInstances.get(IntBuffer.class).capacity()); assertEquals(0, ArbitraryInstances.get(LongBuffer.class).capacity()); assertEquals(0, ArbitraryInstances.get(FloatBuffer.class).capacity()); assertEquals(0, ArbitraryInstances.get(DoubleBuffer.class).capacity()); ArbitraryInstances.get(PrintStream.class).println("test"); ArbitraryInstances.get(PrintWriter.class).println("test"); assertThat(ArbitraryInstances.get(File.class)).isNotNull(); assertFreshInstanceReturned( ByteArrayOutputStream.class, OutputStream.class, Writer.class, StringWriter.class, PrintStream.class, PrintWriter.class); assertEquals(ByteSource.empty(), ArbitraryInstances.get(ByteSource.class)); assertEquals(CharSource.empty(), ArbitraryInstances.get(CharSource.class)); assertThat(ArbitraryInstances.get(ByteSink.class)).isNotNull(); assertThat(ArbitraryInstances.get(CharSink.class)).isNotNull(); } @Test public void get_reflect() { assertThat(ArbitraryInstances.get(Type.class)).isNotNull(); assertThat(ArbitraryInstances.get(AnnotatedElement.class)).isNotNull(); assertThat(ArbitraryInstances.get(GenericDeclaration.class)).isNotNull(); } @Test public void get_regex() { assertThat(ArbitraryInstances.get(Pattern.class).pattern()) .isEqualTo(Pattern.compile("").pattern()); assertEquals(0, ArbitraryInstances.get(MatchResult.class).groupCount()); } @Test public void get_usePublicConstant() { assertThat(ArbitraryInstances.get(WithPublicConstant.class)) .isSameInstanceAs(WithPublicConstant.INSTANCE); } @Test public void get_useFirstPublicConstant() { assertThat(ArbitraryInstances.get(WithPublicConstants.class)) .isSameInstanceAs(WithPublicConstants.FIRST); } @Test public void get_nullConstantIgnored() { assertThat(ArbitraryInstances.get(FirstConstantIsNull.class)) .isSameInstanceAs(FirstConstantIsNull.SECOND); } @Test public void get_constantWithGenericsNotUsed() { assertThat(ArbitraryInstances.get(WithGenericConstant.class)).isNull(); } @Test public void get_nullConstant() { assertThat(ArbitraryInstances.get(WithNullConstant.class)).isNull(); } @Test public void get_constantTypeDoesNotMatch() { assertThat(ArbitraryInstances.get(ParentClassHasConstant.class)).isNull(); } @Test public void get_nonPublicConstantNotUsed() { assertThat(ArbitraryInstances.get(NonPublicConstantIgnored.class)).isNull(); } @Test public void get_nonStaticFieldNotUsed() { assertThat(ArbitraryInstances.get(NonStaticFieldIgnored.class)).isNull(); } @Test public void get_constructorPreferredOverConstants() { assertThat(ArbitraryInstances.get(WithPublicConstructorAndConstant.class)).isNotNull(); assertTrue( ArbitraryInstances.get(WithPublicConstructorAndConstant.class) != ArbitraryInstances.get(WithPublicConstructorAndConstant.class)); } @Test public void get_nonFinalFieldNotUsed() { assertThat(ArbitraryInstances.get(NonFinalFieldIgnored.class)).isNull(); } private static void assertFreshInstanceReturned(Class<?>... mutableClasses) { for (Class<?> mutableClass : mutableClasses) { Object instance = ArbitraryInstances.get(mutableClass); assertWithMessage("Expected to return non-null for: %s", mutableClass) .that(instance) .isNotNull(); assertWithMessage("Expected to return fresh instance for: %s", mutableClass) .that(ArbitraryInstances.get(mutableClass)) .isNotSameInstanceAs(instance); } } private enum EmptyEnum {} private enum Direction { UP, DOWN } public interface SomeInterface {} public abstract static class SomeAbstractClass { public static final SomeAbstractClass INSTANCE = new SomeAbstractClass() {}; public SomeAbstractClass() {} } static class NonPublicClass { public NonPublicClass() {} } private static class WithPrivateConstructor { @Keep public static final WithPrivateConstructor INSTANCE = new WithPrivateConstructor(); } public static class NoDefaultConstructor { public NoDefaultConstructor(@SuppressWarnings("unused") int i) {} } public static class WithExceptionalConstructor { public static final WithExceptionalConstructor INSTANCE = new WithExceptionalConstructor("whatever"); public WithExceptionalConstructor() { throw new RuntimeException(); } private WithExceptionalConstructor(String unused) {} } private static class WithPublicConstant { @Keep public static final WithPublicConstant INSTANCE = new WithPublicConstant(); } private static class ParentClassHasConstant extends WithPublicConstant {} public static class WithGenericConstant<T> { public static final WithGenericConstant<String> STRING_CONSTANT = new WithGenericConstant<>(); private WithGenericConstant() {} } public static class WithNullConstant { public static final @Nullable WithNullConstant NULL = null; private WithNullConstant() {} } public static class WithPublicConstructorAndConstant { public static final WithPublicConstructorAndConstant INSTANCE = new WithPublicConstructorAndConstant(); public WithPublicConstructorAndConstant() {} } private static class WithPublicConstants { @Keep public static final WithPublicConstants FIRST = new WithPublicConstants(); // To test that we pick the first constant alphabetically @Keep public static final WithPublicConstants SECOND = new WithPublicConstants(); } private static class FirstConstantIsNull { // To test that null constant is ignored @Keep public static final @Nullable FirstConstantIsNull FIRST = null; @Keep public static final FirstConstantIsNull SECOND = new FirstConstantIsNull(); } public static class NonFinalFieldIgnored { public static NonFinalFieldIgnored instance = new NonFinalFieldIgnored(); private NonFinalFieldIgnored() {} } public static class NonPublicConstantIgnored { static final NonPublicConstantIgnored INSTANCE = new NonPublicConstantIgnored(); private NonPublicConstantIgnored() {} } public static class NonStaticFieldIgnored { // This should cause infinite recursion. But it shouldn't be used anyway. public final NonStaticFieldIgnored instance = new NonStaticFieldIgnored(); private NonStaticFieldIgnored() {} } }