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    }