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 }