001    package org.picocontainer.defaults.issues;
002    
003    import org.junit.Test;
004    import org.picocontainer.MutablePicoContainer;
005    import org.picocontainer.PicoBuilder;
006    import org.picocontainer.Characteristics;
007    
008    import org.picocontainer.injectors.SetterInjection;
009    import static junit.framework.Assert.assertEquals;
010    
011    public class Issue0316TestCase {
012    
013        //@Test
014        public void testGood() {
015            doTest(GoodTarget.class);
016        }
017        
018        @Test
019        public void testBad() {
020            doTest(BadTarget.class);
021        }
022        
023        
024        private void doTest(Class targetClass) {
025            MutablePicoContainer pico = new PicoBuilder(new SetterInjection("inject")).build();
026            pico.addComponent("fruit1", Apple.class);
027            pico.addComponent("fruit2", Pear.class);
028            pico.addComponent(new Integer(42));
029            pico.as(Characteristics.USE_NAMES).addComponent(targetClass);
030            
031            Target target = (Target)pico.getComponent(targetClass);
032            assertEquals("apple", target.eat1());
033            assertEquals("pear", target.eat2());
034            assertEquals(42, target.getNumber());
035        }
036        
037        
038        public static interface Fruit {
039            public String eat();
040        }
041        public static class Apple implements Fruit {
042            public String eat() { return "apple"; }
043        }
044        public static class Pear implements Fruit {
045            public String eat() { return "pear"; }
046        }
047        
048        public static interface Target {
049            String eat1();
050            String eat2();
051            int getNumber();
052        }
053        
054        public static class GoodTarget implements Target {
055            private Fruit fruit1;
056            private Fruit fruit2;
057            private Integer number;
058    
059            public void injectNumber(Integer number)  {
060                this.number = number;
061            }
062    
063            public void injectFruit1(Fruit fruit1) {
064                this.fruit1 = fruit1;
065            }
066    
067            public void injectFruit2(Fruit fruit2) {
068                this.fruit2 = fruit2;
069            }
070            public int getNumber() {
071                return number.intValue();
072            }
073            
074            public String eat1() { return fruit1.eat(); }
075            public String eat2() { return fruit2.eat(); }
076        }
077        
078        public static class BadTarget implements Target {
079            private Fruit fruit1;
080            private Fruit fruit2;
081            private Integer number;
082    
083            public void injectFruit1(Fruit fruit1) {
084                this.fruit1 = fruit1;
085            }
086    
087            public void injectFruit2(Fruit fruit2) {
088                this.fruit2 = fruit2;
089            }
090            
091            public void injectNumber(Integer number)  {
092                this.number = number;
093            }
094    
095            public int getNumber() {
096                return number.intValue();
097            }
098            
099            public String eat1() { return fruit1.eat(); }
100            public String eat2() { return fruit2.eat(); }
101        }
102        
103    }