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 static org.junit.Assert.assertEquals;
013 import static org.junit.Assert.fail;
014
015 import org.junit.Test;
016 import org.picocontainer.MutablePicoContainer;
017 import org.picocontainer.Parameter;
018 import org.picocontainer.PicoCompositionException;
019 import org.picocontainer.PicoException;
020 import org.picocontainer.parameters.ComponentParameter;
021 import org.picocontainer.parameters.ConstantParameter;
022
023
024 /**
025 * @author Aslak Hellesøy
026 */
027 public 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 }