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