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 *****************************************************************************/
010package org.picocontainer.defaults;
011
012import static org.junit.Assert.assertEquals;
013import static org.junit.Assert.assertNotNull;
014
015import org.junit.Test;
016import org.picocontainer.DefaultPicoContainer;
017import org.picocontainer.MutablePicoContainer;
018import org.picocontainer.parameters.ComponentParameter;
019import org.picocontainer.testmodel.AlternativeTouchable;
020import org.picocontainer.testmodel.DependsOnTouchable;
021import org.picocontainer.testmodel.SimpleTouchable;
022import org.picocontainer.testmodel.Touchable;
023
024/**
025 * @author Paul Hammant
026 * @author Aslak Hellesøy
027 * @author Rafal Krzewski
028 */
029public class ChildContainerTestCase {
030
031    @Test public void testParentContainerWithComponentWithEqualKeyShouldBeShadowedByChild() throws Exception {
032        DefaultPicoContainer parent = new DefaultPicoContainer();
033        DefaultPicoContainer child = new DefaultPicoContainer(parent);
034
035        parent.addComponent("key", AlternativeTouchable.class);
036        child.addComponent("key", SimpleTouchable.class);
037        child.addComponent(DependsOnTouchable.class);
038
039        DependsOnTouchable dot = child.getComponent(DependsOnTouchable.class);
040        assertEquals(SimpleTouchable.class, dot.getTouchable().getClass());
041    }
042
043    @Test public void testParentComponentRegisteredAsClassShouldBePreffered() throws Exception {
044        DefaultPicoContainer parent = new DefaultPicoContainer();
045        DefaultPicoContainer child = new DefaultPicoContainer(parent);
046
047        parent.addComponent(Touchable.class, AlternativeTouchable.class);
048        child.addComponent("key", SimpleTouchable.class);
049        child.addComponent(DependsOnTouchable.class);
050
051        DependsOnTouchable dot = child.getComponent(DependsOnTouchable.class);
052        assertEquals(AlternativeTouchable.class, dot.getTouchable().getClass());
053    }
054
055    @Test public void testResolveFromParentByType() {
056        MutablePicoContainer parent = new DefaultPicoContainer();
057        parent.addComponent(Touchable.class, SimpleTouchable.class);
058
059        MutablePicoContainer child = new DefaultPicoContainer(parent);
060        child.addComponent(DependsOnTouchable.class);
061
062        assertNotNull(child.getComponent(DependsOnTouchable.class));
063    }
064
065    @Test public void testResolveFromParentByKey() {
066        MutablePicoContainer parent = new DefaultPicoContainer();
067        parent.addComponent(Touchable.class, SimpleTouchable.class);
068
069        MutablePicoContainer child = new DefaultPicoContainer(parent);
070        child.addComponent(DependsOnTouchable.class, DependsOnTouchable.class,
071                           new ComponentParameter(Touchable.class));
072
073        assertNotNull(child.getComponent(DependsOnTouchable.class));
074    }
075
076    @Test public void testResolveFromGrandParentByType() {
077        MutablePicoContainer grandParent = new DefaultPicoContainer();
078        grandParent.addComponent(Touchable.class, SimpleTouchable.class);
079
080        MutablePicoContainer parent = new DefaultPicoContainer(grandParent);
081
082        MutablePicoContainer child = new DefaultPicoContainer(parent);
083        child.addComponent(DependsOnTouchable.class);
084
085        assertNotNull(child.getComponent(DependsOnTouchable.class));
086    }
087
088    @Test public void testResolveFromGrandParentByKey() {
089        MutablePicoContainer grandParent = new DefaultPicoContainer();
090        grandParent.addComponent(Touchable.class, SimpleTouchable.class);
091
092        MutablePicoContainer parent = new DefaultPicoContainer(grandParent);
093
094        MutablePicoContainer child = new DefaultPicoContainer(parent);
095        child.addComponent(DependsOnTouchable.class, DependsOnTouchable.class,
096                           new ComponentParameter(Touchable.class));
097
098        assertNotNull(child.getComponent(DependsOnTouchable.class));
099    }
100
101    @Test public void testResolveFromGrandParentAndParentOnlyIfChildCannotResolve() {
102        MutablePicoContainer grandParent = new DefaultPicoContainer();
103        SimpleTouchable gp = new SimpleTouchable();
104        grandParent.addComponent(Touchable.class, gp);
105
106        MutablePicoContainer parent = new DefaultPicoContainer(grandParent);
107        SimpleTouchable p = new SimpleTouchable();
108        parent.addComponent(Touchable.class, p);
109
110        MutablePicoContainer child = new DefaultPicoContainer(parent);
111        SimpleTouchable c = new SimpleTouchable();
112        child.addComponent(Touchable.class, c);
113        child.addComponent(DependsOnTouchable.class);
114
115        DependsOnTouchable dot = child.getComponent(DependsOnTouchable.class);
116        assertNotNull(dot);
117        assertEquals(c, dot.getTouchable());
118    }
119
120
121}