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.PicoInitializationException;
016    import org.picocontainer.PicoRegistrationException;
017    import org.picocontainer.testmodel.AlternativeTouchable;
018    import org.picocontainer.testmodel.SimpleTouchable;
019    import org.picocontainer.testmodel.Touchable;
020    
021    public class DefaultComponentRegistryTestCase extends TestCase {
022        private DefaultPicoContainer picoContainer;
023    
024        protected void setUp() throws Exception {
025            picoContainer = new DefaultPicoContainer();
026        }
027    
028        public void testRegisterComponent() throws PicoRegistrationException {
029            ComponentAdapter componentAdapter = createComponentAdapter();
030            picoContainer.registerComponent(componentAdapter);
031            assertTrue(picoContainer.getComponentAdapters().contains(componentAdapter));
032        }
033    
034        public void testUnregisterComponent() throws PicoRegistrationException {
035            ComponentAdapter componentAdapter = createComponentAdapter();
036            picoContainer.registerComponent(componentAdapter);
037            picoContainer.unregisterComponent(Touchable.class);
038            assertFalse(picoContainer.getComponentAdapters().contains(componentAdapter));
039        }
040    
041        public void testCannotInstantiateAnUnregisteredComponent() throws PicoRegistrationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoInvocationTargetInitializationException, PicoInitializationException {
042            ComponentAdapter componentAdapter = createComponentAdapter();
043            picoContainer.registerComponent(componentAdapter);
044            picoContainer.getComponentInstances();
045            picoContainer.unregisterComponent(Touchable.class);
046    
047            assertTrue(picoContainer.getComponentInstances().isEmpty());
048        }
049    
050        public void testCanInstantiateReplacedComponent() throws PicoRegistrationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoInvocationTargetInitializationException, PicoInitializationException {
051            ComponentAdapter componentAdapter = createComponentAdapter();
052            picoContainer.registerComponent(componentAdapter);
053            picoContainer.getComponentInstances();
054            picoContainer.unregisterComponent(Touchable.class);
055    
056            picoContainer.registerComponentImplementation(Touchable.class, AlternativeTouchable.class);
057    
058            assertEquals("Container should container 1 component",
059                    1, picoContainer.getComponentInstances().size());
060        }
061    
062        public void testUnregisterAfterInstantiateComponents() throws PicoRegistrationException, AssignabilityRegistrationException, PicoInitializationException, DuplicateComponentKeyRegistrationException, PicoInvocationTargetInitializationException, AmbiguousComponentResolutionException {
063            ComponentAdapter componentAdapter = createComponentAdapter();
064            picoContainer.registerComponent(componentAdapter);
065            picoContainer.getComponentInstances();
066            picoContainer.unregisterComponent(Touchable.class);
067            assertNull(picoContainer.getComponentInstance(Touchable.class));
068        }
069    
070        public void testReplacedInstantiatedComponentHasCorrectClass() throws PicoRegistrationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoInvocationTargetInitializationException, PicoInitializationException {
071            ComponentAdapter componentAdapter = createComponentAdapter();
072            picoContainer.registerComponent(componentAdapter);
073            picoContainer.getComponentInstances();
074            picoContainer.unregisterComponent(Touchable.class);
075    
076            picoContainer.registerComponentImplementation(Touchable.class, AlternativeTouchable.class);
077            Object component = picoContainer.getComponentInstances().iterator().next();
078    
079            assertEquals(AlternativeTouchable.class, component.getClass());
080        }
081    
082        private ComponentAdapter createComponentAdapter() throws AssignabilityRegistrationException, NotConcreteRegistrationException {
083            return new ConstructorInjectionComponentAdapter(Touchable.class, SimpleTouchable.class);
084        }
085    }