001package org.picocontainer.converters;
002
003import org.junit.Test;
004import org.picocontainer.Converters;
005import org.picocontainer.DefaultPicoContainer;
006import org.picocontainer.PicoContainer;
007import org.picocontainer.containers.CompositePicoContainer;
008import org.picocontainer.containers.EmptyPicoContainer;
009
010import static junit.framework.Assert.assertTrue;
011import static org.junit.Assert.assertEquals;
012import static org.junit.Assert.assertFalse;
013
014public 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}