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     * Idea by Rachel Davies, Original code by Stacy Curl                        *
009     *****************************************************************************/
010    
011    package org.picocontainer.injectors;
012    
013    import static org.junit.Assert.assertEquals;
014    import static org.junit.Assert.assertNotNull;
015    import static org.junit.Assert.assertTrue;
016    
017    import java.util.HashMap;
018    import java.util.Map;
019    import java.util.Properties;
020    
021    import org.junit.Before;
022    import org.junit.Test;
023    import org.picocontainer.Characteristics;
024    import org.picocontainer.ComponentAdapter;
025    import org.picocontainer.ComponentFactory;
026    import org.picocontainer.DefaultPicoContainer;
027    import org.picocontainer.Parameter;
028    import org.picocontainer.PicoCompositionException;
029    import org.picocontainer.lifecycle.NullLifecycleStrategy;
030    import org.picocontainer.lifecycle.ReflectionLifecycleStrategy;
031    import org.picocontainer.monitors.ConsoleComponentMonitor;
032    import org.picocontainer.monitors.NullComponentMonitor;
033    import org.picocontainer.tck.AbstractComponentFactoryTest;
034    import org.picocontainer.testmodel.SimpleTouchable;
035    import org.picocontainer.testmodel.Touchable;
036    
037    import com.thoughtworks.xstream.XStream;
038    import com.thoughtworks.xstream.converters.Converter;
039    import com.thoughtworks.xstream.converters.MarshallingContext;
040    import com.thoughtworks.xstream.converters.UnmarshallingContext;
041    import com.thoughtworks.xstream.io.HierarchicalStreamReader;
042    import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
043    
044    public class AdaptingInjectionTestCase extends AbstractComponentFactoryTest {
045    
046        XStream xs;
047    
048        @Before
049        public void setUp() throws Exception {
050            super.setUp();
051            xs = new XStream();
052            xs.alias("RLS", ReflectionLifecycleStrategy.class);
053            xs.alias("CCM", ConsoleComponentMonitor.class);
054            xs.alias("Method-Injection", AnnotatedMethodInjector.class);
055            xs.alias("Field-Injection", AnnotatedFieldInjector.class);
056            xs.alias("Constructor-Injection", ConstructorInjector.class);
057            //xs.alias("CCM", ConsoleComponentMonitor.class);
058            xs.registerConverter(new Converter() {
059                public boolean canConvert(Class aClass) {
060                    return aClass.getName().equals("org.picocontainer.monitors.ConsoleComponentMonitor") ||
061                           aClass.getName().equals("org.picocontainer.lifecycle.ReflectionLifecycleStrategy");
062    
063                }
064    
065                public void marshal(Object object,
066                                    HierarchicalStreamWriter hierarchicalStreamWriter,
067                                    MarshallingContext marshallingContext)
068                {
069                }
070    
071                public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader,
072                                        UnmarshallingContext unmarshallingContext)
073                {
074                    return null;
075                }
076            });
077    
078        }
079    
080        protected ComponentFactory createComponentFactory() {
081            return new AdaptingInjection();
082        }
083    
084        @Test public void testInstantiateComponentWithNoDependencies() throws PicoCompositionException {
085            ComponentAdapter componentAdapter =
086                createComponentFactory().createComponentAdapter(new NullComponentMonitor(),
087                                                                new NullLifecycleStrategy(),
088                                                                new Properties(Characteristics.CDI),
089                                                                Touchable.class,
090                                                                SimpleTouchable.class,
091                                                                (Parameter[])null);
092    
093            Object comp = componentAdapter.getComponentInstance(new DefaultPicoContainer(), ComponentAdapter.NOTHING.class);
094            assertNotNull(comp);
095            assertTrue(comp instanceof SimpleTouchable);
096        }
097    
098        @Test public void testSingleUsecanBeInstantiatedByDefaultComponentAdapter() {
099            ComponentAdapter componentAdapter = createComponentFactory().createComponentAdapter(new NullComponentMonitor(),
100                                                                                                new NullLifecycleStrategy(),
101                                                                                                new Properties(
102                                                                                                    Characteristics.CDI),
103                                                                                                "o",
104                                                                                                Object.class,
105                                                                                                (Parameter[])null);
106            Object component = componentAdapter.getComponentInstance(new DefaultPicoContainer(), ComponentAdapter.NOTHING.class);
107            assertNotNull(component);
108        }
109    
110    
111        @Test public void testFactoryMakesConstructorInjector() {
112    
113            ComponentFactory cf = createComponentFactory();
114    
115            ConsoleComponentMonitor cm = new ConsoleComponentMonitor();
116            ComponentAdapter ca = cf.createComponentAdapter(cm, new NullLifecycleStrategy(), new Properties(),
117                                                            Map.class, HashMap.class, Parameter.DEFAULT);
118    
119            String foo = xs.toXML(ca).replace("\"", "");
120    
121            assertEquals("<Constructor-Injection>\n" +
122                         "  <componentKey class=java-class>java.util.Map</componentKey>\n" +
123                         "  <componentImplementation>java.util.HashMap</componentImplementation>\n" +
124                         "  <componentMonitor class=CCM/>\n" +
125                         "  <useNames>false</useNames>\n" +
126                         "  <rememberChosenConstructor>true</rememberChosenConstructor>\n" +
127                         "  <enableEmjection>false</enableEmjection>\n" +
128                         "</Constructor-Injection>", foo);
129    
130    
131        }
132    
133        @Test public void testFactoryMakesFieldAnnotationInjector() {
134    
135            ComponentFactory cf = createComponentFactory();
136    
137            ConsoleComponentMonitor cm = new ConsoleComponentMonitor();
138            ComponentAdapter ca = cf.createComponentAdapter(cm,
139                                                            new NullLifecycleStrategy(),
140                                                            new Properties(),
141                                                            AnnotatedFieldInjectorTestCase.Helicopter.class,
142                                                            AnnotatedFieldInjectorTestCase.Helicopter.class,
143                                                            Parameter.DEFAULT);
144    
145            String foo = xs.toXML(ca).replace("\"", "");
146    
147            assertEquals("<Field-Injection>\n" +
148                         "  <componentKey class=java-class>org.picocontainer.injectors.AnnotatedFieldInjectorTestCase$Helicopter</componentKey>\n" +
149                         "  <componentImplementation>org.picocontainer.injectors.AnnotatedFieldInjectorTestCase$Helicopter</componentImplementation>\n" +
150                         "  <componentMonitor class=CCM/>\n" +
151                    "  <useNames>false</useNames>\n" +
152                    "  <injectionAnnotation>org.picocontainer.annotations.Inject</injectionAnnotation>\n" +
153                         "</Field-Injection>", foo);
154    
155    
156        }
157    
158        @Test public void testFactoryMakesMethodAnnotationInjector() {
159    
160            ComponentFactory cf = createComponentFactory();
161    
162            ConsoleComponentMonitor cm = new ConsoleComponentMonitor();
163            ComponentAdapter ca = cf.createComponentAdapter(cm,
164                                                            new NullLifecycleStrategy(),
165                                                            new Properties(),
166                                                            AnnotatedMethodInjectorTestCase.AnnotatedBurp.class,
167                                                            AnnotatedMethodInjectorTestCase.AnnotatedBurp.class,
168                                                            Parameter.DEFAULT);
169    
170            String foo = xs.toXML(ca).replace("\"", "");
171    
172            assertEquals("<Method-Injection>\n" +
173                         "  <componentKey class=java-class>org.picocontainer.injectors.AnnotatedMethodInjectorTestCase$AnnotatedBurp</componentKey>\n" +
174                         "  <componentImplementation>org.picocontainer.injectors.AnnotatedMethodInjectorTestCase$AnnotatedBurp</componentImplementation>\n" +
175                         "  <componentMonitor class=CCM/>\n" +
176                         "  <useNames>false</useNames>\n" +
177                         "  <prefix></prefix>\n" +
178                         "  <injectionAnnotation>org.picocontainer.annotations.Inject</injectionAnnotation>\n" +
179                         "</Method-Injection>", foo);
180    
181    
182        }
183    
184    
185    }