001package org.picocontainer.lifecycle;
002
003import static org.junit.Assert.assertEquals;
004import org.junit.Test;
005import org.picocontainer.*;
006import org.picocontainer.containers.EmptyPicoContainer;
007import org.picocontainer.monitors.NullComponentMonitor;
008
009import static org.picocontainer.Characteristics.CACHE;
010
011public class LazyLifecycleStrategyTestCase {
012
013    @Test
014    public void testStartStopAndDisposeCanBeLazy() {
015        final StringBuilder sb = new StringBuilder();
016        MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) {
017            @Override
018            public boolean isLazy(ComponentAdapter<?> adapter) {
019                return true;
020            }
021        }, new EmptyPicoContainer());        
022        pico.addComponent(sb);
023        pico.as(CACHE).addComponent(MyStartableComp.class);
024        pico.start();
025        assertEquals("", sb.toString()); // normally would be "<" here
026        pico.getComponent(MyStartableComp.class);
027        pico.getComponent(MyStartableComp.class);
028        assertEquals("<", sb.toString()); // only one start() issued even if two or more getComponents
029        pico.stop();
030        assertEquals("<>", sb.toString());
031        pico.dispose();
032        assertEquals("<>!", sb.toString());
033    }
034
035    @Test
036    public void testStartStopAndDisposeCanBeLazyWithoutGet() {
037        final StringBuilder sb = new StringBuilder();
038        MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) {
039            @Override
040            public boolean isLazy(ComponentAdapter<?> adapter) {
041                return true;
042            }
043        }, new EmptyPicoContainer());
044        pico.addComponent(sb);
045        pico.as(CACHE).addComponent(MyStartableComp.class);
046        pico.start();
047        assertEquals("", sb.toString()); 
048        pico.stop();
049        assertEquals("", sb.toString());
050        pico.dispose();
051        assertEquals("", sb.toString());
052    }
053
054    @Test
055    public void testStartStopAndDisposeCanBeConditionallyLazy() {
056        final StringBuilder sb = new StringBuilder();
057        MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) {
058            @Override
059            public boolean isLazy(ComponentAdapter<?> adapter) {
060                return adapter.getComponentImplementation() == MyStartableComp.class;
061            }
062        }, new EmptyPicoContainer());
063        pico.addComponent(sb);
064        pico.as(CACHE).addComponent(MyStartableComp.class);
065        pico.as(CACHE).addComponent(MyDifferentStartableComp.class);
066        pico.start();
067        assertEquals("{", sb.toString()); // one component started, one not
068        pico.getComponent(MyStartableComp.class);
069        pico.getComponent(MyStartableComp.class); // should not start a second time
070        assertEquals("{<", sb.toString()); // both components now started, one lazily.
071        pico.stop();
072        assertEquals("{<}>", sb.toString());
073        pico.dispose();
074        assertEquals("{<}>?!", sb.toString());
075    }
076
077    public static class MyStartableComp implements Startable, Disposable {
078        private StringBuilder sb;
079
080        public MyStartableComp(StringBuilder sb) {
081            this.sb = sb;
082        }
083
084        public void start() {
085            sb.append("<");
086        }
087
088        public void stop() {
089            sb.append(">");
090        }
091
092        public void dispose() {
093            sb.append("!");
094        }
095    }
096
097    public static class MyDifferentStartableComp implements Startable, Disposable {
098        private StringBuilder sb;
099
100        public MyDifferentStartableComp(StringBuilder sb) {
101            this.sb = sb;
102        }
103
104        public void start() {
105            sb.append("{");
106        }
107
108        public void stop() {
109            sb.append("}");
110        }
111
112        public void dispose() {
113            sb.append("?");
114        }
115    }
116
117}