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 *****************************************************************************/
010package org.picocontainer.injectors;
011
012import org.junit.Test;
013import org.picocontainer.DefaultPicoContainer;
014import org.picocontainer.MutablePicoContainer;
015import org.picocontainer.Parameter;
016import org.picocontainer.annotations.Inject;
017import org.picocontainer.monitors.NullComponentMonitor;
018
019import java.lang.annotation.ElementType;
020import java.lang.annotation.Retention;
021import java.lang.annotation.RetentionPolicy;
022import java.lang.annotation.Target;
023
024import static org.junit.Assert.assertNotNull;
025
026public class AnnotatedMethodInjectorTestCase  {
027
028    public static class AnnotatedBurp {
029
030        private Wind wind;
031
032        @Inject
033        public void windyWind(Wind wind) {
034            this.wind = wind;
035        }
036    }
037
038    public static class SetterBurp {
039
040        private Wind wind;
041
042        public void setWind(Wind wind) {
043            this.wind = wind;
044        }
045    }
046
047    public static class Wind {
048    }
049
050    @Test public void testSetterMethodInjectionToContrastWithThatBelow() {
051
052        MutablePicoContainer pico = new DefaultPicoContainer();
053        pico.addAdapter(new SetterInjector(SetterBurp.class, SetterBurp.class, Parameter.DEFAULT, new NullComponentMonitor(),
054                                           "set", "", false, false));
055        pico.addComponent(Wind.class, new Wind());
056        SetterBurp burp = pico.getComponent(SetterBurp.class);
057        assertNotNull(burp);
058        assertNotNull(burp.wind);
059    }
060
061    @Test public void testNonSetterMethodInjection() {
062        MutablePicoContainer pico = new DefaultPicoContainer();
063        pico.addAdapter(new AnnotatedMethodInjector(AnnotatedBurp.class, AnnotatedBurp.class, Parameter.DEFAULT,
064                                               new NullComponentMonitor(),
065                                               Inject.class, false));
066        pico.addComponent(Wind.class, new Wind());
067        AnnotatedBurp burp = pico.getComponent(AnnotatedBurp.class);
068        assertNotNull(burp);
069        assertNotNull(burp.wind);
070    }
071
072    @Retention(RetentionPolicy.RUNTIME)
073    @Target(value={ ElementType.METHOD, ElementType.FIELD})
074    public @interface AlternativeInject {
075    }
076
077    public static class AnotherAnnotatedBurp {
078        private Wind wind;
079        @AlternativeInject
080        public void windyWind(Wind wind) {
081            this.wind = wind;
082        }
083    }
084
085    
086    @Test public void testNonSetterMethodInjectionWithAlternativeAnnotation() {
087        MutablePicoContainer pico = new DefaultPicoContainer();
088        pico.addAdapter(new AnnotatedMethodInjector(AnotherAnnotatedBurp.class, AnotherAnnotatedBurp.class, Parameter.DEFAULT,
089                                               new NullComponentMonitor(),
090                                               AlternativeInject.class, false));
091        pico.addComponent(Wind.class, new Wind());
092        AnotherAnnotatedBurp burp = pico.getComponent(AnotherAnnotatedBurp.class);
093        assertNotNull(burp);
094        assertNotNull(burp.wind);
095    }
096
097
098}