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 }