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    }