001    package org.picocontainer.defaults;
002    
003    import org.jmock.Mock;
004    import org.jmock.MockObjectTestCase;
005    import org.picocontainer.ComponentAdapter;
006    import org.picocontainer.ComponentMonitor;
007    import org.picocontainer.LifecycleManager;
008    import org.picocontainer.PicoContainer;
009    import org.picocontainer.PicoIntrospectionException;
010    import org.picocontainer.testmodel.SimpleTouchable;
011    import org.picocontainer.testmodel.Touchable;
012    
013    /**
014     * @author Mauro Talevi
015     * @version $Revision: 2200 $
016     */
017    public class DecoratingComponentAdapterTestCase extends MockObjectTestCase {
018    
019        public void testDecoratingComponentAdapterDelegatesToMonitorThatDoesSupportStrategy() {
020            DecoratingComponentAdapter adapter = new DecoratingComponentAdapter(mockComponentAdapterThatDoesSupportStrategy());
021            adapter.changeMonitor(mockMonitorWithNoExpectedMethods());
022            assertNotNull(adapter.currentMonitor());
023        }
024        
025        public void testDecoratingComponentAdapterDelegatesToMonitorThatDoesNotSupportStrategy() {
026            DecoratingComponentAdapter adapter = new DecoratingComponentAdapter(mockComponentAdapter());
027            adapter.changeMonitor(mockMonitorWithNoExpectedMethods());
028            try {
029                adapter.currentMonitor();
030                fail("PicoIntrospectionException expected");
031            } catch (PicoIntrospectionException e) {
032                assertEquals("No component monitor found in delegate", e.getMessage());
033            }
034        }
035        
036        public void testDecoratingComponentAdapterDelegatesLifecycleManagement() {
037            DecoratingComponentAdapter adapter = new DecoratingComponentAdapter(mockComponentAdapterThatCanManageLifecycle());
038            PicoContainer pico = new DefaultPicoContainer();
039            adapter.start(pico);
040            adapter.stop(pico);
041            adapter.dispose(pico);
042            Touchable touchable = new SimpleTouchable();
043            adapter.start(touchable);
044            adapter.stop(touchable);
045            adapter.dispose(touchable);
046        }
047    
048        public void testDecoratingComponentAdapterIgnoresLifecycleManagementIfDelegateDoesNotSupportIt() {
049            DecoratingComponentAdapter adapter = new DecoratingComponentAdapter(mockComponentAdapter());
050            PicoContainer pico = new DefaultPicoContainer();
051            adapter.start(pico);
052            adapter.stop(pico);
053            adapter.dispose(pico);
054            Touchable touchable = new SimpleTouchable();
055            adapter.start(touchable);
056            adapter.stop(touchable);
057            adapter.dispose(touchable);
058        }
059        
060        ComponentMonitor mockMonitorWithNoExpectedMethods() {
061            Mock mock = mock(ComponentMonitor.class);
062            return (ComponentMonitor)mock.proxy();
063        }
064    
065        private ComponentAdapter mockComponentAdapterThatDoesSupportStrategy() {
066            Mock mock = mock(ComponentAdapterThatSupportsStrategy.class);
067            mock.expects(once()).method("changeMonitor").withAnyArguments();
068            mock.expects(once()).method("currentMonitor").will(returnValue(mockMonitorWithNoExpectedMethods()));
069            return (ComponentAdapter)mock.proxy();
070        }
071    
072        private ComponentAdapter mockComponentAdapter() {
073            Mock mock = mock(ComponentAdapter.class);
074            return (ComponentAdapter)mock.proxy();
075        }
076        
077        static interface ComponentAdapterThatSupportsStrategy extends ComponentAdapter, ComponentMonitorStrategy {
078        }
079    
080        private ComponentAdapter mockComponentAdapterThatCanManageLifecycle() {
081            Mock mock = mock(ComponentAdapterThatCanManageLifecycle.class);
082            mock.expects(once()).method("start").with(isA(PicoContainer.class));
083            mock.expects(once()).method("stop").with(isA(PicoContainer.class));
084            mock.expects(once()).method("dispose").with(isA(PicoContainer.class));
085            mock.expects(once()).method("start").with(isA(Touchable.class));
086            mock.expects(once()).method("stop").with(isA(Touchable.class));
087            mock.expects(once()).method("dispose").with(isA(Touchable.class));
088            return (ComponentAdapter)mock.proxy();
089        }
090    
091        static interface ComponentAdapterThatCanManageLifecycle extends ComponentAdapter, LifecycleManager, LifecycleStrategy {
092        }
093    }