001 package org.picocontainer.parameters;
002
003 import static org.junit.Assert.assertEquals;
004 import static org.junit.Assert.assertFalse;
005 import static org.junit.Assert.assertNotNull;
006 import static org.junit.Assert.assertNull;
007
008 import java.io.File;
009 import java.util.List;
010
011 import org.junit.Test;
012 import org.picocontainer.Characteristics;
013 import org.picocontainer.DefaultPicoContainer;
014 import org.picocontainer.MutablePicoContainer;
015 import org.picocontainer.NameBinding;
016 import org.picocontainer.PicoContainer;
017
018 /**
019 * test that config parameter does the right job
020 *
021 * @author k.pribluda
022 *
023 */
024 public class ConfigParameterTestCase {
025
026
027 // defaultparameter name, just for convenience
028 NameBinding paramNameBinding = new NameBinding() {
029 public String getName() {
030 return "gloo.blum";
031 }
032
033 };
034
035 @Test public void testThatNoEntryIsWorkingProperly() throws Exception {
036 PicoContainer container = new DefaultPicoContainer();
037 ComponentParameter parameter = new ComponentParameter("gloo.blum");
038
039 // shall be not resolvable
040 assertFalse(parameter.isResolvable(container, null, String.class,
041 paramNameBinding, false, null));
042
043 // shall resolve instance as null
044 assertNull(parameter.resolveInstance(container, null, String.class,
045 paramNameBinding, false, null));
046 }
047
048 @Test public void testThatNotStringEntryIsNotResolved() throws Exception {
049 MutablePicoContainer container = new DefaultPicoContainer();
050 container.addComponent("gloo.blum", new Integer(239));
051
052 ComponentParameter parameter = new ComponentParameter("gloo.blum");
053
054 // shall be not resolvable
055 assertFalse(parameter.isResolvable(container, null, String.class,
056 paramNameBinding, false, null));
057
058 // shall resolve instance as null
059 assertNull(parameter.resolveInstance(container, null, String.class,
060 paramNameBinding, false, null));
061
062 }
063
064 /**
065 * shall resolve as ddifferent classes
066 *
067 * @throws Exception
068 */
069 @Test public void testThatResolvedSuccessfully() throws Exception {
070 MutablePicoContainer container = new DefaultPicoContainer();
071 container.addComponent("gloo.blum", "239");
072
073 ComponentParameter parameter = new ComponentParameter("gloo.blum");
074
075 assertEquals(new Integer(239), parameter.resolveInstance(container,
076 null, Integer.class, paramNameBinding, false, null));
077 assertEquals("239", parameter.resolveInstance(container, null,
078 String.class, paramNameBinding, false, null));
079 }
080
081 /**
082 * shall bomb properly if no suitable converter found
083 *
084 */
085 @Test public void testThatUnavailableConverterProducesCorrectException() {
086 MutablePicoContainer container = new DefaultPicoContainer();
087 container.addComponent("gloo.blum", "239");
088
089 ComponentParameter parameter = new ComponentParameter("gloo.blum");
090
091 // try {
092 // Object foo = parameter.resolveInstance(container, null, List.class, paramNameBinding, false);
093 // fail("failed to bomb on unavailable converter");
094 // } catch (ConfigParameter.NoConverterAvailableException ex) {
095 // // that's anticipated
096 // }
097 Object foo = parameter.resolveInstance(container, null, List.class, paramNameBinding, false, null);
098 assertNull(foo);
099
100 }
101
102 @Test public void testComponentInstantiation() {
103 DefaultPicoContainer properties = new DefaultPicoContainer();
104 properties.addComponent("numericProperty", "239");
105 properties.addComponent("doubleProperty", "17.95");
106 properties.addComponent("stringProperty", "foo.bar");
107
108 DefaultPicoContainer container = new DefaultPicoContainer(properties);
109 container.addComponent("configured", ExternallyConfiguredComponent.class,
110 new ComponentParameter("numericProperty"),
111 // resolves as string
112 new ComponentParameter("stringProperty"),
113 // resolves as file
114 new ComponentParameter("stringProperty"),
115 // resolves as double
116 new ComponentParameter("doubleProperty")
117
118 );
119
120
121 ExternallyConfiguredComponent component = (ExternallyConfiguredComponent) container.getComponent("configured");
122
123 assertNotNull(component);
124 assertEquals(239,component.getLongValue());
125 assertEquals("foo.bar",component.getStringParameter());
126 assertEquals(new File("foo.bar"),component.getFileParameter());
127 assertEquals(17.95,component.getDoubleParameter(),0);
128 }
129
130 @Test public void testComponentInstantiationViaParamNameAssociations() {
131 DefaultPicoContainer properties = new DefaultPicoContainer();
132 properties.addConfig("longValue", "239");
133 properties.addConfig("doubleParameter", "17.95");
134 properties.addConfig("stringParameter", "foo.bar");
135 properties.addConfig("fileParameter", "bar.txt");
136
137 DefaultPicoContainer container = new DefaultPicoContainer(properties);
138 container.as(Characteristics.USE_NAMES).addComponent(ExternallyConfiguredComponent.class);
139
140 ExternallyConfiguredComponent component = container.getComponent(ExternallyConfiguredComponent.class);
141
142 assertNotNull(component);
143 assertEquals(239,component.getLongValue());
144 assertEquals("foo.bar",component.getStringParameter());
145 assertEquals(new File("bar.txt"),component.getFileParameter());
146 assertEquals(17.95,component.getDoubleParameter(),0);
147 }
148
149
150
151 /**
152 * test component to show automatic conversion
153 *
154 * @author ko5tik
155 */
156
157 public static class ExternallyConfiguredComponent {
158 long longValue;
159
160 String stringParameter;
161
162 File fileParameter;
163
164 double doubleParameter;
165
166 public ExternallyConfiguredComponent(long longValue, String stringParameter, File fileParameter, double doubleParameter) {
167 super();
168 this.longValue = longValue;
169 this.stringParameter = stringParameter;
170 this.fileParameter = fileParameter;
171 this.doubleParameter = doubleParameter;
172 }
173
174 public double getDoubleParameter() {
175 return doubleParameter;
176 }
177
178 public File getFileParameter() {
179 return fileParameter;
180 }
181
182 public long getLongValue() {
183 return longValue;
184 }
185
186 public String getStringParameter() {
187 return stringParameter;
188 }
189
190 public void setDoubleParameter(double doubleParameter) {
191 this.doubleParameter = doubleParameter;
192 }
193
194 public void setFileParameter(File fileParameter) {
195 this.fileParameter = fileParameter;
196 }
197
198 public void setLongValue(long longValue) {
199 this.longValue = longValue;
200 }
201
202 public void setStringParameter(String stringParameter) {
203 this.stringParameter = stringParameter;
204 }
205
206 }
207
208 }