001 package org.picocontainer.converters;
002
003 import org.junit.Test;
004 import org.picocontainer.Converters;
005 import org.picocontainer.DefaultPicoContainer;
006 import org.picocontainer.PicoContainer;
007 import org.picocontainer.containers.CompositePicoContainer;
008 import org.picocontainer.containers.EmptyPicoContainer;
009
010 import static junit.framework.Assert.assertTrue;
011 import static org.junit.Assert.assertEquals;
012 import static org.junit.Assert.assertFalse;
013
014 public class ConverterTestCase {
015
016 @Test
017 public void builtInConversionByDefault() {
018 DefaultPicoContainer dpc = new DefaultPicoContainer();
019 assertTrue(dpc.getConverters() instanceof BuiltInConverters);
020 }
021
022 @Test
023 public void canOverrideConverter() {
024 DefaultPicoContainer dpc = new DefaultPicoContainer() {
025 @Override
026 public Converters getConverters() {
027 return new BuiltInConverters() {
028 @Override
029 protected void addBuiltInConverters() {
030 addConverter(new MyConverter(), Boolean.class);
031
032 }
033 };
034 }
035 };
036
037 //Verify use of MyConverter instead of usual BooleanConverter
038 int oldInvocationCount = MyConverter.invocationCount;
039 dpc.getConverters().convert("true", Boolean.class);
040 assertEquals(oldInvocationCount + 1, MyConverter.invocationCount);
041 }
042
043 @Test
044 public void parentContainerSuppliesByDefault() {
045 PicoContainer parent = new DefaultPicoContainer() {
046 @Override
047 public Converters getConverters() {
048 return new BuiltInConverters() {
049 @Override
050 protected void addBuiltInConverters() {
051 addConverter(new MyConverter(), Boolean.class);
052
053 }
054 };
055 }
056 };
057 DefaultPicoContainer dpc = new DefaultPicoContainer(parent);
058 //Verify use of MyConverter instead of usual
059 int oldInvocationCount = MyConverter.invocationCount;
060 dpc.getConverters().convert("true", Boolean.class);
061 assertEquals(oldInvocationCount + 1, MyConverter.invocationCount);
062 }
063
064 @Test
065 public void parentContainerDoesNotSuppliesByDefaultIfItIsNotAConversion() {
066 PicoContainer parent = new EmptyPicoContainer();
067 DefaultPicoContainer dpc = new DefaultPicoContainer(parent);
068 assertTrue(dpc.getConverters() instanceof BuiltInConverters);
069 }
070
071 @Test
072 public void compositesPossible() {
073 PicoContainer one = new DefaultPicoContainer() {
074 @Override
075 public Converters getConverters() {
076 return new BuiltInConverters() {
077 @Override
078 protected void addBuiltInConverters() {
079 addConverter(new BooleanConverter(), Boolean.class);
080
081 }
082 };
083 }
084 };
085 PicoContainer two = new DefaultPicoContainer() {
086 @Override
087 public Converters getConverters() {
088 return new BuiltInConverters() {
089 @Override
090 protected void addBuiltInConverters() {
091 addConverter(new ShortConverter(), Short.class);
092
093 }
094 };
095 }
096 };
097 CompositePicoContainer compositePC = new CompositePicoContainer(one, two);
098 Converters converter = compositePC.getConverters();
099 assertFalse(converter.canConvert(Character.class));
100 assertTrue(converter.canConvert(Short.class));
101 assertTrue(converter.canConvert(Boolean.class));
102 assertEquals(null, converter.convert("a", Character.class));
103 assertEquals((short)12, converter.convert("12", Short.class));
104 assertEquals(Boolean.TRUE, converter.convert("TRUE", Boolean.class));
105
106 }
107
108
109 public static class MyConverter extends BooleanConverter {
110 public static int invocationCount = 0;
111
112 /**
113 * {@inheritDoc}
114 * @see org.picocontainer.converters.BooleanConverter#convert(java.lang.String)
115 */
116 @Override
117 public Boolean convert(String paramValue) {
118 invocationCount++;
119 return super.convert(paramValue);
120 }
121 }
122
123 }