001    package org.picocontainer.lifecycle;
002    
003    import static org.junit.Assert.assertEquals;
004    import org.junit.Test;
005    import org.picocontainer.*;
006    import org.picocontainer.containers.EmptyPicoContainer;
007    import org.picocontainer.monitors.NullComponentMonitor;
008    
009    import static org.picocontainer.Characteristics.CACHE;
010    
011    public 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    }