    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 static org.junit.Assert.assertEquals;
    013    import static org.junit.Assert.assertNotNull;
    014    import static org.junit.Assert.fail;
    015    import static org.picocontainer.tck.MockFactory.mockeryWithCountingNamingScheme;
    016
    017    import org.jmock.Expectations;
    018    import org.jmock.Mockery;
    019    import org.jmock.integration.junit4.JMock;
    020    import org.junit.Test;
    021    import org.junit.runner.RunWith;
    022    import org.picocontainer.Behavior;
    023    import org.picocontainer.ComponentAdapter;
    024    import org.picocontainer.ComponentMonitor;
    025    import org.picocontainer.ComponentMonitorStrategy;
    026    import org.picocontainer.DefaultPicoContainer;
    027    import org.picocontainer.LifecycleStrategy;
    028    import org.picocontainer.PicoCompositionException;
    029    import org.picocontainer.PicoContainer;
    030    import org.picocontainer.testmodel.SimpleTouchable;
    031    import org.picocontainer.testmodel.Touchable;
    032
    033    /**
    034     * @author Mauro Talevi
    035     */
    036    @RunWith(JMock.class)
    037    @SuppressWarnings("serial")
    038    public class BehaviorAdapterTestCase {
    039
    040            private Mockery mockery = mockeryWithCountingNamingScheme();
    041
    042        @Test public void testDecoratingComponentAdapterDelegatesToMonitorThatDoesSupportStrategy() {
    043            AbstractBehavior adapter = new FooAbstractBehavior(mockComponentAdapterThatDoesSupportStrategy());
    044            adapter.changeMonitor(mockMonitorWithNoExpectedMethods());
    045            assertNotNull(adapter.currentMonitor());
    046        }
    047
    048        @Test public void testDecoratingComponentAdapterDelegatesToMonitorThatDoesNotSupportStrategy() {
    049            AbstractBehavior adapter = new FooAbstractBehavior(mockComponentAdapter());
    050            adapter.changeMonitor(mockMonitorWithNoExpectedMethods());
    051            try {
    052                adapter.currentMonitor();
    053                fail("PicoCompositionException expected");
    054            } catch (PicoCompositionException e) {
    055                assertEquals("No component monitor found in delegate", e.getMessage());
    056            }
    057        }
    058
    059        @Test public void testDecoratingComponentAdapterDelegatesLifecycleManagement() {
    060            AbstractBehavior adapter = new FooAbstractBehavior(mockComponentAdapterThatCanManageLifecycle());
    061            PicoContainer pico = new DefaultPicoContainer();
    062            adapter.start(pico);
    063            adapter.stop(pico);
    064            adapter.dispose(pico);
    065            Touchable touchable = new SimpleTouchable();
    066            adapter.start(touchable);
    067            adapter.stop(touchable);
    068            adapter.dispose(touchable);
    069        }
    070
    071        @Test public void testDecoratingComponentAdapterIgnoresLifecycleManagementIfDelegateDoesNotSupportIt() {
    072            AbstractBehavior adapter = new FooAbstractBehavior(mockComponentAdapter());
    073            PicoContainer pico = new DefaultPicoContainer();
    074            adapter.start(pico);
    075            adapter.stop(pico);
    076            adapter.dispose(pico);
    077            Touchable touchable = new SimpleTouchable();
    078            adapter.start(touchable);
    079            adapter.stop(touchable);
    080            adapter.dispose(touchable);
    081        }
    082
    083        ComponentMonitor mockMonitorWithNoExpectedMethods() {
    084            return mockery.mock(ComponentMonitor.class);
    085        }
    086
    087        private ComponentAdapter mockComponentAdapterThatDoesSupportStrategy() {
    088            final ComponentAdapterThatSupportsStrategy ca = mockery.mock(ComponentAdapterThatSupportsStrategy.class);
    089            mockery.checking(new Expectations(){{
    090                    one(ca).changeMonitor(with(any(ComponentMonitor.class)));
    091                    one(ca).currentMonitor();
    092                    will(returnValue(mockMonitorWithNoExpectedMethods()));
    093            }});
    094            return ca;
    095        }
    096
    097        private ComponentAdapter mockComponentAdapter() {
    098             return mockery.mock(ComponentAdapter.class);
    099        }
    100
    101        public static interface ComponentAdapterThatSupportsStrategy extends ComponentAdapter, ComponentMonitorStrategy {
    102        }
    103
    104        private ComponentAdapter mockComponentAdapterThatCanManageLifecycle() {
    105            final ComponentAdapterThatCanManageLifecycle ca = mockery.mock(ComponentAdapterThatCanManageLifecycle.class);
    106            mockery.checking(new Expectations(){{
    107                    one(ca).start(with(any(PicoContainer.class)));
    108                    one(ca).stop(with(any(PicoContainer.class)));
    109                    one(ca).dispose(with(any(PicoContainer.class)));
    110                    one(ca).start(with(any(Touchable.class)));
    111                    one(ca).stop(with(any(Touchable.class)));
    112                    one(ca).dispose(with(any(Touchable.class)));
    113            }});
    114            return ca;
    115        }
    116
    117        public static interface ComponentAdapterThatCanManageLifecycle extends ComponentAdapter, Behavior, LifecycleStrategy {
    118        }
    119
    120        static class FooAbstractBehavior extends AbstractBehavior {
    121
    122            public FooAbstractBehavior(ComponentAdapter delegate) {
    123                super(delegate);
    124            }
    125
    126            public String getDescriptor() {
    127                return null;
    128            }
    129        }
    130    }