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 }