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 }