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 *****************************************************************************/
009package org.picocontainer.injectors;
010
011import static org.junit.Assert.assertNotNull;
012import static org.junit.Assert.assertEquals;
013
014import org.junit.Test;
015import org.picocontainer.ComponentAdapter;
016import org.picocontainer.DefaultPicoContainer;
017import static org.picocontainer.injectors.NamedFieldInjection.injectionFieldNames;
018import org.picocontainer.annotations.Inject;
019import org.picocontainer.containers.EmptyPicoContainer;
020import org.picocontainer.LifecycleStrategy;
021import org.picocontainer.lifecycle.NullLifecycleStrategy;
022
023/**
024 * @author Paul Hammant
025 */
026public class CompositeInjectionTestCase {
027
028    public static class Bar {
029    }
030    public static class Baz {
031    }
032
033    public static class Foo {
034        private final Bar bar;
035        private Baz baz;
036
037        public Foo(Bar bar) {
038            this.bar = bar;
039        }
040
041        public void setBaz(Baz baz) {
042            this.baz = baz;
043        }
044    }
045
046    public static class Foo2 {
047        private final Bar bar;
048        private Baz baz;
049
050        public Foo2(Bar bar) {
051            this.bar = bar;
052        }
053
054        public void injectBaz(Baz baz) {
055            this.baz = baz;
056        }
057    }
058
059    public static class Foo3 {
060        private final Bar bar;
061        private Baz baz;
062
063        public Foo3(Bar bar) {
064            this.bar = bar;
065        }
066
067        @Inject
068        public void fjshdfkjhsdkfjh(Baz baz) {
069            this.baz = baz;
070        }
071    }
072    public static class Foo4 {
073        private final Bar bar;
074        private String one;
075        private String two;
076
077        public Foo4(Bar bar) {
078            this.bar = bar;
079        }
080
081    }
082
083    @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
084        DefaultPicoContainer dpc = new DefaultPicoContainer(
085                new CompositeInjection(new ConstructorInjection(), new SetterInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
086        dpc.addComponent(Bar.class);
087        dpc.addComponent(Baz.class);
088        dpc.addComponent(Foo.class);
089        Foo foo = dpc.getComponent(Foo.class);
090        assertNotNull(foo);
091        assertNotNull(foo.bar);
092        assertNotNull(foo.baz);
093    }
094
095    @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException {
096        DefaultPicoContainer dpc = new DefaultPicoContainer(
097                new CompositeInjection(new ConstructorInjection(), new SetterInjection("inject")), new NullLifecycleStrategy(), new EmptyPicoContainer());
098        dpc.addComponent(Bar.class);
099        dpc.addComponent(Baz.class);
100        dpc.addComponent(Foo2.class);
101        Foo2 foo = dpc.getComponent(Foo2.class);
102        assertNotNull(foo);
103        assertNotNull(foo.bar);
104        assertNotNull(foo.baz);
105    }
106
107    @Test public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
108        DefaultPicoContainer dpc = new DefaultPicoContainer(
109                new CompositeInjection(new ConstructorInjection(), new AnnotatedMethodInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
110        dpc.addComponent(Bar.class);
111        dpc.addComponent(Baz.class);
112        dpc.addComponent(Foo3.class);
113        Foo3 foo = dpc.getComponent(Foo3.class);
114        assertNotNull(foo);
115        assertNotNull(foo.bar);
116        assertNotNull(foo.baz);
117    }
118
119
120    @Test public void testComponentWithCtorAndNamedFieldWorkToegether() throws NoSuchMethodException {
121        DefaultPicoContainer dpc = new DefaultPicoContainer(
122                new CompositeInjection(new ConstructorInjection(), new NamedFieldInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
123        dpc.addComponent(Bar.class);
124        dpc.addConfig("one", "1");
125        dpc.addConfig("two", "2");
126        dpc.as(injectionFieldNames("one", "two")).addComponent(Foo4.class);
127        Foo4 foo4 = dpc.getComponent(Foo4.class);
128        assertNotNull(foo4);
129        assertNotNull(foo4.bar);
130        assertNotNull(foo4.one);
131        assertEquals("1", foo4.one);
132        assertNotNull(foo4.two);
133        assertEquals("2", foo4.two);
134    }
135
136    @Test public void testWithNonNullLifecycleStrategy() {
137        DefaultPicoContainer dpc = new DefaultPicoContainer(
138                new CompositeInjection(new ConstructorInjection(), new AnnotatedMethodInjection()),
139                new NonNullLifecycleStrategy(),
140                new EmptyPicoContainer()
141        );
142        dpc.addComponent(Bar.class);
143        assertNotNull(dpc.getComponent(Bar.class));
144    }
145
146    private static class NonNullLifecycleStrategy implements LifecycleStrategy {
147        public void start(Object component) {
148        }
149
150        public void stop(Object component) {
151        }
152
153        public void dispose(Object component) {
154        }
155
156        public boolean hasLifecycle(Class<?> type) {
157            return false;
158        }
159
160        public boolean isLazy(ComponentAdapter<?> adapter) {
161            return false;
162        }
163    }
164}