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     * Idea by Rachel Davies, Original code by Stacy Curl                        *
009     *****************************************************************************/
010    
011    package org.picocontainer.defaults;
012    
013    import junit.framework.TestCase;
014    import org.picocontainer.ComponentAdapter;
015    import org.picocontainer.PicoCompositionException;
016    import org.picocontainer.DefaultPicoContainer;
017    import org.picocontainer.lifecycle.NullLifecycleStrategy;
018    import org.picocontainer.monitors.NullComponentMonitor;
019    import org.picocontainer.injectors.ConstructorInjector;
020    import org.picocontainer.injectors.AbstractInjector;
021    import org.picocontainer.testmodel.AlternativeTouchable;
022    import org.picocontainer.testmodel.SimpleTouchable;
023    import org.picocontainer.testmodel.Touchable;
024    
025    public class DefaultComponentRegistryTestCase extends TestCase {
026        private DefaultPicoContainer picoContainer;
027    
028        protected void setUp() throws Exception {
029            picoContainer = new DefaultPicoContainer();
030        }
031    
032        public void testRegisterComponent() throws PicoCompositionException {
033            ComponentAdapter componentAdapter = createComponentAdapter();
034            picoContainer.addAdapter(componentAdapter);
035            assertTrue(picoContainer.getComponentAdapters().contains(componentAdapter));
036        }
037    
038        public void testUnregisterComponent() throws PicoCompositionException {
039            ComponentAdapter componentAdapter = createComponentAdapter();
040            picoContainer.addAdapter(componentAdapter);
041            picoContainer.removeComponent(Touchable.class);
042            assertFalse(picoContainer.getComponentAdapters().contains(componentAdapter));
043        }
044    
045        public void testCannotInstantiateAnUnregisteredComponent() throws PicoCompositionException {
046            ComponentAdapter componentAdapter = createComponentAdapter();
047            picoContainer.addAdapter(componentAdapter);
048            picoContainer.getComponents();
049            picoContainer.removeComponent(Touchable.class);
050    
051            assertTrue(picoContainer.getComponents().isEmpty());
052        }
053    
054        public void testCanInstantiateReplacedComponent() throws PicoCompositionException {
055            ComponentAdapter componentAdapter = createComponentAdapter();
056            picoContainer.addAdapter(componentAdapter);
057            picoContainer.getComponents();
058            picoContainer.removeComponent(Touchable.class);
059    
060            picoContainer.addComponent(Touchable.class, AlternativeTouchable.class);
061    
062            assertEquals("Container should container 1 addComponent",
063                    1, picoContainer.getComponents().size());
064        }
065    
066        public void testUnregisterAfterInstantiateComponents() throws PicoCompositionException {
067            ComponentAdapter componentAdapter = createComponentAdapter();
068            picoContainer.addAdapter(componentAdapter);
069            picoContainer.getComponents();
070            picoContainer.removeComponent(Touchable.class);
071            assertNull(picoContainer.getComponent(Touchable.class));
072        }
073    
074        public void testReplacedInstantiatedComponentHasCorrectClass() throws PicoCompositionException {
075            ComponentAdapter componentAdapter = createComponentAdapter();
076            picoContainer.addAdapter(componentAdapter);
077            picoContainer.getComponents();
078            picoContainer.removeComponent(Touchable.class);
079    
080            picoContainer.addComponent(Touchable.class, AlternativeTouchable.class);
081            Object component = picoContainer.getComponents().iterator().next();
082    
083            assertEquals(AlternativeTouchable.class, component.getClass());
084        }
085    
086        private ComponentAdapter createComponentAdapter() throws PicoCompositionException {
087            return new ConstructorInjector(Touchable.class, SimpleTouchable.class, null, new NullComponentMonitor(), new NullLifecycleStrategy());
088        }
089    }