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