1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.grouplens.grapht.reflect;
21
22 import org.apache.commons.lang3.SerializationException;
23 import org.apache.commons.lang3.SerializationUtils;
24 import org.grouplens.grapht.annotation.AliasFor;
25 import org.grouplens.grapht.annotation.AllowUnqualifiedMatch;
26 import org.grouplens.grapht.annotation.AnnotationBuilder;
27 import org.junit.Test;
28
29 import javax.annotation.Nullable;
30 import javax.inject.Qualifier;
31 import java.io.InvalidObjectException;
32 import java.lang.annotation.Annotation;
33 import java.lang.annotation.Retention;
34 import java.lang.annotation.RetentionPolicy;
35
36 import static org.hamcrest.Matchers.equalTo;
37 import static org.hamcrest.Matchers.instanceOf;
38 import static org.hamcrest.Matchers.not;
39 import static org.junit.Assert.assertThat;
40 import static org.junit.Assert.fail;
41
42 public class QualifiersTest {
43 @Qualifier
44 @Retention(RetentionPolicy.RUNTIME)
45 public static @interface Qual {}
46
47 @Qualifier
48 @Retention(RetentionPolicy.RUNTIME)
49 @AliasFor(Qual.class)
50 public static @interface AQual {}
51
52 @Qualifier
53 @Retention(RetentionPolicy.RUNTIME)
54 @AliasFor(AQual.class)
55 public static @interface AAQual {}
56
57 @Qualifier
58 @Retention(RetentionPolicy.RUNTIME)
59 @AliasFor(Qual.class)
60 public static @interface BadAlias {
61
62 String value();
63 }
64
65 @Qualifier
66 @Retention(RetentionPolicy.RUNTIME)
67 @AliasFor(Circle2.class)
68 public static @interface Circle1 {}
69
70 @Qualifier
71 @Retention(RetentionPolicy.RUNTIME)
72 @AliasFor(Circle1.class)
73 public static @interface Circle2 {}
74
75 @Qualifier
76 @Retention(RetentionPolicy.RUNTIME)
77 public static @interface VQual {
78 String value();
79 }
80 @Qualifier
81 @Retention(RetentionPolicy.RUNTIME)
82 @AllowUnqualifiedMatch
83 public static @interface DftQual {}
84
85 private Qual makeQual() {
86 return AnnotationBuilder.of(Qual.class).build();
87 }
88 private VQual makeVQual(String val) {
89 return AnnotationBuilder.of(VQual.class).set("value", val).build();
90 }
91 private DftQual makeDftQual() {
92 return AnnotationBuilder.of(DftQual.class).build();
93 }
94
95 @Test
96 public void testIsQualifier() throws Exception {
97 assertThat(Qualifiers.isQualifier(Nullable.class),
98 equalTo(false));
99 assertThat(Qualifiers.isQualifier(Qual.class),
100 equalTo(true));
101 }
102
103 @Test
104 public void testResolveAliasUnaliased() {
105 assertThat(Qualifiers.resolveAliases(Qual.class),
106 equalTo((Class) Qual.class));
107 }
108
109 @Test
110 public void testResolveAlias() {
111 assertThat(Qualifiers.resolveAliases(AQual.class),
112 equalTo((Class) Qual.class));
113 }
114
115 @Test
116 public void testResolveDoubleAlias() {
117 assertThat(Qualifiers.resolveAliases(AAQual.class),
118 equalTo((Class) Qual.class));
119 }
120
121 @Test
122 public void testRejectBadAlias() {
123 try {
124 Qualifiers.resolveAliases(BadAlias.class);
125 fail("resolving a bad alias should throw an exception");
126 } catch (IllegalArgumentException ex) {
127
128 }
129 }
130
131 @Test
132 public void testRejectCircularAlias() {
133 try {
134 Qualifiers.resolveAliases(Circle2.class);
135 fail("resolving a circular alias should throw an exception");
136 } catch (IllegalArgumentException ex) {
137
138 }
139 }
140
141 @Test
142 public void testMatchAny() throws Exception {
143 assertThat(Qualifiers.matchAny().matches(null),
144 equalTo(true));
145 assertThat(Qualifiers.matchAny().matches(makeQual()),
146 equalTo(true));
147 assertThat(Qualifiers.matchAny().matches(makeVQual("foo")),
148 equalTo(true));
149 assertThat(Qualifiers.matchAny().matches(makeDftQual()),
150 equalTo(true));
151 assertThat(Qualifiers.matchAny(), equalTo(Qualifiers.matchAny()));
152 assertThat(SerializationUtils.clone(Qualifiers.matchAny()),
153 equalTo(Qualifiers.matchAny()));
154 }
155
156 @Test
157 public void testMatchNone() throws Exception {
158 assertThat(Qualifiers.matchNone().matches(null),
159 equalTo(true));
160 assertThat(Qualifiers.matchNone().matches(makeQual()),
161 equalTo(false));
162 assertThat(Qualifiers.matchNone().matches(makeVQual("foo")),
163 equalTo(false));
164 assertThat(Qualifiers.matchNone().matches(makeDftQual()),
165 equalTo(false));
166 assertThat(Qualifiers.matchNone(), equalTo(Qualifiers.matchNone()));
167 assertThat(Qualifiers.matchNone(), not(equalTo(Qualifiers.matchAny())));
168 assertThat(SerializationUtils.clone(Qualifiers.matchNone()),
169 equalTo(Qualifiers.matchNone()));
170 assertThat(Qualifiers.matchNone().toString(),
171 equalTo("-"));
172 }
173
174 @Test
175 public void testMatchNoneByNull() {
176 assertThat(Qualifiers.match((Class) null),
177 equalTo(Qualifiers.matchNone()));
178 assertThat(Qualifiers.match((Annotation) null),
179 equalTo(Qualifiers.matchNone()));
180 }
181
182 @Test
183 public void testMatchDefault() throws Exception {
184 assertThat(Qualifiers.matchDefault().matches(null),
185 equalTo(true));
186 assertThat(Qualifiers.matchDefault().matches(makeQual()),
187 equalTo(false));
188 assertThat(Qualifiers.matchDefault().matches(makeVQual("foo")),
189 equalTo(false));
190 assertThat(Qualifiers.matchDefault().matches(makeDftQual()),
191 equalTo(true));
192 assertThat(Qualifiers.matchDefault(), equalTo(Qualifiers.matchDefault()));
193 assertThat(Qualifiers.matchDefault(), not(equalTo(Qualifiers.matchAny())));
194 assertThat(SerializationUtils.clone(Qualifiers.matchDefault()),
195 equalTo(Qualifiers.matchDefault()));
196 }
197
198 @Test
199 public void testMatchClass() throws Exception {
200 assertThat(Qualifiers.match(Qual.class).matches(null),
201 equalTo(false));
202 assertThat(Qualifiers.match(Qual.class).matches(makeQual()),
203 equalTo(true));
204 assertThat(Qualifiers.match(Qual.class).matches(makeVQual("foo")),
205 equalTo(false));
206 assertThat(Qualifiers.match(VQual.class).matches(makeVQual("foo")),
207 equalTo(true));
208 assertThat(Qualifiers.match(Qual.class), equalTo(Qualifiers.match(Qual.class)));
209 assertThat(Qualifiers.match(Qual.class), not(equalTo(Qualifiers.match(VQual.class))));
210 assertThat(Qualifiers.match(Qual.class), not(equalTo(Qualifiers.matchAny())));
211 assertThat(SerializationUtils.clone(Qualifiers.match(Qual.class)),
212 equalTo(Qualifiers.match(Qual.class)));
213 assertThat(SerializationUtils.clone(Qualifiers.match(VQual.class)),
214 equalTo(Qualifiers.match(VQual.class)));
215 }
216
217 @Test
218 public void testClassMatcherBadClassError() {
219 Qualifiers.AnnotationClassMatcher.SerialProxy proxy =
220 new Qualifiers.AnnotationClassMatcher.SerialProxy(String.class);
221 byte[] data = SerializationUtils.serialize(proxy);
222 try {
223 SerializationUtils.deserialize(data);
224 fail("deserialization should fail with error");
225 } catch (SerializationException e) {
226 assertThat(e.getCause(), instanceOf(InvalidObjectException.class));
227 assertThat(e.getCause().getCause(), instanceOf(ClassCastException.class));
228 }
229 }
230
231 @Test
232 public void testMatchValue() throws Exception {
233 assertThat(Qualifiers.match(makeQual()).matches(null),
234 equalTo(false));
235 assertThat(Qualifiers.match(makeQual()).matches(makeQual()),
236 equalTo(true));
237 assertThat(Qualifiers.match(makeQual()).matches(makeVQual("foo")),
238 equalTo(false));
239 assertThat(Qualifiers.match(makeVQual("foo")).matches(makeVQual("foo")),
240 equalTo(true));
241 assertThat(Qualifiers.match(makeVQual("bar")).matches(makeVQual("foo")),
242 equalTo(false));
243 assertThat(Qualifiers.match(makeQual()),
244 equalTo(Qualifiers.match(makeQual())));
245 assertThat(Qualifiers.match(makeVQual("foo")),
246 equalTo(Qualifiers.match(makeVQual("foo"))));
247 assertThat(Qualifiers.match(makeVQual("foo")),
248 not(equalTo(Qualifiers.match(makeVQual("bar")))));
249 assertThat(SerializationUtils.clone(Qualifiers.match(makeQual())),
250 equalTo(Qualifiers.match(makeQual())));
251 assertThat(SerializationUtils.clone(Qualifiers.match(makeVQual("foo"))),
252 equalTo(Qualifiers.match(makeVQual("foo"))));
253 }
254 }