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 }