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