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