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