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 }