001    /*****************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *                                                                           *
008     * Original code by                                                          *
009     *****************************************************************************/
010    package org.picocontainer.behaviors;
011    
012    import static org.picocontainer.behaviors.Behaviors.caching;
013    import static org.picocontainer.behaviors.Behaviors.*;
014    import org.picocontainer.DefaultPicoContainer;
015    import org.picocontainer.PicoBuilder;
016    import org.picocontainer.MutablePicoContainer;
017    import org.picocontainer.lifecycle.NullLifecycleStrategy;
018    import org.picocontainer.monitors.NullComponentMonitor;
019    import org.picocontainer.injectors.ConstructorInjector;
020    import static org.picocontainer.Characteristics.*;
021    
022    import junit.framework.TestCase;
023    
024    public class AutomaticTestCase extends TestCase {
025    
026        private static String MESSAGE =
027            "Foo was instantiated, even though it was not required to be given it was not depended on by anything looked up";
028    
029        public static class Foo {
030            public Foo(StringBuilder sb) {
031                sb.append(MESSAGE);
032            }
033        }
034    
035        public static class Bar {
036        }
037    
038        public void testAutomaticBehavior() {
039            DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new Automatic()));
040            pico.addComponent(StringBuilder.class);
041            pico.addComponent(Foo.class);
042            pico.addComponent(Bar.class);
043            pico.start();
044            assertNotNull(pico.getComponent(Bar.class));
045            StringBuilder sb = pico.getComponent(StringBuilder.class);
046            assertEquals(MESSAGE, sb.toString());
047            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
048        }
049    
050        public void testAutomaticBehaviorViaAdapter() {
051            DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new Automatic()));
052            pico.addComponent(StringBuilder.class);
053            pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
054            pico.addComponent(Bar.class);
055            pico.start();
056            assertNotNull(pico.getComponent(Bar.class));
057            StringBuilder sb = pico.getComponent(StringBuilder.class);
058            assertEquals(MESSAGE, sb.toString());
059            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
060        }
061    
062        public void testNonAutomaticBehaviorAsContrastToTheAbove() {
063            DefaultPicoContainer pico = new DefaultPicoContainer(new Caching());
064            pico.addComponent(StringBuilder.class);
065            pico.addComponent(Foo.class);
066            pico.addComponent(Bar.class);
067            pico.start();
068            assertNotNull(pico.getComponent(Bar.class));
069            StringBuilder sb = pico.getComponent(StringBuilder.class);
070            assertEquals("", sb.toString());
071        }
072    
073        public void testNonAutomaticBehaviorAsContrastToTheAboveViaAdapter() {
074            DefaultPicoContainer pico = new DefaultPicoContainer(new Caching());
075            pico.addComponent(StringBuilder.class);
076            pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
077            pico.addComponent(Bar.class);
078            pico.start();
079            assertNotNull(pico.getComponent(Bar.class));
080            StringBuilder sb = pico.getComponent(StringBuilder.class);
081            assertEquals("", sb.toString());
082        }
083    
084        public void testAutomaticBehaviorByBuilder() {
085            MutablePicoContainer pico = new PicoBuilder().withCaching().withAutomatic().build();
086            pico.addComponent(StringBuilder.class);
087            pico.addComponent(Foo.class);
088            pico.addComponent(Bar.class);
089            pico.start();
090            assertNotNull(pico.getComponent(Bar.class));
091            StringBuilder sb = pico.getComponent(StringBuilder.class);
092            assertEquals(MESSAGE, sb.toString());
093            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
094        }
095    
096        public void testAutomaticBehaviorByBuilderViaAdapter() {
097            MutablePicoContainer pico = new PicoBuilder().withCaching().withAutomatic().build();
098            pico.addComponent(StringBuilder.class);
099            pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
100            pico.addComponent(Bar.class);
101            pico.start();
102            assertNotNull(pico.getComponent(Bar.class));
103            StringBuilder sb = pico.getComponent(StringBuilder.class);
104            assertEquals(MESSAGE, sb.toString());
105            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
106        }
107    
108        public void testAutomaticBehaviorByBuilderADifferentWay() {
109            MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
110            pico.addComponent(StringBuilder.class);
111            pico.addComponent(Foo.class);
112            pico.addComponent(Bar.class);
113            pico.start();
114            assertNotNull(pico.getComponent(Bar.class));
115            StringBuilder sb = pico.getComponent(StringBuilder.class);
116            assertEquals(MESSAGE, sb.toString());
117            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
118        }
119    
120            public void testAutomaticBehaviorByBuilderADifferentWayViaAdapter() {
121            MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
122            pico.addComponent(StringBuilder.class);
123            pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
124            pico.addComponent(Bar.class);
125            pico.start();
126            assertNotNull(pico.getComponent(Bar.class));
127            StringBuilder sb = pico.getComponent(StringBuilder.class);
128            assertEquals(MESSAGE, sb.toString());
129                assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
130        }
131    
132        public void testAutomaticBehaviorWorksForAdaptiveBehaviorToo() {
133            MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
134            pico.addComponent(StringBuilder.class);
135            pico.as(AUTOMATIC).addComponent(Foo.class);
136            pico.addComponent(Bar.class);
137            pico.start();
138            assertNotNull(pico.getComponent(Bar.class));
139            StringBuilder sb = pico.getComponent(StringBuilder.class);
140            assertEquals(MESSAGE, sb.toString());
141            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
142        }
143    
144        public void testAutomaticBehaviorWorksForAdaptiveBehaviorTooViaAdapter() {
145            MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
146            pico.addComponent(StringBuilder.class);
147            pico.as(AUTOMATIC).addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
148            pico.addComponent(Bar.class);
149            pico.start();
150            assertNotNull(pico.getComponent(Bar.class));
151            StringBuilder sb = pico.getComponent(StringBuilder.class);
152            assertEquals(MESSAGE, sb.toString());
153            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
154        }
155    
156    }