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
013 import static org.junit.Assert.assertEquals;
014 import static org.junit.Assert.assertFalse;
015 import static org.junit.Assert.assertNotNull;
016 import static org.junit.Assert.assertTrue;
017 import static org.junit.Assert.fail;
018
019 import java.awt.event.ActionEvent;
020 import java.awt.event.ActionListener;
021 import java.io.IOException;
022 import java.util.HashMap;
023 import java.util.Map;
024
025 import org.junit.Test;
026 import org.picocontainer.MutablePicoContainer;
027 import org.picocontainer.PicoException;
028
029
030 /**
031 * @author Paul Hammant
032 */
033 public 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 }