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