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