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     */
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.addComponent("key", AlternativeTouchable.class);
033            child.addComponent("key", SimpleTouchable.class);
034            child.addComponent(DependsOnTouchable.class);
035    
036            DependsOnTouchable dot = child.getComponent(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.addComponent(Touchable.class, AlternativeTouchable.class);
045            child.addComponent("key", SimpleTouchable.class);
046            child.addComponent(DependsOnTouchable.class);
047    
048            DependsOnTouchable dot = child.getComponent(DependsOnTouchable.class);
049            assertEquals(AlternativeTouchable.class, dot.getTouchable().getClass());
050        }
051    
052        public void testResolveFromParentByType() {
053            MutablePicoContainer parent = new DefaultPicoContainer();
054            parent.addComponent(Touchable.class, SimpleTouchable.class);
055    
056            MutablePicoContainer child = new DefaultPicoContainer(parent);
057            child.addComponent(DependsOnTouchable.class);
058    
059            assertNotNull(child.getComponent(DependsOnTouchable.class));
060        }
061    
062        public void testResolveFromParentByKey() {
063            MutablePicoContainer parent = new DefaultPicoContainer();
064            parent.addComponent(Touchable.class, SimpleTouchable.class);
065    
066            MutablePicoContainer child = new DefaultPicoContainer(parent);
067            child.addComponent(DependsOnTouchable.class, DependsOnTouchable.class,
068                               new ComponentParameter(Touchable.class));
069    
070            assertNotNull(child.getComponent(DependsOnTouchable.class));
071        }
072    
073        public void testResolveFromGrandParentByType() {
074            MutablePicoContainer grandParent = new DefaultPicoContainer();
075            grandParent.addComponent(Touchable.class, SimpleTouchable.class);
076    
077            MutablePicoContainer parent = new DefaultPicoContainer(grandParent);
078    
079            MutablePicoContainer child = new DefaultPicoContainer(parent);
080            child.addComponent(DependsOnTouchable.class);
081    
082            assertNotNull(child.getComponent(DependsOnTouchable.class));
083        }
084    
085        public void testResolveFromGrandParentByKey() {
086            MutablePicoContainer grandParent = new DefaultPicoContainer();
087            grandParent.addComponent(Touchable.class, SimpleTouchable.class);
088    
089            MutablePicoContainer parent = new DefaultPicoContainer(grandParent);
090    
091            MutablePicoContainer child = new DefaultPicoContainer(parent);
092            child.addComponent(DependsOnTouchable.class, DependsOnTouchable.class,
093                               new ComponentParameter(Touchable.class));
094    
095            assertNotNull(child.getComponent(DependsOnTouchable.class));
096        }
097    }