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 * Idea by Rachel Davies, Original code by Aslak Hellesoy and Paul Hammant *
009 *****************************************************************************/
010 package org.picocontainer.injectors;
011
012 import static org.junit.Assert.assertEquals;
013 import static org.junit.Assert.assertNotNull;
014 import static org.picocontainer.Characteristics.USE_NAMES;
015
016 import java.util.Properties;
017
018 import org.junit.Before;
019 import org.junit.Test;
020 import org.picocontainer.ComponentFactory;
021 import org.picocontainer.DefaultPicoContainer;
022 import org.picocontainer.lifecycle.NullLifecycleStrategy;
023 import org.picocontainer.monitors.NullComponentMonitor;
024 import org.picocontainer.parameters.ConstantParameter;
025 import org.picocontainer.tck.AbstractComponentFactoryTest;
026 import org.picocontainer.tck.AbstractComponentAdapterTest.RecordingLifecycleStrategy;
027 import org.picocontainer.testmodel.NullLifecycle;
028 import org.picocontainer.testmodel.RecordingLifecycle;
029 import org.picocontainer.testmodel.RecordingLifecycle.One;
030
031 /**
032 * @author Mauro Talevi
033 */
034 public class ConstructorInjectionTestCase extends AbstractComponentFactoryTest {
035
036 @Before
037 public void setUp() throws Exception {
038 picoContainer = new DefaultPicoContainer(createComponentFactory());
039 }
040
041 protected ComponentFactory createComponentFactory() {
042 return new ConstructorInjection();
043 }
044
045 public static class ClassA {
046 private int x;
047 public ClassA(int x) {
048 this.x = x;
049 }
050 }
051 @Test public void testAutoConversionOfIntegerParam() {
052 picoContainer.as(USE_NAMES).addComponent(ClassA.class);
053 picoContainer.addComponent("x", "12");
054 assertNotNull(picoContainer.getComponent(ClassA.class));
055 assertEquals(12,picoContainer.getComponent(ClassA.class).x);
056 }
057
058 public static class ClassB {
059 private float x;
060 public ClassB(float x) {
061 this.x = x;
062 }
063 }
064 @Test public void testAutoConversionOfFloatParam() {
065 picoContainer.as(USE_NAMES).addComponent(ClassB.class);
066 picoContainer.addComponent("x", "1.2");
067 assertNotNull(picoContainer.getComponent(ClassB.class));
068 assertEquals(1.2,picoContainer.getComponent(ClassB.class).x, 0.0001);
069 }
070
071
072 /**
073 * Test class to verify the CICA can handle
074 * a constant parameter class type.
075 *
076 */
077 @SuppressWarnings({"unchecked", "unused"})
078 public static class ClassAsConstructor {
079 private final Class type;
080
081 public ClassAsConstructor(Class type) {
082 this.type = type;
083 }
084 }
085
086 @Test
087 @SuppressWarnings("unchecked")
088 public void allowClassTypesForComponentAdapter() {
089 ConstructorInjection componentFactory = new ConstructorInjection();
090
091 ConstructorInjector cica = (ConstructorInjector)
092 componentFactory.createComponentAdapter(new NullComponentMonitor(), new NullLifecycleStrategy(), new Properties(), ClassAsConstructor.class, ClassAsConstructor.class, new ConstantParameter(String.class));
093
094 ClassAsConstructor instance = (ClassAsConstructor) cica.getComponentInstance(picoContainer);
095 assertNotNull(instance);
096
097 }
098
099
100 }