2 * Copyright 2008 the original author or authors.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.wamblee.system.adapters;
18 import org.wamblee.system.core.DefaultProvidedInterface;
19 import org.wamblee.system.core.ProvidedInterface;
20 import org.wamblee.system.core.RequiredInterface;
21 import org.wamblee.system.core.RequiredInterfaceComparator;
23 import org.wamblee.test.AssertionUtils;
25 import java.lang.reflect.Method;
27 import java.util.ArrayList;
28 import java.util.Collections;
29 import java.util.Comparator;
30 import java.util.List;
32 import javax.sql.DataSource;
39 public class SetterConfigurationTest extends AdapterTestCase {
40 public void testOneSetter() {
41 SetterConfiguration config = new SetterConfiguration(X5.class);
42 config.initAllSetters();
44 List<RequiredInterface> required = config.getRequiredInterfaces();
45 assertEquals(1, required.size());
46 assertEquals("setValue.0", required.get(0).getName());
48 ProvidedInterface provided = new DefaultProvidedInterface("janse",
50 required.get(0).setProvider(provided);
51 scope.publishInterface(provided, "hello");
54 assertNull(obj.getValue());
55 config.inject(scope, obj);
56 assertEquals("hello", obj.getValue());
59 public void testPrivateSetter() {
60 SetterConfiguration config = new SetterConfiguration(X5.class);
61 config.setNonPublic(true);
62 config.initAllSetters();
64 List<RequiredInterface> required = new ArrayList<RequiredInterface>(
65 config.getRequiredInterfaces());
66 Collections.sort(required, new Comparator<RequiredInterface>() {
68 public int compare(RequiredInterface aO1, RequiredInterface aO2) {
69 return aO1.getName().compareTo(aO2.getName());
72 assertEquals(2, required.size());
73 assertEquals("setValue.0", required.get(0).getName());
74 assertEquals("setXyz.0", required.get(1).getName());
76 ProvidedInterface providedString = new DefaultProvidedInterface(
77 "janse", String.class);
78 assertTrue(required.get(0).implementedBy(providedString));
79 required.get(0).setProvider(providedString);
80 scope.publishInterface(providedString, "hello");
82 ProvidedInterface providedInt = new DefaultProvidedInterface("xxx",
84 assertTrue(required.get(1).implementedBy(providedInt));
85 required.get(1).setProvider(providedInt);
86 scope.publishInterface(providedInt, 100);
89 assertNull(obj.getValue());
90 assertNull(obj.getXyz());
91 config.inject(scope, obj);
92 assertEquals("hello", obj.getValue());
93 assertEquals(100, obj.getXyz().intValue());
96 public void testInheritance() {
97 SetterConfiguration config = new SetterConfiguration(X9.class);
98 config.setNonPublic(true);
99 config.initAllSetters();
101 List<RequiredInterface> required = new ArrayList<RequiredInterface>(
102 config.getRequiredInterfaces());
103 Collections.sort(required, new Comparator<RequiredInterface>() {
105 public int compare(RequiredInterface aO1, RequiredInterface aO2) {
106 return aO1.getName().compareTo(aO2.getName());
109 assertEquals(3, required.size());
110 assertEquals("setFlag.0", required.get(0).getName());
111 assertEquals("setValue.0", required.get(1).getName());
112 assertEquals("setXyz.0", required.get(2).getName());
114 ProvidedInterface providedBoolean = new DefaultProvidedInterface(
115 "janse", Boolean.class);
116 assertTrue(required.get(0).implementedBy(providedBoolean));
117 required.get(0).setProvider(providedBoolean);
118 scope.publishInterface(providedBoolean, true);
120 ProvidedInterface providedString = new DefaultProvidedInterface(
121 "janse", String.class);
122 assertTrue(required.get(1).implementedBy(providedString));
123 required.get(1).setProvider(providedString);
124 scope.publishInterface(providedString, "hello");
126 ProvidedInterface providedInt = new DefaultProvidedInterface("xxx",
128 assertTrue(required.get(2).implementedBy(providedInt));
129 required.get(2).setProvider(providedInt);
130 scope.publishInterface(providedInt, 100);
133 assertNull(obj.getValue());
134 assertNull(obj.getXyz());
135 assertFalse(obj.isFlag());
136 config.inject(scope, obj);
137 assertEquals("hello", obj.getValue());
138 assertEquals(100, obj.getXyz().intValue());
139 assertTrue(obj.isFlag());
142 public void testMultipleSetters() {
143 SetterConfiguration config = new SetterConfiguration(X6.class)
145 List<RequiredInterface> required = config.getRequiredInterfaces();
146 Collections.sort(required, new RequiredInterfaceComparator());
147 assertEquals(2, required.size());
148 assertEquals("setHost.0", required.get(0).getName());
149 assertEquals("setPort.0", required.get(1).getName());
151 ProvidedInterface provided0 = new DefaultProvidedInterface("janse",
153 required.get(0).setProvider(provided0);
154 scope.publishInterface(provided0, "hello");
156 ProvidedInterface provided1 = new DefaultProvidedInterface("port",
158 required.get(1).setProvider(provided1);
159 scope.publishInterface(provided1, 10);
162 assertNull(obj.getHost());
163 assertNull(obj.getPort());
165 config.inject(scope, obj);
166 assertEquals("hello", obj.getHost());
167 assertEquals(10, obj.getPort().intValue());
170 public void testInvokeWrongType() {
171 final SetterConfiguration config = new SetterConfiguration(X5.class)
173 List<RequiredInterface> required = config.getRequiredInterfaces();
174 assertEquals(1, required.size());
175 assertEquals("setValue.0", required.get(0).getName());
177 ProvidedInterface provided = new DefaultProvidedInterface("janse",
179 required.get(0).setProvider(provided);
180 scope.publishInterface(provided, "hello");
182 final X6 obj = new X6();
183 AssertionUtils.assertException(new AssertionUtils.ErroneousCode() {
185 public void run() throws Exception {
186 config.inject(scope, obj);
188 }, IllegalArgumentException.class);
191 public void testSetExplicitValue() {
192 SetterConfiguration config = new SetterConfiguration(X5.class)
194 config.values("setValue").setValue(0, "bladibla");
196 List<RequiredInterface> required = config.getRequiredInterfaces();
197 assertEquals(0, required.size());
200 assertNull(obj.getValue());
201 config.inject(scope, obj);
202 assertEquals("bladibla", obj.getValue());
205 public void testClear() {
206 SetterConfiguration config = new SetterConfiguration(X6.class);
209 List<RequiredInterface> required = config.getRequiredInterfaces();
210 Collections.sort(required, new RequiredInterfaceComparator());
211 assertEquals(0, required.size());
214 assertNull(obj.getHost());
215 assertNull(obj.getPort());
217 config.inject(scope, obj);
219 assertNull(obj.getHost());
220 assertNull(obj.getPort());
223 public void testAddByName() {
224 SetterConfiguration config = new SetterConfiguration(X6.class);
225 config.clear().add("setHost");
227 List<RequiredInterface> required = config.getRequiredInterfaces();
228 Collections.sort(required, new RequiredInterfaceComparator());
229 assertEquals(1, required.size());
230 assertEquals("setHost.0", required.get(0).getName());
232 ProvidedInterface provided0 = new DefaultProvidedInterface("janse",
234 required.get(0).setProvider(provided0);
235 scope.publishInterface(provided0, "hello");
238 assertNull(obj.getHost());
239 assertNull(obj.getPort());
241 config.inject(scope, obj);
242 assertEquals("hello", obj.getHost());
243 assertNull(obj.getPort());
246 public void testAddByType() {
247 SetterConfiguration config = new SetterConfiguration(X6.class);
248 config.clear().addSetter(String.class);
250 List<RequiredInterface> required = config.getRequiredInterfaces();
251 Collections.sort(required, new RequiredInterfaceComparator());
252 assertEquals(1, required.size());
253 assertEquals("setHost.0", required.get(0).getName());
255 ProvidedInterface provided0 = new DefaultProvidedInterface("janse",
257 required.get(0).setProvider(provided0);
258 scope.publishInterface(provided0, "hello");
261 assertNull(obj.getHost());
262 assertNull(obj.getPort());
264 config.inject(scope, obj);
265 assertEquals("hello", obj.getHost());
266 assertNull(obj.getPort());
269 public void testAddPrivate() {
271 final SetterConfiguration config = new SetterConfiguration(X5.class);
272 AssertionUtils.assertException(new AssertionUtils.ErroneousCode() {
274 public void run() throws Exception {
277 }, IllegalArgumentException.class);
279 config.setNonPublic(true);
281 config.add("setXyz");
282 assertEquals(1, config.getRequiredInterfaces().size());
285 public void testAddNonExisting() {
286 final SetterConfiguration config = new SetterConfiguration(X6.class);
289 AssertionUtils.assertException(new AssertionUtils.ErroneousCode() {
291 public void run() throws Exception {
292 config.add("bladibla");
294 }, IllegalArgumentException.class);
295 AssertionUtils.assertException(new AssertionUtils.ErroneousCode() {
297 public void run() throws Exception {
298 config.addSetter(DataSource.class);
300 }, IllegalArgumentException.class);
303 public void testAddByTypeNonUnique() {
304 final SetterConfiguration config = new SetterConfiguration(X11.class);
306 AssertionUtils.assertException(new AssertionUtils.ErroneousCode() {
308 public void run() throws Exception {
309 config.addSetter(String.class);
311 }, IllegalArgumentException.class);
314 public void testRemove() {
315 SetterConfiguration config = new SetterConfiguration(X6.class)
317 config.remove("setPort");
319 List<RequiredInterface> required = config.getRequiredInterfaces();
320 Collections.sort(required, new RequiredInterfaceComparator());
321 assertEquals(1, required.size());
322 assertEquals("setHost.0", required.get(0).getName());
324 ProvidedInterface provided0 = new DefaultProvidedInterface("janse",
326 required.get(0).setProvider(provided0);
327 scope.publishInterface(provided0, "hello");
330 assertNull(obj.getHost());
331 assertNull(obj.getPort());
333 config.inject(scope, obj);
334 assertEquals("hello", obj.getHost());
335 assertNull(obj.getPort());
338 public void testRemoveByMethodObject() throws NoSuchMethodException {
339 SetterConfiguration config = new SetterConfiguration(X6.class)
341 config.remove(X6.class.getMethod("setPort", Integer.class));
343 List<RequiredInterface> required = config.getRequiredInterfaces();
344 Collections.sort(required, new RequiredInterfaceComparator());
345 assertEquals(1, required.size());
346 assertEquals("setHost.0", required.get(0).getName());
348 ProvidedInterface provided0 = new DefaultProvidedInterface("janse",
350 required.get(0).setProvider(provided0);
351 scope.publishInterface(provided0, "hello");
354 assertNull(obj.getHost());
355 assertNull(obj.getPort());
357 config.inject(scope, obj);
358 assertEquals("hello", obj.getHost());
359 assertNull(obj.getPort());
362 public void testRemoveNonExisting() {
363 final SetterConfiguration config = new SetterConfiguration(X6.class);
365 AssertionUtils.assertException(new AssertionUtils.ErroneousCode() {
367 public void run() throws Exception {
368 config.remove("bladibla");
370 }, IllegalArgumentException.class);
373 public void testOverridingSetters() {
374 SetterConfiguration config = new SetterConfiguration(X10.class)
376 assertEquals(2, config.getRequiredInterfaces().size());
378 List<Method> methods = config.getSetters();
379 assertEquals(2, methods.size());
381 for (Method method : methods) {
382 assertEquals(X10.class, method.getDeclaringClass());