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 }