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 *****************************************************************************/
010package org.picocontainer.behaviors;
011
012import static org.junit.Assert.assertEquals;
013import static org.junit.Assert.assertNotNull;
014import static org.picocontainer.Characteristics.AUTOMATIC;
015import static org.picocontainer.behaviors.Behaviors.automatic;
016import static org.picocontainer.behaviors.Behaviors.caching;
017
018import org.junit.Test;
019import org.picocontainer.ComponentAdapter;
020import org.picocontainer.DefaultPicoContainer;
021import org.picocontainer.MutablePicoContainer;
022import org.picocontainer.PicoBuilder;
023import org.picocontainer.injectors.ConstructorInjector;
024import org.picocontainer.lifecycle.NullLifecycleStrategy;
025import org.picocontainer.monitors.NullComponentMonitor;
026
027public 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}