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}