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