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