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 static org.junit.Assert.assertEquals;
013 import static org.junit.Assert.assertNotNull;
014
015 import org.junit.Test;
016 import org.picocontainer.DefaultPicoContainer;
017 import org.picocontainer.MutablePicoContainer;
018 import org.picocontainer.parameters.ComponentParameter;
019 import org.picocontainer.testmodel.AlternativeTouchable;
020 import org.picocontainer.testmodel.DependsOnTouchable;
021 import org.picocontainer.testmodel.SimpleTouchable;
022 import org.picocontainer.testmodel.Touchable;
023
024 /**
025 * @author Paul Hammant
026 * @author Aslak Hellesøy
027 * @author Rafal Krzewski
028 */
029 public 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 }