001    /*****************************************************************************
002     * Copyright (C) PicoContainer 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     * Original code by                                                          *
009     *****************************************************************************/
010    package org.picocontainer.injectors;
011    
012    import static org.junit.Assert.assertNotNull;
013    import static org.junit.Assert.assertNull;
014    
015    import java.lang.annotation.ElementType;
016    import java.lang.annotation.Retention;
017    import java.lang.annotation.RetentionPolicy;
018    import java.lang.annotation.Target;
019    
020    import org.junit.Test;
021    import org.picocontainer.DefaultPicoContainer;
022    import org.picocontainer.MutablePicoContainer;
023    import org.picocontainer.PicoBuilder;
024    import org.picocontainer.Startable;
025    import org.picocontainer.annotations.Inject;
026    import org.picocontainer.lifecycle.NullLifecycleStrategy;
027    import org.picocontainer.monitors.NullComponentMonitor;
028    
029    public class AnnotatedFieldInjectorTestCase {
030    
031        public static class Helicopter {
032            @Inject
033            private PogoStick pogo;
034    
035            public Helicopter() {
036            }
037        }
038    
039        public static class Helicopter2 {
040            private PogoStick pogo;
041    
042            public Helicopter2() {
043            }
044        }
045    
046        public static class PogoStick {
047        }
048    
049        @Test
050        public void testFieldInjection() {
051            MutablePicoContainer pico = new DefaultPicoContainer();
052            pico.addAdapter(new AnnotatedFieldInjector(Helicopter.class, Helicopter.class, null,
053                    new NullComponentMonitor(), Inject.class, false));
054            pico.addComponent(PogoStick.class, new PogoStick());
055            Helicopter chopper = pico.getComponent(Helicopter.class);
056            assertNotNull(chopper);
057            assertNotNull(chopper.pogo);
058        }
059    
060        @Test
061        public void testFieldInjectionWithoutAnnotationDoesNotWork() {
062            MutablePicoContainer pico = new DefaultPicoContainer();
063            pico.addAdapter(new AnnotatedFieldInjector(Helicopter2.class, Helicopter2.class, null,
064                    new NullComponentMonitor(), Inject.class, false));
065            pico.addComponent(PogoStick.class, new PogoStick());
066            Helicopter2 chopper = pico.getComponent(Helicopter2.class);
067            assertNotNull(chopper);
068            assertNull(chopper.pogo);
069        }
070    
071        @Test
072        public void testFieldDeosNotHappenWithoutRightInjectorDoesNotWork() {
073            MutablePicoContainer pico = new DefaultPicoContainer();
074            pico.addAdapter(new SetterInjector(Helicopter.class, Helicopter.class, null,
075                    new NullComponentMonitor(),
076                    "set", false));
077            pico.addComponent(PogoStick.class, new PogoStick());
078            Helicopter chopper = pico.getComponent(Helicopter.class);
079            assertNotNull(chopper);
080            assertNull(chopper.pogo);
081        }
082    
083        @Retention(RetentionPolicy.RUNTIME)
084        @Target(value = {ElementType.METHOD, ElementType.FIELD})
085        public @interface AlternativeInject {
086        }
087    
088        public static class Helicopter3 {
089            @AlternativeInject
090            private PogoStick pogo;
091    
092            public Helicopter3() {
093            }
094        }
095    
096        @Test
097        public void testFieldInjectionWithAlternativeInjectionAnnotation() {
098            MutablePicoContainer pico = new DefaultPicoContainer();
099            pico.addAdapter(new AnnotatedFieldInjector(Helicopter3.class, Helicopter3.class, null,
100                    new NullComponentMonitor(), AlternativeInject.class, false));
101            pico.addComponent(PogoStick.class, new PogoStick());
102            Helicopter3 chopper = pico.getComponent(Helicopter3.class);
103            assertNotNull(chopper);
104            assertNotNull(chopper.pogo);
105        }
106    
107        public static abstract class A {
108            @Inject
109            protected C c;
110        }
111    
112        public static class B extends A {
113        }
114    
115        public static class C {
116        }
117    
118        @Test
119        public void testThatSuperClassCanHaveAnnotatedFields() {
120            MutablePicoContainer container = new PicoBuilder().withAutomatic().build();
121            container.addComponent(C.class);
122            container.addComponent(B.class);
123    
124            B b = container.getComponent(B.class);
125            assertNotNull(b);
126            assertNotNull(b.c);
127        }
128    
129        public static abstract class A2 {
130            @Inject
131            protected D2 d2;
132        }
133    
134        public static abstract class B2 extends A2 {
135        }
136    
137        public static class C2 extends B2 {
138        }
139    
140        public static class D2 {
141        }
142    
143        @Test
144        public void testThatEvenMoreSuperClassCanHaveAnnotatedFields() {
145            MutablePicoContainer container = new PicoBuilder().withAnnotatedFieldInjection().build();
146            container.addComponent(D2.class);
147            container.addComponent(C2.class);
148    
149            C2 c2 = container.getComponent(C2.class);
150            assertNotNull(c2);
151            assertNotNull(c2.d2);
152        }
153    
154        @Test
155        public void testThatEvenMoreSuperClassCanHaveAnnotatedFieldsViaAdaptingInjection() {
156            MutablePicoContainer container = new PicoBuilder().build();
157            container.addComponent(D2.class);
158            container.addComponent(C2.class);
159    
160            C2 c2 = container.getComponent(C2.class);
161            assertNotNull(c2);
162            assertNotNull(c2.d2);
163        }
164    
165    }