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