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