001    package org.picocontainer.tck;
002    
003    import org.picocontainer.Parameter;
004    import org.picocontainer.PicoException;
005    import org.picocontainer.PicoInitializationException;
006    import org.picocontainer.MutablePicoContainer;
007    
008    import java.util.Map;
009    import java.util.HashMap;
010    import java.io.IOException;
011    import java.awt.event.ActionListener;
012    import java.awt.event.ActionEvent;
013    
014    /**
015     * @author Paul Hammant
016     * @version $Revision: 2231 $
017     */
018    public abstract class AbstractImplementationHidingPicoContainerTestCase extends AbstractPicoContainerTestCase {
019    
020    
021        public void testInstanceIsNotAutomaticallyHidden() {
022            MutablePicoContainer pc = createImplementationHidingPicoContainer();
023            pc.registerComponentInstance(Map.class, new HashMap());
024            Map map = (Map) pc.getComponentInstance(Map.class);
025            assertNotNull(map);
026            assertTrue(map instanceof HashMap);
027        }
028    
029        protected abstract MutablePicoContainer createImplementationHidingPicoContainer();
030    
031    
032        public void testImplementaionIsAutomaticallyHidden() {
033            MutablePicoContainer pc = createImplementationHidingPicoContainer();
034            pc.registerComponentImplementation(Map.class, HashMap.class);
035            Map map = (Map) pc.getComponentInstance(Map.class);
036            assertNotNull(map);
037            assertFalse(map instanceof HashMap);
038        }
039    
040        public void testNonInterfaceImplementaionIsAutomaticallyHidden() {
041            MutablePicoContainer pc = createImplementationHidingPicoContainer();
042            pc.registerComponentImplementation(HashMap.class, HashMap.class);
043            Map map = (Map) pc.getComponentInstance(HashMap.class);
044            assertNotNull(map);
045            assertTrue(map instanceof HashMap);
046        }
047    
048        public void testNonInterfaceImplementaionWithParametersIsAutomaticallyHidden() {
049            MutablePicoContainer pc = createImplementationHidingPicoContainer();
050            pc.registerComponentImplementation(HashMap.class, HashMap.class, new Parameter[0]);
051            Map map = (Map) pc.getComponentInstance(HashMap.class);
052            assertNotNull(map);
053            assertTrue(map instanceof HashMap);
054        }
055    
056    
057        public void testImplementaionWithParametersIsAutomaticallyHidden() {
058            MutablePicoContainer pc = createImplementationHidingPicoContainer();
059            pc.registerComponentImplementation(Map.class, HashMap.class, new Parameter[0]);
060            Map map = (Map) pc.getComponentInstance(Map.class);
061            assertNotNull(map);
062            assertFalse(map instanceof HashMap);
063        }
064    
065        public void testSerializedContainerCanRetrieveImplementation() throws PicoException, PicoInitializationException,
066                IOException, ClassNotFoundException {
067            try {
068                super.testSerializedContainerCanRetrieveImplementation();
069                fail("The ImplementationHidingPicoContainer should not be able to retrieve the component impl");
070            } catch (ClassCastException cce) {
071                // expected.
072            }
073        }
074    
075        public void testExceptionThrowingFromHiddenComponent() {
076            MutablePicoContainer pc = createImplementationHidingPicoContainer();
077            pc.registerComponentImplementation(ActionListener.class, Burp.class);
078            try {
079                ActionListener ac = (ActionListener) pc.getComponentInstance(ActionListener.class);
080                ac.actionPerformed(null);
081                fail("Oh no.");
082            } catch (RuntimeException e) {
083                assertEquals("woohoo", e.getMessage());
084            }
085        }
086    
087        public static class Burp implements ActionListener {
088    
089            public void actionPerformed(ActionEvent e) {
090                throw new RuntimeException("woohoo");
091            }
092        }
093    
094    }