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