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