001package org.picocontainer.injectors;
002
003import org.junit.Test;
004import org.picocontainer.*;
005import org.picocontainer.monitors.NullComponentMonitor;
006import org.picocontainer.monitors.WriterComponentMonitor;
007import org.picocontainer.tck.AbstractComponentAdapterTest;
008import org.picocontainer.testmodel.NullLifecycle;
009import org.picocontainer.testmodel.SimpleTouchable;
010import org.picocontainer.testmodel.Touchable;
011
012import java.io.PrintWriter;
013import java.util.Properties;
014
015import static org.junit.Assert.assertEquals;
016import static org.junit.Assert.assertTrue;
017
018public class LifecycleAdapterTestCase {
019
020    private final ConstructorInjector INJECTOR = new ConstructorInjector(
021            Foo.class, Foo.class, new Parameter[0],
022            new NullComponentMonitor(), false);
023
024    private AbstractComponentAdapterTest.RecordingLifecycleStrategy strategy = new AbstractComponentAdapterTest.RecordingLifecycleStrategy(new StringBuffer());
025
026    AbstractInjectionFactory ais = new AbstractInjectionFactory() {
027        public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor, LifecycleStrategy lifecycleStrategy, Properties componentProperties, Object componentKey, Class<T> componentImplementation, Parameter... parameters) throws PicoCompositionException {
028            return wrapLifeCycle(INJECTOR, lifecycleStrategy);
029        }
030    };
031
032    @Test
033    public void passesOnLifecycleOperations() {
034
035        LifecycleStrategy adapter = (LifecycleStrategy) ais.createComponentAdapter(new NullComponentMonitor(), strategy, new Properties(), null, null, new Parameter[0]);
036        assertEquals("org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter", adapter.getClass().getName());
037        Touchable touchable = new SimpleTouchable();
038        adapter.start(touchable);
039        adapter.stop(touchable);
040        adapter.dispose(touchable);
041        assertEquals("<start<stop<dispose", strategy.recording());
042    }
043
044    @Test
045    public void canHaveMonitorChanged() {
046        ComponentMonitorStrategy adapter = (ComponentMonitorStrategy) ais.createComponentAdapter(new NullComponentMonitor(), strategy, new Properties(), Foo.class, Foo.class, new Parameter[0]);
047        assertTrue(adapter.currentMonitor() instanceof NullComponentMonitor);
048        adapter.changeMonitor(new WriterComponentMonitor(new PrintWriter(System.out)));
049        assertTrue(adapter.currentMonitor() instanceof WriterComponentMonitor);
050
051    }
052
053    public static class Foo implements Startable {
054        public void start() {
055        }
056        public void stop() {
057        }
058    }
059
060}