001    /*******************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.
003     * ---------------------------------------------------------------------------
004     * The software in this package is published under the terms of the BSD style
005     * license a copy of which has been included with this distribution in the
006     * LICENSE.txt file.
007     ******************************************************************************/
008    package org.picocontainer.script;
009    
010    import static org.junit.Assert.assertNotSame;
011    
012    import org.jmock.Expectations;
013    import org.jmock.Mockery;
014    import org.jmock.integration.junit4.JMock;
015    import org.junit.Test;
016    import org.junit.runner.RunWith;
017    import org.picocontainer.DefaultPicoContainer;
018    import org.picocontainer.MutablePicoContainer;
019    import org.picocontainer.PicoContainer;
020    import org.picocontainer.Startable;
021    import org.picocontainer.tck.MockFactory;
022    
023    /**
024     * @author Aslak Hellesøy
025     * @author Mauro Talevi
026     */
027    @RunWith(JMock.class)
028    public class LifecycleContainerBuilderTestCase {
029    
030        private Mockery mockery = MockFactory.mockeryWithCountingNamingScheme();
031    
032        @Test
033        public void testBuildContainerCreatesANewChildContainerAndStartsItButNotTheParent() {
034            final Startable childStartable = mockery.mock(Startable.class);
035            mockery.checking(new Expectations() {
036                {
037                    one(childStartable).start();
038                    one(childStartable).stop();
039                }
040            });
041    
042            AbstractContainerBuilder builder = new LifecycleContainerBuilder(childStartable);
043    
044            MutablePicoContainer parent = new DefaultPicoContainer();
045    
046            final Startable parentStartable = mockery.mock(Startable.class);
047            parent.addComponent(parentStartable);
048    
049            PicoContainer childContainer = builder.buildContainer(parent, null, true);
050            // PicoContainer.getParent() is now ImmutablePicoContainer
051            assertNotSame(parent, childContainer.getParent());
052    
053            builder.killContainer(childContainer);
054        }
055    
056        static class LifecycleContainerBuilder extends DefaultContainerBuilder {
057    
058            private final Startable childStartable;
059    
060            public LifecycleContainerBuilder(Startable childStartable) {
061                this.childStartable = childStartable;
062            }
063    
064            @Override
065            protected MutablePicoContainer createContainer(PicoContainer parentContainer, Object assemblyScope) {
066                MutablePicoContainer container = (MutablePicoContainer) super.createContainer(parentContainer, assemblyScope);
067                container.addComponent(childStartable);
068                return container;
069            }
070            
071        }
072    }