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    }