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