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    package org.picocontainer.defaults;
009    
010    import junit.framework.TestCase;
011    import org.picocontainer.ComponentAdapter;
012    import org.picocontainer.ComponentMonitor;
013    import org.picocontainer.Parameter;
014    import org.picocontainer.PicoContainer;
015    import org.picocontainer.PicoInitializationException;
016    import org.picocontainer.PicoIntrospectionException;
017    import org.picocontainer.PicoVerificationException;
018    import org.picocontainer.PicoVisitor;
019    
020    import java.lang.reflect.Constructor;
021    
022    /**
023     * Test AbstractComponentAdapter behaviour
024     * @author Jörg Schaible
025     */
026    public class ComponentAdapterTestCase
027            extends TestCase {
028    
029        private static class TestComponentAdapter extends AbstractComponentAdapter {
030            TestComponentAdapter(Object componentKey, Class componentImplementation, ComponentMonitor componentMonitor) throws AssignabilityRegistrationException {
031                super(componentKey, componentImplementation, componentMonitor);
032            }
033            TestComponentAdapter(Object componentKey, Class componentImplementation) throws AssignabilityRegistrationException {
034                super(componentKey, componentImplementation);
035            }
036            public Object getComponentInstance(PicoContainer container) throws PicoInitializationException, PicoIntrospectionException {
037                return null;
038            }
039            public void verify(PicoContainer container) throws PicoVerificationException {
040            }
041            
042        }
043    
044        private static class TestMonitoringComponentAdapter extends MonitoringComponentAdapter {
045            TestMonitoringComponentAdapter(ComponentMonitor componentMonitor) throws AssignabilityRegistrationException {
046                super(componentMonitor);
047            }
048            public Object getComponentInstance(PicoContainer container) throws PicoInitializationException, PicoIntrospectionException {
049                return null;
050            }
051            public void verify(PicoContainer container) throws PicoVerificationException {
052            }
053            public Object getComponentKey() {
054                return null;
055            }
056            public Class getComponentImplementation() {
057                return null;
058            }
059            public void accept(PicoVisitor visitor) {
060            }        
061        }
062        
063        private static class TestInstantiatingComponentAdapter extends InstantiatingComponentAdapter {
064            TestInstantiatingComponentAdapter(Object componentKey, Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses) {
065                super(componentKey, componentImplementation, parameters, allowNonPublicClasses);
066            }
067            protected Constructor getGreediestSatisfiableConstructor(PicoContainer container) throws PicoIntrospectionException, UnsatisfiableDependenciesException, AmbiguousComponentResolutionException, AssignabilityRegistrationException, NotConcreteRegistrationException {
068                return null;
069            }
070            public Object getComponentInstance(PicoContainer container) throws PicoInitializationException, PicoIntrospectionException {
071                return null;
072            }
073        }
074        
075        public void testComponentImplementationMayNotBeNull() {
076            try {
077                new TestComponentAdapter("Key", null);
078                fail("NullPointerException expected");
079            } catch (NullPointerException e) {
080                assertEquals("componentImplementation", e.getMessage());
081            }
082        }
083    
084        public void testComponentKeyCanBeNullButNotRequested() {
085            ComponentAdapter componentAdapter = new TestComponentAdapter(null, String.class);
086            try {
087                componentAdapter.getComponentKey();
088                fail("NullPointerException expected");
089            } catch (NullPointerException e) {
090                assertEquals("componentKey", e.getMessage());
091            }
092        }
093    
094        public void testComponentMonitorMayNotBeNull() {
095            try {
096                new TestComponentAdapter("Key", String.class, null);
097                fail("NullPointerException expected");
098            } catch (NullPointerException e) {
099                assertEquals("monitor", e.getMessage());
100            }
101            try {
102                new TestMonitoringComponentAdapter(null);
103                fail("NullPointerException expected");
104            } catch (NullPointerException e) {
105                assertEquals("monitor", e.getMessage());
106            }
107        }
108    
109        public void testParameterMayNotBeNull() throws Exception {
110            try {
111                new TestInstantiatingComponentAdapter("Key", String.class, new Parameter[]{new ConstantParameter("Value"), null}, false);
112                fail("Thrown " + NullPointerException.class.getName() + " expected");
113            } catch (final NullPointerException e) {
114                assertTrue(e.getMessage().endsWith("1 is null"));
115            }
116        }
117        
118        public void testStringRepresentation() {
119            ComponentAdapter componentAdapter = new TestComponentAdapter("Key", Integer.class);
120            assertEquals(TestComponentAdapter.class.getName() + "[Key]", componentAdapter.toString());
121        }
122    }