001 package org.picocontainer.defaults;
002
003 import org.jmock.Mock;
004 import org.jmock.MockObjectTestCase;
005 import org.jmock.core.Constraint;
006 import org.picocontainer.ComponentMonitor;
007 import org.picocontainer.monitors.ConsoleComponentMonitor;
008
009 import java.lang.reflect.Constructor;
010 import java.util.*;
011
012 /**
013 * @author Mauro Talevi
014 * @version $Revision: 2200 $
015 */
016 public class DelegatingComponentMonitorTestCase extends MockObjectTestCase {
017
018 public void testDelegatingMonitorThrowsExpectionWhenConstructionWithNullDelegate(){
019 try {
020 new DelegatingComponentMonitor(null);
021 fail("NPE expected");
022 } catch (NullPointerException e) {
023 assertEquals("NPE", "monitor", e.getMessage());
024 }
025 }
026
027 public void testDelegatingMonitorThrowsExpectionWhenChangingToNullMonitor(){
028 DelegatingComponentMonitor dcm = new DelegatingComponentMonitor();
029 try {
030 dcm.changeMonitor(null);
031 fail("NPE expected");
032 } catch (NullPointerException e) {
033 assertEquals("NPE", "monitor", e.getMessage());
034 }
035 }
036
037 public void testDelegatingMonitorCanChangeMonitorInDelegateThatDoesSupportMonitorStrategy() {
038 ComponentMonitor monitor = mockMonitorWithNoExpectedMethods();
039 DelegatingComponentMonitor dcm = new DelegatingComponentMonitor(mockMonitorThatSupportsStrategy(monitor));
040 dcm.changeMonitor(monitor);
041 assertEquals(monitor, dcm.currentMonitor());
042 dcm.instantiating(null);
043 }
044
045 public void testDelegatingMonitorChangesDelegateThatDoesNotSupportMonitorStrategy() {
046 ComponentMonitor delegate = mockMonitorWithNoExpectedMethods();
047 DelegatingComponentMonitor dcm = new DelegatingComponentMonitor(delegate);
048 ComponentMonitor monitor = mockMonitorWithNoExpectedMethods();
049 assertEquals(delegate, dcm.currentMonitor());
050 dcm.changeMonitor(monitor);
051 assertEquals(monitor, dcm.currentMonitor());
052 }
053
054 public void testDelegatingMonitorReturnsDelegateThatDoesNotSupportMonitorStrategy() {
055 ComponentMonitor delegate = mockMonitorWithNoExpectedMethods();
056 DelegatingComponentMonitor dcm = new DelegatingComponentMonitor(delegate);
057 assertEquals(delegate, dcm.currentMonitor());
058 }
059
060 private ComponentMonitor mockMonitorWithNoExpectedMethods() {
061 Mock mock = mock(ComponentMonitor.class);
062 return (ComponentMonitor)mock.proxy();
063 }
064
065 private ComponentMonitor mockMonitorThatSupportsStrategy(ComponentMonitor currentMonitor) {
066 Mock mock = mock(MonitorThatSupportsStrategy.class);
067 mock.expects(once()).method("changeMonitor").with(eq(currentMonitor));
068 mock.expects(once()).method("currentMonitor").withAnyArguments().will(returnValue(currentMonitor));
069 mock.expects(once()).method("instantiating").withAnyArguments();
070 return (ComponentMonitor)mock.proxy();
071 }
072
073 public void testMonitoringHappensBeforeAndAfterInstantiation() throws NoSuchMethodException {
074 final Vector ourIntendedInjectee0 = new Vector();
075 final String ourIntendedInjectee1 = "hullo";
076 Mock monitor = mock(ComponentMonitor.class);
077 Constructor nacotCtor = NeedsACoupleOfThings.class.getConstructors()[0];
078 monitor.expects(once()).method("instantiating").with(eq(nacotCtor));
079 Constraint durationIsGreaterThanOrEqualToZero = new Constraint() {
080 public boolean eval(Object o) {
081 Long duration = (Long)o;
082 return 0 <= duration.longValue();
083 }
084
085 public StringBuffer describeTo(StringBuffer stringBuffer) {
086 return stringBuffer.append("The endTime wasn't after the startTime");
087 }
088 };
089 Constraint isANACOTThatWozCreated = new Constraint() {
090 public boolean eval(Object o) {
091 return o instanceof NeedsACoupleOfThings;
092 }
093
094 public StringBuffer describeTo(StringBuffer stringBuffer) {
095 return stringBuffer.append("Should have been a hashmap");
096 }
097 };
098 Constraint collectionAndStringWereInjected = new Constraint() {
099 public boolean eval(Object o) {
100 Object[] ctorArgs = (Object[]) o;
101 return ctorArgs.length == 2 && ctorArgs[0] == ourIntendedInjectee0 && ctorArgs[1] == ourIntendedInjectee1;
102 }
103 public StringBuffer describeTo(StringBuffer stringBuffer) {
104 return stringBuffer.append("Should have injected our intended vector and string");
105 }
106 };
107 monitor.expects(once()).method("instantiated").with(eq(nacotCtor), isANACOTThatWozCreated, collectionAndStringWereInjected, durationIsGreaterThanOrEqualToZero);
108 DefaultPicoContainer parent = new DefaultPicoContainer();
109 parent.registerComponentInstance(ourIntendedInjectee0);
110 parent.registerComponentInstance(ourIntendedInjectee1);
111 DefaultPicoContainer child = new DefaultPicoContainer(new DelegatingComponentMonitor((ComponentMonitor) monitor.proxy()), parent);
112 child.registerComponentImplementation(NeedsACoupleOfThings.class);
113 child.getComponentInstance(NeedsACoupleOfThings.class);
114 }
115
116 static class NeedsACoupleOfThings {
117 public NeedsACoupleOfThings(Collection collection, String string) {
118 }
119 }
120
121 static interface MonitorThatSupportsStrategy extends ComponentMonitor, ComponentMonitorStrategy {
122 }
123 }