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 }