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            System.out.println("target is " + target.getClass().getName());
033            assertEquals("apple", target.eat1());
034            assertEquals("pear", target.eat2());
035            assertEquals(42, target.getNumber());
036        }
037        
038        
039        public static interface Fruit {
040            public String eat();
041        }
042        public static class Apple implements Fruit {
043            public String eat() { return "apple"; }
044        }
045        public static class Pear implements Fruit {
046            public String eat() { return "pear"; }
047        }
048        
049        public static interface Target {
050            String eat1();
051            String eat2();
052            int getNumber();
053        }
054        
055        public static class GoodTarget implements Target {
056            private Fruit fruit1;
057            private Fruit fruit2;
058            private Integer number;
059    
060            public void injectNumber(Integer number)  {
061                this.number = number;
062            }
063    
064            public void injectFruit1(Fruit fruit1) {
065                this.fruit1 = fruit1;
066            }
067    
068            public void injectFruit2(Fruit fruit2) {
069                this.fruit2 = fruit2;
070            }
071            public int getNumber() {
072                return number.intValue();
073            }
074            
075            public String eat1() { return fruit1.eat(); }
076            public String eat2() { return fruit2.eat(); }
077        }
078        
079        public static class BadTarget implements Target {
080            private Fruit fruit1;
081            private Fruit fruit2;
082            private Integer number;
083    
084            public void injectFruit1(Fruit fruit1) {
085                this.fruit1 = fruit1;
086            }
087    
088            public void injectFruit2(Fruit fruit2) {
089                this.fruit2 = fruit2;
090            }
091            
092            public void injectNumber(Integer number)  {
093                this.number = number;
094            }
095    
096            public int getNumber() {
097                return number.intValue();
098            }
099            
100            public String eat1() { return fruit1.eat(); }
101            public String eat2() { return fruit2.eat(); }
102        }
103        
104    }