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