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 }