001    package org.picocontainer.script;
002    
003    import static org.junit.Assert.assertEquals;
004    import static org.junit.Assert.fail;
005    import static org.picocontainer.behaviors.Behaviors.caching;
006    import static org.picocontainer.behaviors.Behaviors.implementationHiding;
007    import static org.picocontainer.injectors.Injectors.SDI;
008    
009    import java.io.IOException;
010    import java.util.HashMap;
011    
012    import org.junit.Test;
013    import org.picocontainer.ComponentFactory;
014    import org.picocontainer.ComponentMonitor;
015    import org.picocontainer.DefaultPicoContainer;
016    import org.picocontainer.LifecycleStrategy;
017    import org.picocontainer.MutablePicoContainer;
018    import org.picocontainer.PicoContainer;
019    import org.picocontainer.classname.ClassLoadingPicoContainer;
020    import org.picocontainer.classname.DefaultClassLoadingPicoContainer;
021    import org.picocontainer.behaviors.Caching;
022    import org.picocontainer.behaviors.ImplementationHiding;
023    import org.picocontainer.behaviors.Synchronizing;
024    import org.picocontainer.containers.EmptyPicoContainer;
025    import org.picocontainer.injectors.AdaptingInjection;
026    import org.picocontainer.injectors.AnnotatedMethodInjection;
027    import org.picocontainer.injectors.ConstructorInjection;
028    import org.picocontainer.injectors.SetterInjection;
029    import org.picocontainer.lifecycle.NullLifecycleStrategy;
030    import org.picocontainer.lifecycle.ReflectionLifecycleStrategy;
031    import org.picocontainer.lifecycle.StartableLifecycleStrategy;
032    import org.picocontainer.monitors.ConsoleComponentMonitor;
033    import org.picocontainer.monitors.NullComponentMonitor;
034    
035    import com.thoughtworks.xstream.XStream;
036    
037    public class ScriptedBuilderTestCase {
038    
039        XStream xs = new XStream();
040    
041        @Test public void testBasic() throws IOException {
042            ClassLoadingPicoContainer nc = new ScriptedBuilder().build();
043            NullComponentMonitor cm = new NullComponentMonitor();
044            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new AdaptingInjection(),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
045            assertEquals(xs.toXML(expected),xs.toXML(nc));
046        }
047    
048        @Test public void testWithStartableLifecycle() throws IOException {
049            ClassLoadingPicoContainer nc = new ScriptedBuilder().withLifecycle().build();
050            NullComponentMonitor cm = new NullComponentMonitor();
051            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new AdaptingInjection(),new StartableLifecycleStrategy(cm), new EmptyPicoContainer(), null, cm);
052            assertEquals(xs.toXML(expected),xs.toXML(nc));
053        }
054    
055        @Test public void testWithReflectionLifecycle() throws IOException {
056            ClassLoadingPicoContainer nc = new ScriptedBuilder().withReflectionLifecycle().build();
057            NullComponentMonitor cm = new NullComponentMonitor();
058            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new AdaptingInjection(),new ReflectionLifecycleStrategy(cm), new EmptyPicoContainer(), null, cm);
059            assertEquals(xs.toXML(expected),xs.toXML(nc));
060        }
061    
062        @Test public void testWithConsoleMonitor() throws IOException {
063            ClassLoadingPicoContainer nc = new ScriptedBuilder().withConsoleMonitor().build();
064            ConsoleComponentMonitor cm = new ConsoleComponentMonitor();
065            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new AdaptingInjection(),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
066            assertEquals(xs.toXML(expected),xs.toXML(nc));
067        }
068    
069        @Test public void testWithCustomMonitorByClass() throws IOException {
070            ClassLoadingPicoContainer nc = new ScriptedBuilder().withMonitor(ConsoleComponentMonitor.class).build();
071            ConsoleComponentMonitor cm = new ConsoleComponentMonitor();
072            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new AdaptingInjection(),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
073            assertEquals(xs.toXML(expected),xs.toXML(nc));
074        }
075    
076        @SuppressWarnings({ "unchecked" })
077        @Test public void testWithBogusCustomMonitorByClass() {
078            try {
079                Class aClass = HashMap.class;
080                new ScriptedBuilder().withMonitor(aClass).build();
081                fail("should have barfed");
082            } catch (ClassCastException e) {
083                // expected
084            }
085        }
086    
087        @Test public void testWithImplementationHiding() throws IOException {
088            ClassLoadingPicoContainer nc = new ScriptedBuilder().withHiddenImplementations().build();
089            ComponentMonitor cm = new NullComponentMonitor();
090            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new ImplementationHiding().wrap(new AdaptingInjection()),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
091            assertEquals(xs.toXML(expected),xs.toXML(nc));
092        }
093    
094    
095        @Test public void testWithImplementationHidingInstance() throws IOException {
096            ClassLoadingPicoContainer nc = new ScriptedBuilder().withComponentFactory(new ImplementationHiding()).build();
097            ComponentMonitor cm = new NullComponentMonitor();
098            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new ImplementationHiding().wrap(new AdaptingInjection()),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
099            assertEquals(xs.toXML(expected),xs.toXML(nc));
100        }
101    
102        @Test public void testWithComponentFactoriesListChainThingy() throws IOException{
103            ClassLoadingPicoContainer nc = new ScriptedBuilder(SDI()).withComponentAdapterFactories(caching(), implementationHiding()).build();
104            ComponentMonitor cm = new NullComponentMonitor();
105            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new Caching().wrap(new ImplementationHiding().wrap(new SetterInjection())),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
106            assertEquals(xs.toXML(expected),xs.toXML(nc));
107        }
108    
109        @SuppressWarnings("serial")
110            public static class CustomParentcontainer extends EmptyPicoContainer {
111        }
112    
113        @Test public void testWithCustomParentContainer() throws IOException {
114            ClassLoadingPicoContainer nc = new ScriptedBuilder(new CustomParentcontainer()).build();
115            ComponentMonitor cm = new NullComponentMonitor();
116            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new AdaptingInjection(),new NullLifecycleStrategy(), new CustomParentcontainer(), null, cm);
117            assertEquals(xs.toXML(expected),xs.toXML(nc));
118        }
119    
120        @Test public void testWithBogusParentContainerBehavesAsIfNotSet() throws IOException {
121            ClassLoadingPicoContainer nc = new ScriptedBuilder((PicoContainer)null).build();
122            ComponentMonitor cm = new NullComponentMonitor();
123            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new AdaptingInjection(),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
124            assertEquals(xs.toXML(expected),xs.toXML(nc));
125        }
126    
127    
128        @Test public void testWithSetterDI() throws IOException {
129            ClassLoadingPicoContainer nc = new ScriptedBuilder().withSetterInjection().build();
130            ComponentMonitor cm = new NullComponentMonitor();
131            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new SetterInjection(),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
132            assertEquals(xs.toXML(expected),xs.toXML(nc));
133        }
134    
135        @Test public void testWithAnnotationDI() throws IOException {
136            ClassLoadingPicoContainer nc = new ScriptedBuilder().withAnnotatedMethodInjection().build();
137            ComponentMonitor cm = new NullComponentMonitor();
138            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new AnnotatedMethodInjection(),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
139            assertEquals(xs.toXML(expected),xs.toXML(nc));
140        }
141    
142        @Test public void testWithCtorDI() throws IOException {
143            ClassLoadingPicoContainer nc = new ScriptedBuilder().withConstructorInjection().build();
144            ComponentMonitor cm = new NullComponentMonitor();
145            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new ConstructorInjection(),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
146            assertEquals(xs.toXML(expected),xs.toXML(nc));
147        }
148    
149        @Test public void testWithImplementationHidingAndSetterDI() throws IOException {
150            ClassLoadingPicoContainer nc = new ScriptedBuilder().withHiddenImplementations().withSetterInjection().build();
151            ComponentMonitor cm = new NullComponentMonitor();
152            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new ImplementationHiding().wrap(new SetterInjection()),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
153            assertEquals(xs.toXML(expected),xs.toXML(nc));
154        }
155    
156        @Test public void testWithCachingImplementationHidingAndSetterDI() throws IOException {
157            ClassLoadingPicoContainer nc = new ScriptedBuilder().withCaching().withHiddenImplementations().withSetterInjection().build();
158            ComponentMonitor cm = new NullComponentMonitor();
159            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new Caching().wrap(new ImplementationHiding().wrap(new SetterInjection())),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
160            assertEquals(xs.toXML(expected),xs.toXML(nc));
161        }
162    
163        @Test public void testWithThreadSafety() throws IOException {
164            ClassLoadingPicoContainer nc = new ScriptedBuilder().withThreadSafety().build();
165            ComponentMonitor cm = new NullComponentMonitor();
166            ClassLoadingPicoContainer expected = new DefaultClassLoadingPicoContainer(new Synchronizing().wrap(new AdaptingInjection()),new NullLifecycleStrategy(), new EmptyPicoContainer(), null, cm);
167            assertEquals(xs.toXML(expected),xs.toXML(nc));
168        }
169    
170        @Test public void testWithCustomScriptedContainer() throws IOException {
171            ClassLoadingPicoContainer nc = new ScriptedBuilder().implementedBy(TestScriptedContainer.class).build();
172            ClassLoadingPicoContainer expected = new TestScriptedContainer(null,new DefaultPicoContainer(new AdaptingInjection(),new NullLifecycleStrategy(), new EmptyPicoContainer()));
173            assertEquals(xs.toXML(expected),xs.toXML(nc));
174        }
175    
176    
177        @SuppressWarnings("serial")
178            public static class TestScriptedContainer extends DefaultClassLoadingPicoContainer {
179            public TestScriptedContainer(ClassLoader classLoader, MutablePicoContainer delegate) {
180                super(classLoader, delegate);
181            }
182        }
183    
184        @Test public void testWithCustomScriptedAndPicoContainer() throws IOException {
185            ClassLoadingPicoContainer nc = new ScriptedBuilder().implementedBy(TestScriptedContainer.class).picoImplementedBy(TestPicoContainer.class).build();
186            ClassLoadingPicoContainer expected = new TestScriptedContainer(null, new TestPicoContainer(new AdaptingInjection(), new NullComponentMonitor(), new NullLifecycleStrategy(), new EmptyPicoContainer()));
187            assertEquals(xs.toXML(expected),xs.toXML(nc));
188        }
189    
190        @SuppressWarnings("serial")
191            public static class TestPicoContainer extends DefaultPicoContainer {
192            public TestPicoContainer(ComponentFactory componentFactory, ComponentMonitor monitor, LifecycleStrategy lifecycleStrategy, PicoContainer parent) {
193                super(componentFactory, lifecycleStrategy, parent, monitor);
194            }
195        }
196    
197    
198    
199    
200    }