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