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     * Original code by Aslak Hellesoy and Paul Hammant                          *
009     *****************************************************************************/
010    package org.picocontainer.script.xml;
011    
012    import static org.junit.Assert.assertEquals;
013    import static org.junit.Assert.assertNotNull;
014    import static org.junit.Assert.assertSame;
015    
016    import java.io.Reader;
017    import java.io.StringReader;
018    
019    import org.junit.Test;
020    import org.picocontainer.script.AbstractScriptedContainerBuilderTestCase;
021    import org.picocontainer.script.testmodel.DefaultWebServerConfig;
022    import org.picocontainer.script.testmodel.ThingThatTakesParamsInConstructor;
023    import org.picocontainer.script.testmodel.WebServerImpl;
024    import org.picocontainer.script.xml.XStreamContainerBuilder;
025    import org.picocontainer.ComponentAdapter;
026    import org.picocontainer.NameBinding;
027    import org.picocontainer.PicoContainer;
028    import org.picocontainer.behaviors.AbstractBehavior;
029    import org.picocontainer.behaviors.Cached;
030    
031    public class XStreamContainerBuilderTestCase extends AbstractScriptedContainerBuilderTestCase {
032    
033        @Test public void testContainerBuilding() {
034    
035            Reader script = new StringReader("" +
036                    "<container>" +
037                    "    <instance key='foo'>" +
038                    "       <string>foo bar</string>" +
039                    "    </instance>" +
040                    "    <instance key='bar'>" +
041                    "       <int>239</int>" +
042                    "    </instance>" +
043                    "    <instance>" +
044                    "       <org.picocontainer.script.testmodel.DefaultWebServerConfig>" +
045                    "                       <port>555</port>" +
046                    "       </org.picocontainer.script.testmodel.DefaultWebServerConfig>" +
047                    "    </instance>" +
048                    "        <implementation class='org.picocontainer.script.testmodel.WebServerImpl'>" +
049                    "               <dependency class='org.picocontainer.script.testmodel.DefaultWebServerConfig'/>" +
050                    "        </implementation>" +
051                    "        <implementation key='konstantin needs beer' class='org.picocontainer.script.testmodel.ThingThatTakesParamsInConstructor'>" +
052                    "               <constant>" +
053                    "                       <string>it's really late</string>" +
054                    "               </constant>" +
055                    "               <constant>" +
056                    "                       <int>239</int>" +
057                    "               </constant>" +
058                    "        </implementation>" +
059                    "</container>");
060    
061            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
062            assertEquals(5, pico.getComponents().size());
063            assertEquals("foo bar", pico.getComponent("foo"));
064            assertEquals(239, pico.getComponent("bar"));
065            assertEquals(555, pico.getComponent(DefaultWebServerConfig.class).getPort());
066    
067            assertNotNull(pico.getComponent(WebServerImpl.class));
068            assertNotNull(pico.getComponent(ThingThatTakesParamsInConstructor.class));
069            final Object o = pico.getComponent("konstantin needs beer");
070            final ThingThatTakesParamsInConstructor o2 = pico.getComponent(ThingThatTakesParamsInConstructor.class);
071            assertSame(o, o2);
072            assertEquals("it's really late239", ((ThingThatTakesParamsInConstructor) pico.getComponent("konstantin needs beer")).getValue());
073        }
074    
075        @Test public void testComponentAdapterInjection() throws Throwable {
076            Reader script = new StringReader("<container>" +
077                    "<adapter key='testAdapter'>" +
078                    "<instance key='firstString'>" +
079                    "<string>bla bla</string>" +
080                    "</instance>" +
081                    "<instance key='secondString' >" +
082                    "<string>glarch</string>" +
083                    "</instance>" +
084                    "<instance key='justInt'>" +
085                    "<int>777</int>" +
086                    "</instance>" +
087                    "<implementation key='testAdapter' class='org.picocontainer.script.xml.TestAdapter'>" +
088                    "<dependency key='firstString'/>" +
089                    "<dependency key='justInt'/>" +
090                    "<dependency key='secondString'/>" +
091                    "</implementation>" +
092                    "</adapter>" +
093                    "</container>");
094    
095            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
096            Cached<TestAdapter> ca = (Cached<TestAdapter>) pico.getComponentAdapter(TestAdapter.class, (NameBinding) null);
097    
098            assertNotNull((TestAdapter)ca.getDelegate());
099        }
100    
101        @Test public void testInstantiationOfComponentsWithInstancesOfSameComponent() throws Exception {
102            Reader script = new StringReader("" +
103                    "<container>" +
104                    "  <instance key='bean1'>" +
105                    "       <org.picocontainer.script.xml.TestBean>" +
106                    "               <foo>10</foo>" +
107                    "               <bar>hello1</bar>" +
108                    "       </org.picocontainer.script.xml.TestBean>" +
109                    "  </instance>" +
110                    "  <instance key='bean2'>" +
111                    "       <org.picocontainer.script.xml.TestBean>" +
112                    "               <foo>10</foo>" +
113                    "               <bar>hello2</bar>" +
114                    "       </org.picocontainer.script.xml.TestBean>" +
115                    "  </instance>" +
116                    "  <implementation class='org.picocontainer.script.xml.TestBeanComposer'>" +
117                    "               <dependency key='bean1'/>" +
118                    "               <dependency key='bean2'/>" +
119                    "  </implementation>" +
120                    "</container>");
121            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE");
122            assertNotNull(pico.getComponent(TestBeanComposer.class));
123            TestBeanComposer composer = pico.getComponent(TestBeanComposer.class);
124            assertEquals("bean1", "hello1", composer.getBean1().getBar());
125            assertEquals("bean2", "hello2", composer.getBean2().getBar());
126        }
127        
128        // do not know how to extract parameters off adapter....
129        @Test public void testThatDependencyUsesClassAsKey() {
130            Reader script = new StringReader("" +
131            "<container>" +                                          
132            "   <implementation class='java.lang.String'/>" +
133            "   <implementation key='foo' class='org.picocontainer.script.xml.TestBean'>" +
134            "       <dependency class='java.lang.String'/>" +
135            "   </implementation>" + 
136            "</container>"
137            );
138            
139            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null,
140                    null);
141            ComponentAdapter<?> componentAdapter = pico.getComponentAdapter("foo");
142            AbstractBehavior<?> adapter = (AbstractBehavior<?>) componentAdapter;
143            assertNotNull(adapter);
144        }
145        
146        
147        @Test public void testDefaultContsructorRegistration() throws Exception {
148            
149            Reader script = new StringReader(
150            "<container>" + 
151            "   <implementation class='org.picocontainer.script.xml.TestBean' constructor='default'/>" +
152            "   <instance>" + 
153            "       <string>blurge</string>" + 
154            "   </instance>" + 
155            "</container>"
156             );  
157            
158            
159            PicoContainer pico = buildContainer(new XStreamContainerBuilder(script, getClass().getClassLoader()), null,null);
160            TestBean bean = pico.getComponent(TestBean.class);
161            assertEquals("default",bean.getConstructorCalled());
162        }
163    }
164