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     * Idea by Rachel Davies, Original code by Aslak Hellesoy and Paul Hammant   *
009     *****************************************************************************/
010    package org.picocontainer.injectors;
011    
012    import static org.junit.Assert.assertEquals;
013    import static org.junit.Assert.assertNotNull;
014    import static org.picocontainer.Characteristics.USE_NAMES;
015    
016    import java.util.Properties;
017    
018    import org.junit.Before;
019    import org.junit.Test;
020    import org.picocontainer.ComponentFactory;
021    import org.picocontainer.DefaultPicoContainer;
022    import org.picocontainer.monitors.NullComponentMonitor;
023    import org.picocontainer.parameters.ConstantParameter;
024    import org.picocontainer.tck.AbstractComponentFactoryTest;
025    import org.picocontainer.tck.AbstractComponentAdapterTest.RecordingLifecycleStrategy;
026    import org.picocontainer.testmodel.NullLifecycle;
027    import org.picocontainer.testmodel.RecordingLifecycle;
028    import org.picocontainer.testmodel.RecordingLifecycle.One;
029    
030    /**
031     * @author Mauro Talevi
032     */
033    public class ConstructorInjectionTestCase extends AbstractComponentFactoryTest {
034    
035            @Before
036        public void setUp() throws Exception {
037            picoContainer = new DefaultPicoContainer(createComponentFactory());
038        }
039    
040        protected ComponentFactory createComponentFactory() {
041            return new ConstructorInjection();
042        }
043    
044        @Test public void testCustomLifecycleCanBeInjected() throws NoSuchMethodException {
045            RecordingLifecycleStrategy strategy = new RecordingLifecycleStrategy(new StringBuffer());
046            ConstructorInjection componentFactory =
047                new ConstructorInjection();
048            ConstructorInjector cica =  (ConstructorInjector)
049            componentFactory.createComponentAdapter(new NullComponentMonitor(), strategy, new Properties(), NullLifecycle.class, NullLifecycle.class);
050            One one = new RecordingLifecycle.One(new StringBuffer());
051            cica.start(one);
052            cica.stop(one);        
053            cica.dispose(one);
054            assertEquals("<start<stop<dispose", strategy.recording());
055        }
056    
057        public static class ClassA {
058            private int x;
059            public ClassA(int x) {
060                this.x = x;
061            }
062        }
063        @Test public void testAutoConversionOfIntegerParam() {
064            picoContainer.as(USE_NAMES).addComponent(ClassA.class);
065            picoContainer.addComponent("x", "12");
066            assertNotNull(picoContainer.getComponent(ClassA.class));
067            assertEquals(12,picoContainer.getComponent(ClassA.class).x);
068        }
069    
070        public static class ClassB {
071            private float x;
072            public ClassB(float x) {
073                this.x = x;
074            }
075        }
076        @Test public void testAutoConversionOfFloatParam() {
077            picoContainer.as(USE_NAMES).addComponent(ClassB.class);
078            picoContainer.addComponent("x", "1.2");
079            assertNotNull(picoContainer.getComponent(ClassB.class));
080            assertEquals(1.2,picoContainer.getComponent(ClassB.class).x, 0.0001);
081        }
082        
083        
084        /**
085         * Test class to verify the CICA can handle
086         * a constant parameter class type. 
087         *
088         */
089        @SuppressWarnings({"unchecked", "unused"})
090        public static class ClassAsConstructor {
091                    private final Class type;
092    
093                    public ClassAsConstructor(Class type) {
094                            this.type = type;               
095            }
096        }
097        
098            @Test 
099        @SuppressWarnings("unchecked")
100        public void allowClassTypesForComponentAdapter() {
101            ConstructorInjection componentFactory = new ConstructorInjection();
102            
103            ConstructorInjector cica =  (ConstructorInjector)
104            componentFactory.createComponentAdapter(new NullComponentMonitor(), null, new Properties(), ClassAsConstructor.class, ClassAsConstructor.class, new ConstantParameter(String.class));
105            
106            ClassAsConstructor instance = (ClassAsConstructor) cica.getComponentInstance(picoContainer);
107            assertNotNull(instance);
108            
109        }
110    
111    
112    }