001 /*****************************************************************************
002 * Copyright (C) NanoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 *****************************************************************************/
009
010 package org.picocontainer.behaviors;
011
012 import org.junit.Test;
013 import static org.junit.Assert.assertNotNull;
014 import org.picocontainer.MutablePicoContainer;
015 import org.picocontainer.DefaultPicoContainer;
016 import org.picocontainer.annotations.Inject;
017 import org.picocontainer.injectors.ConstructorInjection;
018
019 import java.lang.reflect.Field;import static junit.framework.Assert.assertEquals;
020
021 public class DecoratingTestCase {
022
023 public static interface Swede {
024 }
025
026 public static class Turnip {
027 @Inject
028 Swede swede;
029 private final String foo;
030
031 public Turnip(String foo) {
032 this.foo = foo;
033 }
034
035 public Swede getSwede() {
036 return swede;
037 }
038
039 public String getFoo() {
040 return foo;
041 }
042 }
043
044
045 @Test
046 public void testThatComponentCanHaveAProvidedDependencyViaDecoratorBehavior() {
047 MutablePicoContainer container = new DefaultPicoContainer(new SwedeDecorating().wrap(new ConstructorInjection()));
048 container.addComponent(String.class, "foo");
049 container.addComponent(Turnip.class);
050 Turnip t = container.getComponent(Turnip.class);
051 assertNotNull(t);
052 assertNotNull(t.getSwede());
053 assertEquals("Swede:" + Turnip.class.getName(), t.getSwede().toString());
054 assertEquals("foo", t.getFoo());
055
056 }
057
058 @Test
059 public void testThatComponentCanHaveAProvidedDependencyViaFieldDecoratorBehavior() {
060 MutablePicoContainer container = new DefaultPicoContainer(
061 new FieldDecorating(Swede.class) {
062 public Object decorate(final Object instance) {
063 return new Swede() {
064 public String toString() {
065 return "Swede:" + instance.getClass().getName();
066 }
067 };
068 }
069 }.wrap(new ConstructorInjection()));
070 container.addComponent(String.class, "foo");
071 container.addComponent(Turnip.class);
072 Turnip t = container.getComponent(Turnip.class);
073 assertNotNull(t);
074 assertNotNull(t.getSwede());
075 assertEquals("Swede:" + Turnip.class.getName(), t.getSwede().toString());
076 assertEquals("foo", t.getFoo());
077
078 }
079
080 private static class SwedeDecorating extends Decorating {
081 public void decorate(final Object instance) {
082 Field[] fields = instance.getClass().getDeclaredFields();
083 for (int i = 0; i < fields.length; i++) {
084 Field field = fields[i];
085 if (field.getType() == Swede.class) {
086 Swede value = new Swede() {
087 public String toString() {
088 return "Swede:" + instance.getClass().getName();
089 }
090 };
091 field.setAccessible(true);
092 try {
093 field.set(instance, value);
094 } catch (IllegalAccessException e) {
095 throw new RuntimeException(e);
096 }
097 }
098
099 }
100 }
101 }
102
103 }