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                                                          *
009     *****************************************************************************/
010    package org.picocontainer.behaviors;
011    
012    import org.jmock.Mock;
013    import org.jmock.MockObjectTestCase;
014    import org.picocontainer.ComponentAdapter;
015    import org.picocontainer.ComponentMonitor;
016    import org.picocontainer.Behavior;
017    import org.picocontainer.PicoContainer;
018    import org.picocontainer.PicoCompositionException;
019    import org.picocontainer.behaviors.AbstractBehavior;
020    import org.picocontainer.DefaultPicoContainer;
021    import org.picocontainer.ComponentMonitorStrategy;
022    import org.picocontainer.LifecycleStrategy;
023    import org.picocontainer.testmodel.SimpleTouchable;
024    import org.picocontainer.testmodel.Touchable;
025    
026    /**
027     * @author Mauro Talevi
028     * @version $Revision: 2200 $
029     */
030    public class BehaviorAdapterTestCase extends MockObjectTestCase {
031    
032        public void testDecoratingComponentAdapterDelegatesToMonitorThatDoesSupportStrategy() {
033            AbstractBehavior adapter = new FooAbstractBehavior(mockComponentAdapterThatDoesSupportStrategy());
034            adapter.changeMonitor(mockMonitorWithNoExpectedMethods());
035            assertNotNull(adapter.currentMonitor());
036        }
037        
038        public void testDecoratingComponentAdapterDelegatesToMonitorThatDoesNotSupportStrategy() {
039            AbstractBehavior adapter = new FooAbstractBehavior(mockComponentAdapter());
040            adapter.changeMonitor(mockMonitorWithNoExpectedMethods());
041            try {
042                adapter.currentMonitor();
043                fail("PicoCompositionException expected");
044            } catch (PicoCompositionException e) {
045                assertEquals("No component monitor found in delegate", e.getMessage());
046            }
047        }
048        
049        public void testDecoratingComponentAdapterDelegatesLifecycleManagement() {
050            AbstractBehavior adapter = new FooAbstractBehavior(mockComponentAdapterThatCanManageLifecycle());
051            PicoContainer pico = new DefaultPicoContainer();
052            adapter.start(pico);
053            adapter.stop(pico);
054            adapter.dispose(pico);
055            Touchable touchable = new SimpleTouchable();
056            adapter.start(touchable);
057            adapter.stop(touchable);
058            adapter.dispose(touchable);
059        }
060    
061        public void testDecoratingComponentAdapterIgnoresLifecycleManagementIfDelegateDoesNotSupportIt() {
062            AbstractBehavior adapter = new FooAbstractBehavior(mockComponentAdapter());
063            PicoContainer pico = new DefaultPicoContainer();
064            adapter.start(pico);
065            adapter.stop(pico);
066            adapter.dispose(pico);
067            Touchable touchable = new SimpleTouchable();
068            adapter.start(touchable);
069            adapter.stop(touchable);
070            adapter.dispose(touchable);
071        }
072        
073        ComponentMonitor mockMonitorWithNoExpectedMethods() {
074            Mock mock = mock(ComponentMonitor.class);
075            return (ComponentMonitor)mock.proxy();
076        }
077    
078        private ComponentAdapter mockComponentAdapterThatDoesSupportStrategy() {
079            Mock mock = mock(ComponentAdapterThatSupportsStrategy.class);
080            mock.expects(once()).method("changeMonitor").withAnyArguments();
081            mock.expects(once()).method("currentMonitor").will(returnValue(mockMonitorWithNoExpectedMethods()));
082            return (ComponentAdapter)mock.proxy();
083        }
084    
085        private ComponentAdapter mockComponentAdapter() {
086            Mock mock = mock(ComponentAdapter.class);
087            return (ComponentAdapter)mock.proxy();
088        }
089        
090        static interface ComponentAdapterThatSupportsStrategy extends ComponentAdapter, ComponentMonitorStrategy {
091        }
092    
093        private ComponentAdapter mockComponentAdapterThatCanManageLifecycle() {
094            Mock mock = mock(ComponentAdapterThatCanManageLifecycle.class);
095            mock.expects(once()).method("start").with(isA(PicoContainer.class));
096            mock.expects(once()).method("stop").with(isA(PicoContainer.class));
097            mock.expects(once()).method("dispose").with(isA(PicoContainer.class));
098            mock.expects(once()).method("start").with(isA(Touchable.class));
099            mock.expects(once()).method("stop").with(isA(Touchable.class));
100            mock.expects(once()).method("dispose").with(isA(Touchable.class));
101            return (ComponentAdapter)mock.proxy();
102        }
103    
104        static interface ComponentAdapterThatCanManageLifecycle extends ComponentAdapter, Behavior, LifecycleStrategy {
105        }
106    
107        static class FooAbstractBehavior extends AbstractBehavior {
108    
109            public FooAbstractBehavior(ComponentAdapter delegate) {
110                super(delegate);
111            }
112        }
113    }