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