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.defaults; 011 012 import junit.framework.TestCase; 013 import org.picocontainer.MutablePicoContainer; 014 import org.picocontainer.Parameter; 015 import org.picocontainer.testmodel.AlternativeTouchable; 016 import org.picocontainer.testmodel.DependsOnTouchable; 017 import org.picocontainer.testmodel.SimpleTouchable; 018 import org.picocontainer.testmodel.Touchable; 019 020 /** 021 * @author Paul Hammant 022 * @author Aslak Hellesøy 023 * @author Rafal Krzewski 024 * @version $Revision: 2286 $ 025 */ 026 public class ChildContainerTestCase extends TestCase { 027 028 public void testParentContainerWithComponentWithEqualKeyShouldBeShadowedByChild() throws Exception { 029 DefaultPicoContainer parent = new DefaultPicoContainer(); 030 DefaultPicoContainer child = new DefaultPicoContainer(parent); 031 032 parent.registerComponentImplementation("key", AlternativeTouchable.class); 033 child.registerComponentImplementation("key", SimpleTouchable.class); 034 child.registerComponentImplementation(DependsOnTouchable.class); 035 036 DependsOnTouchable dot = (DependsOnTouchable) child.getComponentInstanceOfType(DependsOnTouchable.class); 037 assertEquals(SimpleTouchable.class, dot.getTouchable().getClass()); 038 } 039 040 public void testParentComponentRegisteredAsClassShouldBePreffered() throws Exception { 041 DefaultPicoContainer parent = new DefaultPicoContainer(); 042 DefaultPicoContainer child = new DefaultPicoContainer(parent); 043 044 parent.registerComponentImplementation(Touchable.class, AlternativeTouchable.class); 045 child.registerComponentImplementation("key", SimpleTouchable.class); 046 child.registerComponentImplementation(DependsOnTouchable.class); 047 048 DependsOnTouchable dot = (DependsOnTouchable) child.getComponentInstanceOfType(DependsOnTouchable.class); 049 assertEquals(AlternativeTouchable.class, dot.getTouchable().getClass()); 050 } 051 052 public void testResolveFromParentByType() { 053 MutablePicoContainer parent = new DefaultPicoContainer(); 054 parent.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 055 056 MutablePicoContainer child = new DefaultPicoContainer(parent); 057 child.registerComponentImplementation(DependsOnTouchable.class); 058 059 assertNotNull(child.getComponentInstance(DependsOnTouchable.class)); 060 } 061 062 public void testResolveFromParentByKey() { 063 MutablePicoContainer parent = new DefaultPicoContainer(); 064 parent.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 065 066 MutablePicoContainer child = new DefaultPicoContainer(parent); 067 child.registerComponentImplementation(DependsOnTouchable.class, DependsOnTouchable.class, 068 new Parameter[]{new ComponentParameter(Touchable.class)}); 069 070 assertNotNull(child.getComponentInstance(DependsOnTouchable.class)); 071 } 072 073 public void testResolveFromGrandParentByType() { 074 MutablePicoContainer grandParent = new DefaultPicoContainer(); 075 grandParent.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 076 077 MutablePicoContainer parent = new DefaultPicoContainer(grandParent); 078 079 MutablePicoContainer child = new DefaultPicoContainer(parent); 080 child.registerComponentImplementation(DependsOnTouchable.class); 081 082 assertNotNull(child.getComponentInstance(DependsOnTouchable.class)); 083 } 084 085 public void testResolveFromGrandParentByKey() { 086 MutablePicoContainer grandParent = new DefaultPicoContainer(); 087 grandParent.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 088 089 MutablePicoContainer parent = new DefaultPicoContainer(grandParent); 090 091 MutablePicoContainer child = new DefaultPicoContainer(parent); 092 child.registerComponentImplementation(DependsOnTouchable.class, DependsOnTouchable.class, 093 new Parameter[]{new ComponentParameter(Touchable.class)}); 094 095 assertNotNull(child.getComponentInstance(DependsOnTouchable.class)); 096 } 097 }