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}