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    package org.picocontainer.lifecycle;
009    
010    import org.junit.Before;
011    import org.junit.Test;
012    import org.picocontainer.DefaultPicoContainer;
013    import org.picocontainer.LifecycleStrategy;
014    import org.picocontainer.MutablePicoContainer;
015    import org.picocontainer.behaviors.Caching;
016    import org.picocontainer.containers.EmptyPicoContainer;
017    import org.picocontainer.monitors.NullComponentMonitor;
018    
019    import javax.annotation.PostConstruct;
020    import javax.annotation.PreDestroy;
021    
022    import static org.junit.Assert.assertEquals;
023    
024    /**
025     *
026     * @author Mauro Talevi
027     */
028    public class JavaEE5LifecycleStrategyTestCase {
029    
030        MutablePicoContainer pico;
031    
032        public static class ProPostAnnotationJava5Startable {
033    
034            protected final StringBuilder sb;
035    
036            public ProPostAnnotationJava5Startable(StringBuilder sb) {
037                this.sb = sb;
038            }
039    
040            @PostConstruct
041            public void post() {
042                sb.append("post()");
043            }
044    
045            @PreDestroy
046            public void pre() {
047                sb.append("pre()");
048            }
049    
050        }
051    
052        public static class ProPostAnnotationJava5Startable2 extends ProPostAnnotationJava5Startable {
053    
054            public ProPostAnnotationJava5Startable2(StringBuilder sb) {
055                super(sb);
056            }
057    
058            @PostConstruct
059            public void subPot() {
060                sb.append("subPost()");
061            }
062    
063            @PreDestroy
064            public void subPre() {
065                sb.append("subPre()");
066            }
067    
068        }
069    
070        private LifecycleStrategy strategy;
071    
072        @Before
073        public void setUp(){
074            strategy = new JavaEE5LifecycleStrategy(new NullComponentMonitor());
075            pico = new DefaultPicoContainer(new Caching(), strategy, new EmptyPicoContainer());
076            pico.addComponent(StringBuilder.class);
077            pico.addComponent(ProPostAnnotationJava5Startable.class);
078        }
079    
080        @Test public void testStartable(){
081            pico.start();
082            assertEquals("post()", pico.getComponent(StringBuilder.class).toString());
083        }
084    
085        @Test public void testStopHasNoMeaning(){
086            pico.start();
087            pico.stop();
088            assertEquals("post()", pico.getComponent(StringBuilder.class).toString());
089        }
090    
091        @Test public void testDispose(){
092            pico.start();
093            pico.dispose();
094            assertEquals("post()pre()", pico.getComponent(StringBuilder.class).toString());
095        }
096    
097        @Test public void testDisposeOfSubClass(){
098            pico.removeComponent(ProPostAnnotationJava5Startable.class);
099            pico.addComponent(ProPostAnnotationJava5Startable2.class);
100            pico.start();
101            pico.dispose();
102            assertEquals("post()subPost()subPre()pre()", pico.getComponent(StringBuilder.class).toString());
103        }
104    
105        @Test public void testSerializable(){
106        }
107    
108         public static class ProPostAnnotationJava5Startable3 extends ProPostAnnotationJava5Startable {
109    
110           public ProPostAnnotationJava5Startable3(StringBuilder sb) {
111               super(sb);
112           }
113    
114           @PostConstruct
115           @Override
116           public void post() {
117               sb.append("subPost3()");
118           }
119    
120           @PreDestroy
121           public void subPre() {
122               sb.append("subPre3()");
123           }
124       }
125    
126       @Test
127       public void testLifecycleOfSubclassWhichOverrides(){
128           pico.removeComponent(ProPostAnnotationJava5Startable.class);
129           pico.addComponent(ProPostAnnotationJava5Startable3.class);
130           pico.start();
131           pico.dispose();
132           assertEquals("subPost3()subPre3()pre()", pico.getComponent(StringBuilder.class).toString());
133       }
134    
135    }