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.tck;
011
012 import junit.framework.TestCase;
013 import org.picocontainer.MutablePicoContainer;
014 import org.picocontainer.Parameter;
015 import org.picocontainer.PicoException;
016 import org.picocontainer.PicoRegistrationException;
017 import org.picocontainer.defaults.ComponentParameter;
018 import org.picocontainer.defaults.ConstantParameter;
019 import org.picocontainer.defaults.TooManySatisfiableConstructorsException;
020
021 /**
022 * @author Aslak Hellesøy
023 * @version $Revision: 1804 $
024 */
025 public abstract class AbstractMultipleConstructorTestCase extends TestCase {
026
027 protected abstract MutablePicoContainer createPicoContainer();
028
029 public static class Multi {
030 public String message;
031
032 public Multi(One one, Two two, Three three) {
033 message = "one two three";
034 }
035
036 public Multi(One one, Two two) {
037 message = "one two";
038 }
039
040 public Multi(Two two, One one) {
041 message = "two one";
042 }
043
044 public Multi(Two two, Three three) {
045 message = "two three";
046 }
047
048 public Multi(Three three, One one) {
049 message = "three one";
050 }
051
052 public Multi(One one, String string) {
053 message = "one string";
054 }
055
056 public Multi(One one, int i) {
057 message = "one int";
058 }
059
060 public Multi() {
061 message = "none";
062 }
063 }
064
065 public static class One {
066 }
067
068 public static class Two {
069 }
070
071 public static class Three {
072 }
073
074
075 public void testStringWorks() throws PicoException, PicoRegistrationException {
076 MutablePicoContainer pico = createPicoContainer();
077 pico.registerComponentImplementation(String.class);
078 assertEquals("", pico.getComponentInstance(String.class));
079 }
080
081 public void testMultiWithOnlySmallSatisfiedDependencyWorks() throws PicoException, PicoRegistrationException {
082 MutablePicoContainer pico = createPicoContainer();
083 pico.registerComponentImplementation(Multi.class);
084 pico.registerComponentImplementation(One.class);
085 pico.registerComponentImplementation(Three.class);
086
087 Multi multi = (Multi) pico.getComponentInstance(Multi.class);
088 assertEquals("three one", multi.message);
089 }
090
091 public void testMultiWithBothSatisfiedDependencyWorks() throws PicoException, PicoRegistrationException {
092 MutablePicoContainer pico = createPicoContainer();
093 pico.registerComponentImplementation(Multi.class);
094 pico.registerComponentImplementation(One.class);
095 pico.registerComponentImplementation(Two.class);
096 pico.registerComponentImplementation(Three.class);
097
098 Multi multi = (Multi) pico.getComponentInstance(Multi.class);
099 assertEquals("one two three", multi.message);
100 }
101
102 public void testMultiWithTwoEquallyBigSatisfiedDependenciesFails() throws PicoException, PicoRegistrationException {
103 MutablePicoContainer pico = createPicoContainer();
104 pico.registerComponentImplementation(Multi.class);
105 pico.registerComponentImplementation(One.class);
106 pico.registerComponentImplementation(Two.class);
107
108 try {
109 pico.getComponentInstance(Multi.class);
110 fail();
111 } catch (TooManySatisfiableConstructorsException e) {
112 assertTrue(e.getMessage().indexOf("Three") == -1);
113 assertEquals(3, e.getConstructors().size());
114 assertEquals(Multi.class, e.getForImplementationClass());
115 }
116 }
117
118 public void testMultiWithSatisfyingDependencyAndParametersWorks() throws PicoException, PicoRegistrationException {
119 MutablePicoContainer pico = createPicoContainer();
120 pico.registerComponentImplementation("MultiOneTwo", Multi.class, new Parameter[]{
121 ComponentParameter.DEFAULT,
122 new ComponentParameter("Two"),
123 });
124 pico.registerComponentImplementation("MultiTwoOne", Multi.class, new Parameter[]{
125 new ComponentParameter("Two"),
126 ComponentParameter.DEFAULT,
127 });
128 pico.registerComponentImplementation("MultiOneString", Multi.class, new Parameter[]{
129 ComponentParameter.DEFAULT,
130 new ConstantParameter(""),
131 });
132 pico.registerComponentImplementation("MultiOneInt", Multi.class, new Parameter[]{
133 ComponentParameter.DEFAULT,
134 new ConstantParameter(new Integer(5)),
135 });
136 pico.registerComponentImplementation("MultiNone", Multi.class, new Parameter[]{});
137 pico.registerComponentImplementation(One.class);
138 pico.registerComponentImplementation("Two", Two.class);
139
140 Multi multiOneTwo = (Multi) pico.getComponentInstance("MultiOneTwo");
141 assertEquals("one two", multiOneTwo.message);
142 Multi multiTwoOne = (Multi) pico.getComponentInstance("MultiTwoOne");
143 assertEquals("two one", multiTwoOne.message);
144 Multi multiOneString = (Multi) pico.getComponentInstance("MultiOneString");
145 assertEquals("one string", multiOneString.message);
146 Multi multiOneInt = (Multi) pico.getComponentInstance("MultiOneInt");
147 assertEquals("one int", multiOneInt.message);
148 Multi multiNone = (Multi) pico.getComponentInstance("MultiNone");
149 assertEquals("none", multiNone.message);
150 }
151 }