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     * Original code by Paul Hammant                                             *
009     *****************************************************************************/
010    
011    package org.picocontainer.classname;
012    
013    import static org.junit.Assert.assertNotNull;
014    import static org.junit.Assert.assertTrue;
015    
016    import java.util.List;
017    import java.util.Properties;
018    
019    import org.jmock.Mockery;
020    import org.jmock.integration.junit4.JMock;
021    import org.jmock.integration.junit4.JUnit4Mockery;
022    import org.junit.Test;
023    import org.junit.runner.RunWith;
024    import org.picocontainer.Characteristics;
025    import org.picocontainer.DefaultPicoContainer;
026    import org.picocontainer.MutablePicoContainer;
027    import org.picocontainer.PicoContainer;
028    import org.picocontainer.classname.ClassLoadingPicoContainer;
029    import org.picocontainer.classname.DefaultClassLoadingPicoContainer;
030    import org.picocontainer.behaviors.Caching;
031    import org.picocontainer.monitors.ConsoleComponentMonitor;
032    import org.picocontainer.tck.AbstractPicoContainerTest;
033    
034    /**
035     * @author Paul Hammant
036     */
037    @RunWith(JMock.class)
038    public class DefaultClassLoadingPicoContainerTestCase extends AbstractPicoContainerTest {
039    
040            private Mockery context = new JUnit4Mockery();
041    
042            
043        protected MutablePicoContainer createPicoContainer(PicoContainer parent) {
044            return new DefaultClassLoadingPicoContainer(this.getClass().getClassLoader(), new DefaultPicoContainer(new Caching(), parent));
045        }
046    
047        protected Properties[] getProperties() {
048            return new Properties[] { Characteristics.NONE};
049        }
050    
051        @Test public void testNamedChildContainerIsAccessible()  {
052            StringBuffer sb = new StringBuffer();
053            final ClassLoadingPicoContainer parent = (ClassLoadingPicoContainer) createPicoContainer(null);
054            parent.addComponent(sb);
055            final ClassLoadingPicoContainer child = (ClassLoadingPicoContainer) parent.makeChildContainer("foo");
056            child.addComponent(LifeCycleMonitoring.class,LifeCycleMonitoring.class);
057            LifeCycleMonitoring o = (LifeCycleMonitoring) parent.getComponent((Object)("foo/*" + LifeCycleMonitoring.class.getName()));
058            assertNotNull(o);
059        }
060    
061        @Test public void testNamedChildContainerIsAccessibleForStringKeys() {
062            StringBuffer sb = new StringBuffer();
063            final ClassLoadingPicoContainer parent = (ClassLoadingPicoContainer) createPicoContainer(null);
064            parent.addComponent(sb);
065            final MutablePicoContainer child = parent.makeChildContainer("foo");
066            child.addComponent("lcm",LifeCycleMonitoring.class);
067            Object o = parent.getComponent("foo/lcm");
068            assertNotNull(o);
069            assertTrue(sb.toString().indexOf("-instantiated") != -1);
070        }
071    
072        @Test public void testNamedChildContainerIsAccessibleForClassKeys() {
073            StringBuffer sb = new StringBuffer();
074            final ClassLoadingPicoContainer parent = (ClassLoadingPicoContainer) createPicoContainer(null);
075            parent.addComponent(sb);
076            final MutablePicoContainer child = parent.makeChildContainer("foo");
077            child.addComponent(LifeCycleMonitoring.class,LifeCycleMonitoring.class);
078            Object o = parent.getComponent("foo/*" + LifeCycleMonitoring.class.getName());
079            assertNotNull(o);
080            assertTrue(sb.toString().indexOf("-instantiated") != -1);
081        }
082    
083        @Test public void testMakeRemoveChildContainer() {
084            final ClassLoadingPicoContainer parent = (ClassLoadingPicoContainer) createPicoContainer(null);
085            parent.addComponent("java.lang.String", "This is a test");
086            MutablePicoContainer pico = parent.makeChildContainer();
087            // Verify they are indeed wired together.
088            assertNotNull(pico.getComponent("java.lang.String"));
089            boolean result = parent.removeChildContainer(pico);
090            assertTrue(result);
091        }
092    
093        // test methods inherited. This container is otherwise fully compliant.
094        @Test public void testAcceptImplementsBreadthFirstStrategy() {
095            super.testAcceptImplementsBreadthFirstStrategy();
096        }
097        
098        @Test(expected=IllegalStateException.class)
099        public void testSwapComponentMonitorWithNoComponentMonitorStrategyDelegateThrowsIllegalStateException() {
100            MutablePicoContainer delegate = context.mock(MutablePicoContainer.class);
101            //Delegate it twice for effect.
102            DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer(new DefaultClassLoadingPicoContainer(delegate));
103            pico.changeMonitor(new ConsoleComponentMonitor());
104        }
105        
106        @Test(expected=IllegalStateException.class)
107        public void testCurrentMonitorWithNoComponentMonitorStrategyDelegateThrowsIllegalStateException() {
108            Mockery context = new JUnit4Mockery();
109            MutablePicoContainer delegate = context.mock(MutablePicoContainer.class);
110            //Delegate it twice for effect.
111            DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer(new DefaultClassLoadingPicoContainer(delegate));
112            pico.currentMonitor();          
113        }
114    
115        protected void addContainers(List expectedList) {
116            expectedList.add(DefaultClassLoadingPicoContainer.class);
117            expectedList.add(DefaultPicoContainer.class);
118        }
119    
120    
121        protected void addDefaultComponentFactories(List expectedList) {
122            expectedList.add(Caching.class);
123        }
124    
125    
126    }