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.defaults;
011    
012    import junit.framework.TestCase;
013    
014    import org.picocontainer.ComponentAdapter;
015    import org.picocontainer.MutablePicoContainer;
016    import org.picocontainer.Parameter;
017    import org.picocontainer.PicoInitializationException;
018    import org.picocontainer.PicoIntrospectionException;
019    import org.picocontainer.PicoRegistrationException;
020    import org.picocontainer.testmodel.DependsOnTouchable;
021    import org.picocontainer.testmodel.SimpleTouchable;
022    import org.picocontainer.testmodel.Touchable;
023    
024    
025    /**
026     * @author Jon Tirsen (tirsen@codehaus.org)
027     * @version $Revision: 1.7 $
028     */
029    public class ParameterTestCase extends TestCase {
030    
031        public void testComponentParameterFetches() throws PicoRegistrationException, PicoInitializationException {
032            DefaultPicoContainer pico = new DefaultPicoContainer();
033            ComponentAdapter adapter = pico.registerComponentImplementation(Touchable.class, SimpleTouchable.class);
034            assertNotNull(adapter);
035            assertNotNull(pico.getComponentInstance(Touchable.class));
036            Touchable touchable = (Touchable) ComponentParameter.DEFAULT.resolveInstance(pico, null, Touchable.class);
037            assertNotNull(touchable);
038        }
039    
040        public void testComponentParameterExcludesSelf() throws PicoRegistrationException, PicoInitializationException {
041            DefaultPicoContainer pico = new DefaultPicoContainer();
042            ComponentAdapter adapter = pico.registerComponentImplementation(Touchable.class, SimpleTouchable.class);
043    
044            assertNotNull(pico.getComponentInstance(Touchable.class));
045            Touchable touchable = (Touchable) ComponentParameter.DEFAULT.resolveInstance(pico, adapter, Touchable.class);
046            assertNull(touchable);
047        }
048    
049        public void testConstantParameter() throws PicoInitializationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoIntrospectionException {
050            Object value = new Object();
051            ConstantParameter parameter = new ConstantParameter(value);
052            MutablePicoContainer picoContainer = new DefaultPicoContainer();
053            assertSame(value, parameter.resolveInstance(picoContainer, null, Object.class));
054        }
055    
056        public void testDependsOnTouchableWithTouchableSpecifiedAsConstant() throws PicoRegistrationException, PicoInitializationException {
057            DefaultPicoContainer pico = new DefaultPicoContainer();
058            SimpleTouchable touchable = new SimpleTouchable();
059            pico.registerComponentImplementation(DependsOnTouchable.class, DependsOnTouchable.class, new Parameter[]{
060                new ConstantParameter(touchable)
061            });
062            pico.getComponentInstances();
063            assertTrue(touchable.wasTouched);
064        }
065    
066        public void testComponentParameterRespectsExpectedType() {
067            MutablePicoContainer picoContainer = new DefaultPicoContainer();
068            ComponentAdapter adapter = picoContainer.registerComponentImplementation(Touchable.class, SimpleTouchable.class);
069            assertNull(ComponentParameter.DEFAULT.resolveInstance(picoContainer, adapter, TestCase.class));
070        }
071            
072            public void testComponentParameterResolvesPrimitiveType() {
073            MutablePicoContainer picoContainer = new DefaultPicoContainer();
074            ComponentAdapter adapter = picoContainer.registerComponentInstance("glarch", new Integer(239));
075            assertNotNull(adapter);
076                    Parameter parameter = new ComponentParameter("glarch");
077                    assertNotNull(parameter.resolveInstance(picoContainer,null,Integer.TYPE));
078                    assertEquals(239, ((Integer)parameter.resolveInstance(picoContainer,null,Integer.TYPE)).intValue());
079            }
080    
081        public void testConstantParameterRespectsExpectedType() {
082            MutablePicoContainer picoContainer = new DefaultPicoContainer();
083            Parameter parameter = new ConstantParameter(new SimpleTouchable());
084            ComponentAdapter adapter = picoContainer.registerComponentImplementation(Touchable.class, SimpleTouchable.class);
085            assertFalse(parameter.isResolvable(picoContainer, adapter, TestCase.class));
086        }
087    
088        public void testParameterRespectsExpectedType() throws PicoInitializationException, NotConcreteRegistrationException, PicoIntrospectionException {
089            Parameter parameter = new ConstantParameter(Touchable.class);
090            MutablePicoContainer picoContainer = new DefaultPicoContainer();
091            assertFalse(parameter.isResolvable(picoContainer, null, TestCase.class));
092    
093            ComponentAdapter adapter = picoContainer.registerComponentImplementation(Touchable.class, SimpleTouchable.class);
094    
095            assertNull(ComponentParameter.DEFAULT.resolveInstance(picoContainer, adapter, TestCase.class));
096        }
097    
098        public void testConstantParameterWithPrimitives() throws PicoInitializationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoIntrospectionException {
099            MutablePicoContainer picoContainer = new DefaultPicoContainer();
100            Byte byteValue = new Byte((byte) 5);
101            ConstantParameter parameter = new ConstantParameter(byteValue);
102            assertSame(byteValue, parameter.resolveInstance(picoContainer, null, Byte.TYPE));
103            assertSame(byteValue, parameter.resolveInstance(picoContainer, null, Byte.class));
104            Short shortValue = new Short((short) 5);
105            parameter = new ConstantParameter(shortValue);
106            assertSame(shortValue, parameter.resolveInstance(picoContainer, null, Short.TYPE));
107            assertSame(shortValue, parameter.resolveInstance(picoContainer, null, Short.class));
108            Integer intValue = new Integer(5);
109            parameter = new ConstantParameter(intValue);
110            assertSame(intValue, parameter.resolveInstance(picoContainer, null, Integer.TYPE));
111            assertSame(intValue, parameter.resolveInstance(picoContainer, null, Integer.class));
112            Long longValue = new Long(5);
113            parameter = new ConstantParameter(longValue);
114            assertSame(longValue, parameter.resolveInstance(picoContainer, null, Long.TYPE));
115            assertSame(longValue, parameter.resolveInstance(picoContainer, null, Long.class));
116            Float floatValue = new Float(5.5);
117            parameter = new ConstantParameter(floatValue);
118            assertSame(floatValue, parameter.resolveInstance(picoContainer, null, Float.TYPE));
119            assertSame(floatValue, parameter.resolveInstance(picoContainer, null, Float.class));
120            Double doubleValue = new Double(5.5);
121            parameter = new ConstantParameter(doubleValue);
122            assertSame(doubleValue, parameter.resolveInstance(picoContainer, null, Double.TYPE));
123            assertSame(doubleValue, parameter.resolveInstance(picoContainer, null, Double.class));
124            Boolean booleanValue = new Boolean(true);
125            parameter = new ConstantParameter(booleanValue);
126            assertSame(booleanValue, parameter.resolveInstance(picoContainer, null, Boolean.TYPE));
127            assertSame(booleanValue, parameter.resolveInstance(picoContainer, null, Boolean.class));
128            Character charValue = new Character('x');
129            parameter = new ConstantParameter(charValue);
130            assertSame(charValue, parameter.resolveInstance(picoContainer, null, Character.TYPE));
131            assertSame(charValue, parameter.resolveInstance(picoContainer, null, Character.class));
132        }
133    
134        public void testConstantParameterWithPrimitivesRejectsUnexpectedType() throws PicoInitializationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoIntrospectionException {
135            MutablePicoContainer picoContainer = new DefaultPicoContainer();
136            Byte byteValue = new Byte((byte) 5);
137            ConstantParameter parameter = new ConstantParameter(byteValue);
138            assertFalse(parameter.isResolvable(picoContainer, null, Integer.TYPE));
139            Short shortValue = new Short((short) 5);
140            parameter = new ConstantParameter(shortValue);
141            assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE));
142            Integer intValue = new Integer(5);
143            parameter = new ConstantParameter(intValue);
144            assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE));
145            Long longValue = new Long(5);
146            parameter = new ConstantParameter(longValue);
147            assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE));
148            Float floatValue = new Float(5.5);
149            parameter = new ConstantParameter(floatValue);
150            assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE));
151            Double doubleValue = new Double(5.5);
152            parameter = new ConstantParameter(doubleValue);
153            assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE));
154            Boolean booleanValue = new Boolean(true);
155            parameter = new ConstantParameter(booleanValue);
156            assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE));
157            Character charValue = new Character('x');
158            parameter = new ConstantParameter(charValue);
159            assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE));
160        }
161    
162        public void testKeyClashBug118() throws PicoRegistrationException, PicoInitializationException {
163            DefaultPicoContainer pico = new DefaultPicoContainer();
164            pico.registerComponentImplementation("A", String.class, new Parameter[]{
165                new ConstantParameter("A")
166            });
167            pico.registerComponentImplementation("B", String.class, new Parameter[]{
168                new ConstantParameter("A")
169            });
170            new VerifyingVisitor().traverse(pico);
171        }
172    
173    }