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 }