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