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