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.junit.Assert.assertEquals;
013    import static org.junit.Assert.assertNotNull;
014    import static org.picocontainer.Characteristics.AUTOMATIC;
015    import static org.picocontainer.behaviors.Behaviors.automatic;
016    import static org.picocontainer.behaviors.Behaviors.caching;
017    
018    import org.junit.Test;
019    import org.picocontainer.DefaultPicoContainer;
020    import org.picocontainer.MutablePicoContainer;
021    import org.picocontainer.PicoBuilder;
022    import org.picocontainer.injectors.ConstructorInjector;
023    import org.picocontainer.lifecycle.NullLifecycleStrategy;
024    import org.picocontainer.monitors.NullComponentMonitor;
025    
026    public class AutomatingTestCase {
027    
028        private static String MESSAGE =
029            "Foo was instantiated, even though it was not required to be given it was not depended on by anything looked up";
030    
031        public static class Foo {
032            public Foo(StringBuilder sb) {
033                sb.append(MESSAGE);
034            }
035        }
036    
037        public static class Bar {
038        }
039    
040        @Test public void testAutomaticBehavior() {
041            DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new Automating()));
042            pico.addComponent(StringBuilder.class);
043            pico.addComponent(Foo.class);
044            pico.addComponent(Bar.class);
045            pico.start();
046            assertNotNull(pico.getComponent(Bar.class));
047            StringBuilder sb = pico.getComponent(StringBuilder.class);
048            assertEquals(MESSAGE, sb.toString());
049            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
050        }
051    
052        @Test public void testAutomaticBehaviorViaAdapter() {
053            DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new Automating()));
054            pico.addComponent(StringBuilder.class);
055            pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy(), false));
056            pico.addComponent(Bar.class);
057            pico.start();
058            assertNotNull(pico.getComponent(Bar.class));
059            StringBuilder sb = pico.getComponent(StringBuilder.class);
060            assertEquals(MESSAGE, sb.toString());
061            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
062        }
063    
064        @Test public void testNonAutomaticBehaviorAsContrastToTheAbove() {
065            DefaultPicoContainer pico = new DefaultPicoContainer(new Caching());
066            pico.addComponent(StringBuilder.class);
067            pico.addComponent(Foo.class);
068            pico.addComponent(Bar.class);
069            pico.start();
070            assertNotNull(pico.getComponent(Bar.class));
071            StringBuilder sb = pico.getComponent(StringBuilder.class);
072            assertEquals("", sb.toString());
073        }
074    
075        @Test public void testNonAutomaticBehaviorAsContrastToTheAboveViaAdapter() {
076            DefaultPicoContainer pico = new DefaultPicoContainer(new Caching());
077            pico.addComponent(StringBuilder.class);
078            pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy(), false));
079            pico.addComponent(Bar.class);
080            pico.start();
081            assertNotNull(pico.getComponent(Bar.class));
082            StringBuilder sb = pico.getComponent(StringBuilder.class);
083            assertEquals("", sb.toString());
084        }
085    
086        @Test public void testAutomaticBehaviorByBuilder() {
087            MutablePicoContainer pico = new PicoBuilder().withCaching().withAutomatic().build();
088            pico.addComponent(StringBuilder.class);
089            pico.addComponent(Foo.class);
090            pico.addComponent(Bar.class);
091            pico.start();
092            assertNotNull(pico.getComponent(Bar.class));
093            StringBuilder sb = pico.getComponent(StringBuilder.class);
094            assertEquals(MESSAGE, sb.toString());
095            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
096        }
097    
098        @Test public void testAutomaticBehaviorByBuilderViaAdapter() {
099            MutablePicoContainer pico = new PicoBuilder().withCaching().withAutomatic().build();
100            pico.addComponent(StringBuilder.class);
101            pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy(), false));
102            pico.addComponent(Bar.class);
103            pico.start();
104            assertNotNull(pico.getComponent(Bar.class));
105            StringBuilder sb = pico.getComponent(StringBuilder.class);
106            assertEquals(MESSAGE, sb.toString());
107            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
108        }
109    
110        @Test public void testAutomaticBehaviorByBuilderADifferentWay() {
111            MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
112            pico.addComponent(StringBuilder.class);
113            pico.addComponent(Foo.class);
114            pico.addComponent(Bar.class);
115            pico.start();
116            assertNotNull(pico.getComponent(Bar.class));
117            StringBuilder sb = pico.getComponent(StringBuilder.class);
118            assertEquals(MESSAGE, sb.toString());
119            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
120        }
121    
122            @Test public void testAutomaticBehaviorByBuilderADifferentWayViaAdapter() {
123            MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
124            pico.addComponent(StringBuilder.class);
125            pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy(), false));
126            pico.addComponent(Bar.class);
127            pico.start();
128            assertNotNull(pico.getComponent(Bar.class));
129            StringBuilder sb = pico.getComponent(StringBuilder.class);
130            assertEquals(MESSAGE, sb.toString());
131                assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
132        }
133    
134        @Test public void testAutomaticBehaviorWorksForAdaptiveBehaviorToo() {
135            MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
136            pico.addComponent(StringBuilder.class);
137            pico.as(AUTOMATIC).addComponent(Foo.class);
138            pico.addComponent(Bar.class);
139            pico.start();
140            assertNotNull(pico.getComponent(Bar.class));
141            StringBuilder sb = pico.getComponent(StringBuilder.class);
142            assertEquals(MESSAGE, sb.toString());
143            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
144        }
145    
146        @Test public void testAutomaticBehaviorWorksForAdaptiveBehaviorTooViaAdapter() {
147            MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
148            pico.addComponent(StringBuilder.class);
149            pico.as(AUTOMATIC).addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy(), false));
150            pico.addComponent(Bar.class);
151            pico.start();
152            assertNotNull(pico.getComponent(Bar.class));
153            StringBuilder sb = pico.getComponent(StringBuilder.class);
154            assertEquals(MESSAGE, sb.toString());
155            assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
156        }
157    
158    }