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 }