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, org.picocontainer.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 }