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 }