001    package org.picocontainer.foo;
002    
003    import org.junit.Test;
004    import org.picocontainer.Characteristics;
005    import org.picocontainer.DefaultPicoContainer;
006    import org.picocontainer.Emjection;
007    import org.picocontainer.MutablePicoContainer;
008    import org.picocontainer.behaviors.Caching;
009    
010    import static junit.framework.Assert.assertEquals;
011    import static junit.framework.Assert.assertSame;
012    import static org.junit.Assert.assertNotSame;
013    import static org.picocontainer.Characteristics.EMJECTION_ENABLED;
014    
015    public class EmjectionTestCase {
016    
017        @Test
018        public void basicEmjection() {
019            StringBuilder sb = new StringBuilder();
020            MutablePicoContainer pico = new DefaultPicoContainer();
021            pico.addComponent(Antelope.class);
022            pico.as(EMJECTION_ENABLED).addComponent(ZooKeeper.class);
023            pico.addComponent(sb);
024            ZooKeeper zooKeeper = pico.getComponent(ZooKeeper.class);
025            zooKeeper.doHeadCount();
026            assertEquals("giraffe=true, antelope=true", sb.toString());
027        }
028    
029    
030        @Test
031        public void testThatTransientNatureOfAdhocDependencies() {
032            MutablePicoContainer pico = new DefaultPicoContainer(new Caching());
033            pico.addComponent(Antelope.class);
034            pico.as(EMJECTION_ENABLED).addComponent(ZooKeeper.class);
035            pico.addComponent(new StringBuilder());
036            ZooKeeper component = pico.getComponent(ZooKeeper.class);
037            component.doHeadCount();
038            Zoo zoo1 = component.zoo;
039            component = pico.getComponent(ZooKeeper.class);
040            component.doHeadCount();
041            Zoo zoo2 = component.zoo;
042            zoo2.headCount();
043            assertNotSame(zoo1, zoo2); // made one the fly
044            assertNotSame(zoo1.giraffe, zoo2.giraffe); // made one the fly
045            assertSame(zoo1.antelope, zoo2.antelope); // in the parent-most picocontainer
046            assertSame(zoo1.sb, zoo2.sb); // in the parent-most picocontainer
047        }
048    
049    
050        public static class Zoo {
051            private final Emjection emjection = new Emjection();
052    
053            private Giraffe giraffe;
054            private Antelope antelope;
055            private StringBuilder sb;
056    
057            public Zoo(Giraffe giraffe, Antelope antelope, StringBuilder sb) {
058                this.giraffe = giraffe;
059                this.antelope = antelope;
060                this.sb = sb;
061            }
062    
063            public void headCount() {
064                sb.append("giraffe=").append(giraffe != null);
065                sb.append(", antelope=").append(antelope != null);
066            }
067        }
068    
069    
070        public static class ZooKeeper {
071    
072            private final Emjection emjection = new Emjection();
073            private Zoo zoo;
074    
075            public void doHeadCount() {
076                zoo = neu(Zoo.class, new Giraffe());
077                zoo.headCount();
078            }
079    
080            <T> T neu(Class<T> type, Object... args) {
081                return Emjection.neu(type, emjection, args);
082            }
083    
084        }
085    
086        public static class Giraffe {
087        }
088        public static class Antelope {
089        }
090    
091    
092    }