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 * 009 *****************************************************************************/ 010 package org.picocontainer.defaults; 011 012 import junit.framework.TestCase; 013 014 import org.picocontainer.ComponentAdapter; 015 import org.picocontainer.MutablePicoContainer; 016 import org.picocontainer.Parameter; 017 import org.picocontainer.PicoInitializationException; 018 import org.picocontainer.PicoIntrospectionException; 019 import org.picocontainer.PicoRegistrationException; 020 import org.picocontainer.testmodel.DependsOnTouchable; 021 import org.picocontainer.testmodel.SimpleTouchable; 022 import org.picocontainer.testmodel.Touchable; 023 024 025 /** 026 * @author Jon Tirsen (tirsen@codehaus.org) 027 * @version $Revision: 1.7 $ 028 */ 029 public class ParameterTestCase extends TestCase { 030 031 public void testComponentParameterFetches() throws PicoRegistrationException, PicoInitializationException { 032 DefaultPicoContainer pico = new DefaultPicoContainer(); 033 ComponentAdapter adapter = pico.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 034 assertNotNull(adapter); 035 assertNotNull(pico.getComponentInstance(Touchable.class)); 036 Touchable touchable = (Touchable) ComponentParameter.DEFAULT.resolveInstance(pico, null, Touchable.class); 037 assertNotNull(touchable); 038 } 039 040 public void testComponentParameterExcludesSelf() throws PicoRegistrationException, PicoInitializationException { 041 DefaultPicoContainer pico = new DefaultPicoContainer(); 042 ComponentAdapter adapter = pico.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 043 044 assertNotNull(pico.getComponentInstance(Touchable.class)); 045 Touchable touchable = (Touchable) ComponentParameter.DEFAULT.resolveInstance(pico, adapter, Touchable.class); 046 assertNull(touchable); 047 } 048 049 public void testConstantParameter() throws PicoInitializationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoIntrospectionException { 050 Object value = new Object(); 051 ConstantParameter parameter = new ConstantParameter(value); 052 MutablePicoContainer picoContainer = new DefaultPicoContainer(); 053 assertSame(value, parameter.resolveInstance(picoContainer, null, Object.class)); 054 } 055 056 public void testDependsOnTouchableWithTouchableSpecifiedAsConstant() throws PicoRegistrationException, PicoInitializationException { 057 DefaultPicoContainer pico = new DefaultPicoContainer(); 058 SimpleTouchable touchable = new SimpleTouchable(); 059 pico.registerComponentImplementation(DependsOnTouchable.class, DependsOnTouchable.class, new Parameter[]{ 060 new ConstantParameter(touchable) 061 }); 062 pico.getComponentInstances(); 063 assertTrue(touchable.wasTouched); 064 } 065 066 public void testComponentParameterRespectsExpectedType() { 067 MutablePicoContainer picoContainer = new DefaultPicoContainer(); 068 ComponentAdapter adapter = picoContainer.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 069 assertNull(ComponentParameter.DEFAULT.resolveInstance(picoContainer, adapter, TestCase.class)); 070 } 071 072 public void testComponentParameterResolvesPrimitiveType() { 073 MutablePicoContainer picoContainer = new DefaultPicoContainer(); 074 ComponentAdapter adapter = picoContainer.registerComponentInstance("glarch", new Integer(239)); 075 assertNotNull(adapter); 076 Parameter parameter = new ComponentParameter("glarch"); 077 assertNotNull(parameter.resolveInstance(picoContainer,null,Integer.TYPE)); 078 assertEquals(239, ((Integer)parameter.resolveInstance(picoContainer,null,Integer.TYPE)).intValue()); 079 } 080 081 public void testConstantParameterRespectsExpectedType() { 082 MutablePicoContainer picoContainer = new DefaultPicoContainer(); 083 Parameter parameter = new ConstantParameter(new SimpleTouchable()); 084 ComponentAdapter adapter = picoContainer.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 085 assertFalse(parameter.isResolvable(picoContainer, adapter, TestCase.class)); 086 } 087 088 public void testParameterRespectsExpectedType() throws PicoInitializationException, NotConcreteRegistrationException, PicoIntrospectionException { 089 Parameter parameter = new ConstantParameter(Touchable.class); 090 MutablePicoContainer picoContainer = new DefaultPicoContainer(); 091 assertFalse(parameter.isResolvable(picoContainer, null, TestCase.class)); 092 093 ComponentAdapter adapter = picoContainer.registerComponentImplementation(Touchable.class, SimpleTouchable.class); 094 095 assertNull(ComponentParameter.DEFAULT.resolveInstance(picoContainer, adapter, TestCase.class)); 096 } 097 098 public void testConstantParameterWithPrimitives() throws PicoInitializationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoIntrospectionException { 099 MutablePicoContainer picoContainer = new DefaultPicoContainer(); 100 Byte byteValue = new Byte((byte) 5); 101 ConstantParameter parameter = new ConstantParameter(byteValue); 102 assertSame(byteValue, parameter.resolveInstance(picoContainer, null, Byte.TYPE)); 103 assertSame(byteValue, parameter.resolveInstance(picoContainer, null, Byte.class)); 104 Short shortValue = new Short((short) 5); 105 parameter = new ConstantParameter(shortValue); 106 assertSame(shortValue, parameter.resolveInstance(picoContainer, null, Short.TYPE)); 107 assertSame(shortValue, parameter.resolveInstance(picoContainer, null, Short.class)); 108 Integer intValue = new Integer(5); 109 parameter = new ConstantParameter(intValue); 110 assertSame(intValue, parameter.resolveInstance(picoContainer, null, Integer.TYPE)); 111 assertSame(intValue, parameter.resolveInstance(picoContainer, null, Integer.class)); 112 Long longValue = new Long(5); 113 parameter = new ConstantParameter(longValue); 114 assertSame(longValue, parameter.resolveInstance(picoContainer, null, Long.TYPE)); 115 assertSame(longValue, parameter.resolveInstance(picoContainer, null, Long.class)); 116 Float floatValue = new Float(5.5); 117 parameter = new ConstantParameter(floatValue); 118 assertSame(floatValue, parameter.resolveInstance(picoContainer, null, Float.TYPE)); 119 assertSame(floatValue, parameter.resolveInstance(picoContainer, null, Float.class)); 120 Double doubleValue = new Double(5.5); 121 parameter = new ConstantParameter(doubleValue); 122 assertSame(doubleValue, parameter.resolveInstance(picoContainer, null, Double.TYPE)); 123 assertSame(doubleValue, parameter.resolveInstance(picoContainer, null, Double.class)); 124 Boolean booleanValue = new Boolean(true); 125 parameter = new ConstantParameter(booleanValue); 126 assertSame(booleanValue, parameter.resolveInstance(picoContainer, null, Boolean.TYPE)); 127 assertSame(booleanValue, parameter.resolveInstance(picoContainer, null, Boolean.class)); 128 Character charValue = new Character('x'); 129 parameter = new ConstantParameter(charValue); 130 assertSame(charValue, parameter.resolveInstance(picoContainer, null, Character.TYPE)); 131 assertSame(charValue, parameter.resolveInstance(picoContainer, null, Character.class)); 132 } 133 134 public void testConstantParameterWithPrimitivesRejectsUnexpectedType() throws PicoInitializationException, AssignabilityRegistrationException, NotConcreteRegistrationException, PicoIntrospectionException { 135 MutablePicoContainer picoContainer = new DefaultPicoContainer(); 136 Byte byteValue = new Byte((byte) 5); 137 ConstantParameter parameter = new ConstantParameter(byteValue); 138 assertFalse(parameter.isResolvable(picoContainer, null, Integer.TYPE)); 139 Short shortValue = new Short((short) 5); 140 parameter = new ConstantParameter(shortValue); 141 assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE)); 142 Integer intValue = new Integer(5); 143 parameter = new ConstantParameter(intValue); 144 assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE)); 145 Long longValue = new Long(5); 146 parameter = new ConstantParameter(longValue); 147 assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE)); 148 Float floatValue = new Float(5.5); 149 parameter = new ConstantParameter(floatValue); 150 assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE)); 151 Double doubleValue = new Double(5.5); 152 parameter = new ConstantParameter(doubleValue); 153 assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE)); 154 Boolean booleanValue = new Boolean(true); 155 parameter = new ConstantParameter(booleanValue); 156 assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE)); 157 Character charValue = new Character('x'); 158 parameter = new ConstantParameter(charValue); 159 assertFalse(parameter.isResolvable(picoContainer, null, Byte.TYPE)); 160 } 161 162 public void testKeyClashBug118() throws PicoRegistrationException, PicoInitializationException { 163 DefaultPicoContainer pico = new DefaultPicoContainer(); 164 pico.registerComponentImplementation("A", String.class, new Parameter[]{ 165 new ConstantParameter("A") 166 }); 167 pico.registerComponentImplementation("B", String.class, new Parameter[]{ 168 new ConstantParameter("A") 169 }); 170 new VerifyingVisitor().traverse(pico); 171 } 172 173 }