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 }