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.Parameter;
014 import org.picocontainer.testmodel.DecoratedTouchable;
015 import org.picocontainer.testmodel.SimpleTouchable;
016 import org.picocontainer.testmodel.Touchable;
017 import org.picocontainer.testmodel.DependsOnTouchable;
018
019 import java.util.Collections;
020
021 /**
022 * @author Thomas Heller
023 * @author Aslak Hellesøy
024 * @version $Revision: 2306 $
025 */
026 public class ComponentKeysTestCase extends TestCase {
027 public void testComponensRegisteredWithClassKeyTakePrecedenceOverOthersWhenThereAreMultipleImplementations() throws Exception {
028 DefaultPicoContainer pico = new DefaultPicoContainer();
029 pico.registerComponentImplementation("default", SimpleTouchable.class);
030
031 /**
032 * By using a class as key, this should take precedence over the other Touchable
033 */
034 pico.registerComponentImplementation(Touchable.class, DecoratedTouchable.class, new Parameter[]{
035 new ComponentParameter("default")
036 });
037
038 Touchable touchable = (Touchable) pico.getComponentInstanceOfType(Touchable.class);
039 assertEquals(DecoratedTouchable.class, touchable.getClass());
040 }
041
042 public void testComponentAdapterResolutionIsFirstLookedForByClassKeyToTheTopOfTheContainerHierarchy() {
043 DefaultPicoContainer pico = new DefaultPicoContainer();
044 pico.registerComponentImplementation("default", SimpleTouchable.class);
045
046 // Use the List variant instead, so we get better test coverage.
047 pico.registerComponentImplementation(Touchable.class, DecoratedTouchable.class, Collections.singletonList(new ComponentParameter("default")));
048
049 DefaultPicoContainer grandChild = new DefaultPicoContainer(new DefaultPicoContainer(new DefaultPicoContainer(pico)));
050
051 Touchable touchable = (Touchable) grandChild.getComponentInstanceOfType(Touchable.class);
052 assertEquals(DecoratedTouchable.class, touchable.getClass());
053
054 }
055
056 public void testComponentKeysFromParentCannotConfuseTheChild() throws Exception {
057 DefaultPicoContainer pico = new DefaultPicoContainer();
058 pico.registerComponentImplementation("test", SimpleTouchable.class);
059
060 DefaultPicoContainer child = new DefaultPicoContainer(pico);
061
062 child.registerComponentImplementation("test", DependsOnTouchable.class);
063
064 DependsOnTouchable dot = (DependsOnTouchable) child.getComponentInstance("test");
065
066 assertNotNull(dot);
067 }
068
069 }