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