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 }