1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.reflect;
18
19 import junit.framework.TestCase;
20
21 import java.lang.reflect.GenericArrayType;
22 import java.lang.reflect.ParameterizedType;
23 import java.lang.reflect.Type;
24 import java.lang.reflect.TypeVariable;
25 import java.lang.reflect.WildcardType;
26 import java.util.ArrayList;
27 import java.util.EnumSet;
28
29
30
31
32
33
34 public class TypeVisitorTest extends TestCase {
35
36 public void testVisitNull() {
37 new BaseTypeVisitor().visit(
38 ((ParameterizedType) ArrayList.class.getGenericSuperclass()).getOwnerType());
39 }
40
41 public void testVisitClass() {
42 assertVisited(String.class);
43 new BaseTypeVisitor() {
44 @Override void visitClass(Class<?> t) {}
45 }.visit(String.class);
46 }
47
48 public <T> void testVisitTypeVariable() {
49 Type type = new TypeCapture<T>() {}.capture();
50 assertVisited(type);
51 new BaseTypeVisitor() {
52 @Override void visitTypeVariable(TypeVariable<?> t) {}
53 }.visit(type);
54 }
55
56 public void testVisitWildcardType() {
57 WildcardType type = Types.subtypeOf(String.class);
58 assertVisited(type);
59 new BaseTypeVisitor() {
60 @Override void visitWildcardType(WildcardType t) {}
61 }.visit(type);
62 }
63
64 public <T> void testVisitGenericArrayType() {
65 Type type = new TypeCapture<T[]>() {}.capture();
66 assertVisited(type);
67 new BaseTypeVisitor() {
68 @Override void visitGenericArrayType(GenericArrayType t) {}
69 }.visit(type);
70 }
71
72 public <T> void testVisitParameterizedType() {
73 Type type = new TypeCapture<Iterable<T>>() {}.capture();
74 assertVisited(type);
75 new BaseTypeVisitor() {
76 @Override void visitParameterizedType(ParameterizedType t) {}
77 }.visit(type);
78 }
79
80 public <E extends Enum<E>> void testVisitRecursiveTypeBounds() {
81 Type type = new TypeCapture<EnumSet<E>>() {}.capture();
82 assertVisited(type);
83 new BaseTypeVisitor() {
84 @Override void visitParameterizedType(ParameterizedType t) {
85 visit(t.getActualTypeArguments());
86 }
87 @Override void visitTypeVariable(TypeVariable<?> t) {
88 visit(t.getBounds());
89 }
90 }.visit(type);
91 }
92
93 private static void assertVisited(Type type) {
94 TypeVisitor visitor = new BaseTypeVisitor();
95 try {
96 visitor.visit(type);
97 fail("Type not visited");
98 } catch (UnsupportedOperationException expected) {}
99 try {
100 visitor.visit(new Type[] {type});
101 fail("Type not visited");
102 } catch (UnsupportedOperationException expected) {}
103 }
104
105 private static class BaseTypeVisitor extends TypeVisitor {
106 @Override void visitTypeVariable(TypeVariable<?> t) {
107 throw new UnsupportedOperationException();
108 }
109
110 @Override void visitWildcardType(WildcardType t) {
111 throw new UnsupportedOperationException();
112 }
113
114 @Override void visitParameterizedType(ParameterizedType t) {
115 throw new UnsupportedOperationException();
116 }
117
118 @Override void visitClass(Class<?> t) {
119 throw new UnsupportedOperationException();
120 }
121
122 @Override void visitGenericArrayType(GenericArrayType t) {
123 throw new UnsupportedOperationException();
124 }
125 }
126 }