aboutsummaryrefslogtreecommitdiffstats
path: root/guava-tests/test/com/google/common/reflect/TypeTokenResolutionTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava-tests/test/com/google/common/reflect/TypeTokenResolutionTest.java')
-rw-r--r--guava-tests/test/com/google/common/reflect/TypeTokenResolutionTest.java547
1 files changed, 0 insertions, 547 deletions
diff --git a/guava-tests/test/com/google/common/reflect/TypeTokenResolutionTest.java b/guava-tests/test/com/google/common/reflect/TypeTokenResolutionTest.java
deleted file mode 100644
index 6d51494..0000000
--- a/guava-tests/test/com/google/common/reflect/TypeTokenResolutionTest.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * Copyright (C) 2009 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.reflect;
-
-import static org.truth0.Truth.ASSERT;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-
-import junit.framework.TestCase;
-
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.lang.reflect.WildcardType;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Unit test for {@link TypeToken} and {@link TypeResolver}.
- *
- * @author Ben Yu
- */
-public class TypeTokenResolutionTest extends TestCase {
-
- private static class Foo<A, B> {
-
- Class<? super A> getClassA() {
- return new TypeToken<A>(getClass()) {}.getRawType();
- }
-
- Class<? super B> getClassB() {
- return new TypeToken<B>(getClass()) {}.getRawType();
- }
-
- Class<? super A[]> getArrayClassA() {
- return new TypeToken<A[]>(getClass()) {}.getRawType();
- }
-
- Type getArrayTypeA() {
- return new TypeToken<A[]>(getClass()) {}.getType();
- }
-
- Class<? super B[]> getArrayClassB() {
- return new TypeToken<B[]>(getClass()) {}.getRawType();
- }
- }
-
- public void testSimpleTypeToken() {
- Foo<String, Integer> foo = new Foo<String, Integer>() {};
- assertEquals(String.class, foo.getClassA());
- assertEquals(Integer.class, foo.getClassB());
- assertEquals(String[].class, foo.getArrayClassA());
- assertEquals(Integer[].class, foo.getArrayClassB());
- }
-
- public void testCompositeTypeToken() {
- Foo<String[], List<int[]>> foo = new Foo<String[], List<int[]>>() {};
- assertEquals(String[].class, foo.getClassA());
- assertEquals(List.class, foo.getClassB());
- assertEquals(String[][].class, foo.getArrayClassA());
- assertEquals(List[].class, foo.getArrayClassB());
- }
-
- private static class StringFoo<T> extends Foo<String, T> {}
-
- public void testPartialSpecialization() {
- StringFoo<Integer> foo = new StringFoo<Integer>() {};
- assertEquals(String.class, foo.getClassA());
- assertEquals(Integer.class, foo.getClassB());
- assertEquals(String[].class, foo.getArrayClassA());
- assertEquals(Integer[].class, foo.getArrayClassB());
- assertEquals(new TypeToken<String[]>() {}.getType(), foo.getArrayTypeA());
- }
-
- public void testTypeArgNotFound() {
- StringFoo<Integer> foo = new StringFoo<Integer>();
- assertEquals(String.class, foo.getClassA());
- assertEquals(String[].class, foo.getArrayClassA());
- assertEquals(Object.class, foo.getClassB());
- assertEquals(Object[].class, foo.getArrayClassB());
- }
-
- private static abstract class Bar<T> {}
-
- private abstract static class Parameterized<O, T, P> {
- ParameterizedType parameterizedType() {
- return new ParameterizedType() {
- @Override public Type[] getActualTypeArguments() {
- return new Type[]{new TypeCapture<P>() {}.capture()};
- }
- @Override public Type getOwnerType() {
- return new TypeCapture<O>() {}.capture();
- }
- @Override public Type getRawType() {
- return new TypeCapture<T>() {}.capture();
- }
- };
- }
- }
-
- public void testResolveType_parameterizedType() {
- @SuppressWarnings("rawtypes") // trying to test raw type
- Parameterized<?, ?, ?> parameterized =
- new Parameterized<TypeTokenResolutionTest, Bar, String>() {};
- TypeResolver typeResolver = TypeResolver.accordingTo(parameterized.getClass());
- ParameterizedType resolved = (ParameterizedType) typeResolver.resolveType(
- parameterized.parameterizedType());
- assertEquals(TypeTokenResolutionTest.class, resolved.getOwnerType());
- assertEquals(Bar.class, resolved.getRawType());
- ASSERT.that(resolved.getActualTypeArguments()).has().item(String.class);
- }
-
- private interface StringListPredicate extends Predicate<List<String>> {}
-
- private interface IntegerSupplier extends Supplier<Integer> {}
-
- // Intentionally duplicate the Predicate interface to test that it won't cause
- // exceptions
- private interface IntegerStringFunction extends IntegerSupplier,
- Predicate<List<String>>, StringListPredicate {}
-
- public void testGenericInterface() {
- // test the 1st generic interface on the class
- Type fType = Supplier.class.getTypeParameters()[0];
- assertEquals(Integer.class,
- TypeToken.of(IntegerStringFunction.class).resolveType(fType)
- .getRawType());
-
- // test the 2nd generic interface on the class
- Type predicateParameterType = Predicate.class.getTypeParameters()[0];
- assertEquals(new TypeToken<List<String>>() {}.getType(),
- TypeToken.of(IntegerStringFunction.class).resolveType(predicateParameterType)
- .getType());
- }
-
- private static abstract class StringIntegerFoo extends Foo<String, Integer> {}
-
- public void testConstructor_typeArgsResolvedFromAncestorClass() {
- assertEquals(String.class, new StringIntegerFoo() {}.getClassA());
- assertEquals(Integer.class, new StringIntegerFoo() {}.getClassB());
- }
-
- private static class Owner<T> {
- private static abstract class Nested<X> {
- Class<? super X> getTypeArgument() {
- return new TypeToken<X>(getClass()) {}.getRawType();
- }
- }
-
- private abstract class Inner<Y> extends Nested<Y> {
- Class<? super T> getOwnerType() {
- return new TypeToken<T>(getClass()) {}.getRawType();
- }
- }
- }
-
- public void testResolveNestedClass() {
- assertEquals(String.class, new Owner.Nested<String>() {}.getTypeArgument());
- }
-
- public void testResolveInnerClass() {
- assertEquals(String.class,
- new Owner<Integer>().new Inner<String>() {}.getTypeArgument());
- }
-
- public void testResolveOwnerClass() {
- assertEquals(Integer.class,
- new Owner<Integer>().new Inner<String>() {}.getOwnerType());
- }
-
- private static class Mapping<F, T> {
-
- final Type f = new TypeToken<F>(getClass()) {}.getType();
- final Type t = new TypeToken<T>(getClass()) {}.getType();
-
- Type getFromType() {
- return new TypeToken<F>(getClass()) {}.getType();
- }
-
- Type getToType() {
- return new TypeToken<T>(getClass()) {}.getType();
- }
-
- Mapping<T, F> flip() {
- return new Mapping<T, F>() {};
- }
-
- Mapping<F, T> selfMapping() {
- return new Mapping<F, T>() {};
- }
- }
-
- public void testCyclicMapping() {
- Mapping<Integer, String> mapping = new Mapping<Integer, String>();
- assertEquals(mapping.f, mapping.getFromType());
- assertEquals(mapping.t, mapping.getToType());
- assertEquals(mapping.f, mapping.flip().getFromType());
- assertEquals(mapping.t, mapping.flip().getToType());
- assertEquals(mapping.f, mapping.selfMapping().getFromType());
- assertEquals(mapping.t, mapping.selfMapping().getToType());
- }
-
- private static class ParameterizedOuter<T> {
-
- @SuppressWarnings("unused") // used by reflection
- public Inner field;
-
- class Inner {}
- }
-
- public void testInnerClassWithParameterizedOwner() throws Exception {
- Type fieldType = ParameterizedOuter.class.getField("field")
- .getGenericType();
- assertEquals(fieldType,
- TypeToken.of(ParameterizedOuter.class).resolveType(fieldType).getType());
- }
-
- private interface StringIterable extends Iterable<String> {}
-
- public void testResolveType() {
- assertEquals(String.class, TypeToken.of(this.getClass()).resolveType(String.class).getType());
- assertEquals(String.class,
- TypeToken.of(StringIterable.class)
- .resolveType(Iterable.class.getTypeParameters()[0]).getType());
- assertEquals(String.class,
- TypeToken.of(StringIterable.class)
- .resolveType(Iterable.class.getTypeParameters()[0]).getType());
- try {
- TypeToken.of(this.getClass()).resolveType(null);
- fail();
- } catch (NullPointerException expected) {}
- }
-
- public void testConextIsParameterizedType() throws Exception {
- class Context {
- @SuppressWarnings("unused") // used by reflection
- Map<String, Integer> returningMap() {
- throw new AssertionError();
- }
- }
- Type context = Context.class.getDeclaredMethod("returningMap")
- .getGenericReturnType();
- Type keyType = Map.class.getTypeParameters()[0];
- Type valueType = Map.class.getTypeParameters()[1];
-
- // context is parameterized type
- assertEquals(String.class, TypeToken.of(context).resolveType(keyType).getType());
- assertEquals(Integer.class,
- TypeToken.of(context).resolveType(valueType).getType());
-
- // context is type variable
- assertEquals(keyType, TypeToken.of(keyType).resolveType(keyType).getType());
- assertEquals(valueType, TypeToken.of(valueType).resolveType(valueType).getType());
- }
-
- private static final class GenericArray<T> {
- final Type t = new TypeToken<T>(getClass()) {}.getType();
- final Type array = new TypeToken<T[]>(getClass()) {}.getType();
- }
-
- public void testGenericArrayType() {
- GenericArray<?> genericArray = new GenericArray<Integer>();
- assertEquals(GenericArray.class.getTypeParameters()[0], genericArray.t);
- assertEquals(Types.newArrayType(genericArray.t),
- genericArray.array);
- }
-
- public void testClassWrapper() {
- TypeToken<String> typeExpression = TypeToken.of(String.class);
- assertEquals(String.class, typeExpression.getType());
- assertEquals(String.class, typeExpression.getRawType());
- }
-
- private static class Red<A> {
- private class Orange {
- Class<?> getClassA() {
- return new TypeToken<A>(getClass()) {}.getRawType();
- }
-
- Red<A> getSelfB() {
- return Red.this;
- }
- }
-
- Red<A> getSelfA() {
- return this;
- }
-
- private class Yellow<B> extends Red<B>.Orange {
- Yellow(Red<B> red) {
- red.super();
- }
-
- Class<?> getClassB() {
- return new TypeToken<B>(getClass()) {}.getRawType();
- }
-
- Red<A> getA() {
- return getSelfA();
- }
-
- Red<B> getB() {
- return getSelfB();
- }
- }
-
- Class<?> getClassDirect() {
- return new TypeToken<A>(getClass()) {}.getRawType();
- }
- }
-
- public void test1() {
- Red<String> redString = new Red<String>() {};
- Red<Integer> redInteger = new Red<Integer>() {};
- assertEquals(String.class, redString.getClassDirect());
- assertEquals(Integer.class, redInteger.getClassDirect());
-
- Red<String>.Yellow<Integer> yellowInteger =
- redString.new Yellow<Integer>(redInteger) {};
- assertEquals(Integer.class, yellowInteger.getClassA());
- assertEquals(Integer.class, yellowInteger.getClassB());
- assertEquals(String.class, yellowInteger.getA().getClassDirect());
- assertEquals(Integer.class, yellowInteger.getB().getClassDirect());
- }
-
- public void test2() {
- Red<String> redString = new Red<String>();
- Red<Integer> redInteger = new Red<Integer>();
- Red<String>.Yellow<Integer> yellowInteger =
- redString.new Yellow<Integer>(redInteger) {};
- assertEquals(Integer.class, yellowInteger.getClassA());
- assertEquals(Integer.class, yellowInteger.getClassB());
- }
-
- private static <T> Type staticMethodWithLocalClass() {
- class MyLocalClass {
- Type getType() {
- return new TypeToken<T>(getClass()) {}.getType();
- }
- }
- return new MyLocalClass().getType();
- }
-
- public void testLocalClassInsideStaticMethod() {
- assertNotNull(staticMethodWithLocalClass());
- }
-
- public void testLocalClassInsideNonStaticMethod() {
- class MyLocalClass<T> {
- Type getType() {
- return new TypeToken<T>(getClass()) {}.getType();
- }
- }
- assertNotNull(new MyLocalClass<String>().getType());
- }
-
- private static <T> Type staticMethodWithAnonymousClass() {
- return new Object() {
- Type getType() {
- return new TypeToken<T>(getClass()) {}.getType();
- }
- }.getType();
- }
-
- public void testAnonymousClassInsideStaticMethod() {
- assertNotNull(staticMethodWithAnonymousClass());
- }
-
- public void testAnonymousClassInsideNonStaticMethod() {
- assertNotNull(new Object() {
- Type getType() {
- return new TypeToken<Object>() {}.getType();
- }
- }.getType());
- }
-
- public void testStaticContext() {
- assertEquals(Map.class, mapType().getRawType());
- }
-
- private abstract static class Holder<T> {
- Type getContentType() {
- return new TypeToken<T>(getClass()) {}.getType();
- }
- }
-
- public void testResolvePrimitiveArrayType() {
- assertEquals(new TypeToken<int[]>() {}.getType(),
- new Holder<int[]>() {}.getContentType());
- assertEquals(new TypeToken<int[][]> () {}.getType(),
- new Holder<int[][]>() {}.getContentType());
- }
-
- public void testResolveToGenericArrayType() {
- GenericArrayType arrayType = (GenericArrayType)
- new Holder<List<int[][]>[]>() {}.getContentType();
- ParameterizedType listType = (ParameterizedType)
- arrayType.getGenericComponentType();
- assertEquals(List.class, listType.getRawType());
- assertEquals(Types.newArrayType(int[].class),
- listType.getActualTypeArguments()[0]);
- }
-
- private abstract class WithGenericBound<A> {
-
- @SuppressWarnings("unused")
- public <B extends A> void withTypeVariable(List<B> list) {}
-
- @SuppressWarnings("unused")
- public <E extends Enum<E>> void withRecursiveBound(List<E> list) {}
-
- @SuppressWarnings("unused")
- public <K extends List<V>, V extends List<K>> void withMutualRecursiveBound(
- List<Map<K, V>> list) {}
-
- @SuppressWarnings("unused")
- void withWildcardLowerBound(List<? super A> list) {}
-
- @SuppressWarnings("unused")
- void withWildcardUpperBound(List<? extends A> list) {}
-
- Type getTargetType(String methodName) throws Exception {
- ParameterizedType parameterType = (ParameterizedType)
- WithGenericBound.class.getDeclaredMethod(methodName, List.class)
- .getGenericParameterTypes()[0];
- parameterType = (ParameterizedType)
- TypeToken.of(this.getClass()).resolveType(parameterType).getType();
- return parameterType.getActualTypeArguments()[0];
- }
- }
-
- public void testWithGenericBoundInTypeVariable() throws Exception {
- TypeVariable<?> typeVariable = (TypeVariable<?>)
- new WithGenericBound<String>() {}.getTargetType("withTypeVariable");
- assertEquals(String.class, typeVariable.getBounds()[0]);
- }
-
- public void testWithRecursiveBoundInTypeVariable() throws Exception {
- TypeVariable<?> typeVariable = (TypeVariable<?>)
- new WithGenericBound<String>() {}.getTargetType("withRecursiveBound");
- assertEquals(Types.newParameterizedType(Enum.class, typeVariable),
- typeVariable.getBounds()[0]);
- }
-
- public void testWithMutualRecursiveBoundInTypeVariable() throws Exception {
- ParameterizedType paramType = (ParameterizedType)
- new WithGenericBound<String>() {}
- .getTargetType("withMutualRecursiveBound");
- TypeVariable<?> k = (TypeVariable<?>) paramType.getActualTypeArguments()[0];
- TypeVariable<?> v = (TypeVariable<?>) paramType.getActualTypeArguments()[1];
- assertEquals(Types.newParameterizedType(List.class, v), k.getBounds()[0]);
- assertEquals(Types.newParameterizedType(List.class, k), v.getBounds()[0]);
- }
-
- public void testWithGenericLowerBoundInWildcard() throws Exception {
- WildcardType wildcardType = (WildcardType)
- new WithGenericBound<String>() {}
- .getTargetType("withWildcardLowerBound");
- assertEquals(String.class, wildcardType.getLowerBounds()[0]);
- }
-
- public void testWithGenericUpperBoundInWildcard() throws Exception {
- WildcardType wildcardType = (WildcardType)
- new WithGenericBound<String>() {}
- .getTargetType("withWildcardUpperBound");
- assertEquals(String.class, wildcardType.getUpperBounds()[0]);
- }
-
- public void testInterfaceTypeParameterResolution() throws Exception {
- assertEquals(String.class,
- TypeToken.of(new TypeToken<ArrayList<String>>() {}.getType())
- .resolveType(List.class.getTypeParameters()[0]).getType());
- }
-
- private static TypeToken<Map<Object, Object>> mapType() {
- return new TypeToken<Map<Object, Object>>() {};
- }
-
- // Looks like recursive, but legit.
- private interface WithFalseRecursiveType<K, V> {
- WithFalseRecursiveType<List<V>, String> keyShouldNotResolveToStringList();
- WithFalseRecursiveType<List<K>, List<V>> shouldNotCauseInfiniteLoop();
- SubTypeOfWithFalseRecursiveType<List<V>, List<K>> evenSubTypeWorks();
- }
-
- private interface SubTypeOfWithFalseRecursiveType<K1, V1>
- extends WithFalseRecursiveType<List<K1>, List<V1>> {
- SubTypeOfWithFalseRecursiveType<V1, K1> revertKeyAndValueTypes();
- }
-
- public void testFalseRecursiveType_mappingOnTheSameDeclarationNotUsed() {
- Type returnType = genericReturnType(
- WithFalseRecursiveType.class, "keyShouldNotResolveToStringList");
- TypeToken<?> keyType = TypeToken.of(returnType)
- .resolveType(WithFalseRecursiveType.class.getTypeParameters()[0]);
- assertEquals("java.util.List<V>", keyType.getType().toString());
- }
-
- public void testFalseRecursiveType_notRealRecursiveMapping() {
- Type returnType = genericReturnType(
- WithFalseRecursiveType.class, "shouldNotCauseInfiniteLoop");
- TypeToken<?> keyType = TypeToken.of(returnType)
- .resolveType(WithFalseRecursiveType.class.getTypeParameters()[0]);
- assertEquals("java.util.List<K>", keyType.getType().toString());
- }
-
- public void testFalseRecursiveType_referenceOfSubtypeDoesNotConfuseMe() {
- Type returnType = genericReturnType(
- WithFalseRecursiveType.class, "evenSubTypeWorks");
- TypeToken<?> keyType = TypeToken.of(returnType)
- .resolveType(WithFalseRecursiveType.class.getTypeParameters()[0]);
- assertEquals("java.util.List<java.util.List<V>>", keyType.getType().toString());
- }
-
- public void testFalseRecursiveType_intermediaryTypeMappingDoesNotConfuseMe() {
- Type returnType = genericReturnType(
- SubTypeOfWithFalseRecursiveType.class, "revertKeyAndValueTypes");
- TypeToken<?> keyType = TypeToken.of(returnType)
- .resolveType(WithFalseRecursiveType.class.getTypeParameters()[0]);
- assertEquals("java.util.List<K1>", keyType.getType().toString());
- }
-
- private static Type genericReturnType(Class<?> cls, String methodName) {
- try {
- return cls.getMethod(methodName).getGenericReturnType();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-}