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 }