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