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    }