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