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    }