001package org.picocontainer.parameters;
002
003import static org.junit.Assert.assertEquals;
004import static org.junit.Assert.assertFalse;
005import static org.junit.Assert.assertNotNull;
006import static org.junit.Assert.assertNull;
007
008import java.io.File;
009import java.util.List;
010
011import org.junit.Test;
012import org.picocontainer.Characteristics;
013import org.picocontainer.DefaultPicoContainer;
014import org.picocontainer.MutablePicoContainer;
015import org.picocontainer.NameBinding;
016import org.picocontainer.PicoContainer;
017import org.picocontainer.adapters.NullCA;
018
019/**
020 * test that config parameter does the right job
021 * 
022 * @author Konstantin Pribluda
023 * 
024 */
025public 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}