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    
048        private static class TestMonitoringComponentAdapter extends AbstractAdapter {
049            TestMonitoringComponentAdapter(ComponentMonitor componentMonitor) {
050                super(null, null, componentMonitor);
051            }
052            public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
053                return null;
054            }
055            public void verify(PicoContainer container) throws PicoVerificationException {
056            }
057            public Object getComponentKey() {
058                return null;
059            }
060            public Class getComponentImplementation() {
061                return null;
062            }
063            public void accept(PicoVisitor visitor) {
064            }        
065        }
066        
067        private static class TestInstantiatingAdapter extends AbstractInjector {
068            TestInstantiatingAdapter(Object componentKey, Class componentImplementation, Parameter... parameters) {
069                super(componentKey, componentImplementation, parameters, new NullComponentMonitor(), new NullLifecycleStrategy());
070            }
071            protected Constructor getGreediestSatisfiableConstructor(PicoContainer container) throws PicoCompositionException {
072                return null;
073            }
074    
075            public void verify(PicoContainer container) throws PicoCompositionException {
076            }
077    
078            public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
079                return null;
080            }
081        }
082        
083        public void testComponentImplementationMayNotBeNull() {
084            try {
085                new TestAdapter("Key", null);
086                fail("NullPointerException expected");
087            } catch (NullPointerException e) {
088                assertEquals("componentImplementation", e.getMessage());
089            }
090        }
091    
092        public void testComponentKeyCanBeNullButNotRequested() {
093            ComponentAdapter componentAdapter = new TestAdapter(null, String.class);
094            try {
095                componentAdapter.getComponentKey();
096                fail("NullPointerException expected");
097            } catch (NullPointerException e) {
098                assertEquals("componentKey", e.getMessage());
099            }
100        }
101    
102        public void testComponentMonitorMayNotBeNull() {
103            try {
104                new TestAdapter("Key", String.class, null);
105                fail("NullPointerException expected");
106            } catch (NullPointerException e) {
107                assertEquals("ComponentMonitor==null", e.getMessage());
108            }
109            try {
110                new TestMonitoringComponentAdapter(null);
111                fail("NullPointerException expected");
112            } catch (NullPointerException e) {
113                assertEquals("ComponentMonitor==null", e.getMessage());
114            }
115        }
116    
117        public void testParameterMayNotBeNull() throws Exception {
118            try {
119                new TestInstantiatingAdapter("Key", String.class, new Parameter[]{new ConstantParameter("Value"), null});
120                fail("Thrown " + NullPointerException.class.getName() + " expected");
121            } catch (final NullPointerException e) {
122                assertTrue(e.getMessage().endsWith("1 is null"));
123            }
124        }
125        
126        public void testStringRepresentation() {
127            ComponentAdapter componentAdapter = new TestAdapter("Key", Integer.class);
128            assertEquals(TestAdapter.class.getName() + "[Key]", componentAdapter.toString());
129        }
130    }