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 }