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 }