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 }