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 * Idea by Rachel Davies, Original code by Aslak Hellesoy and Paul Hammant *
009 *****************************************************************************/
010
011 package org.picocontainer.defaults;
012
013 import static org.junit.Assert.assertEquals;
014 import static org.junit.Assert.assertFalse;
015 import static org.junit.Assert.assertNotNull;
016 import static org.junit.Assert.assertNull;
017 import static org.junit.Assert.assertSame;
018 import static org.junit.Assert.assertTrue;
019 import static org.junit.Assert.fail;
020
021 import java.util.ArrayList;
022 import java.util.List;
023
024 import org.junit.Test;
025 import org.picocontainer.DefaultPicoContainer;
026 import org.picocontainer.MutablePicoContainer;
027 import org.picocontainer.NameBinding;
028 import org.picocontainer.PicoCompositionException;
029 import org.picocontainer.parameters.ComponentParameter;
030 import org.picocontainer.parameters.ConstantParameter;
031 import org.picocontainer.testmodel.DependsOnTouchable;
032 import org.picocontainer.testmodel.SimpleTouchable;
033 import org.picocontainer.testmodel.Touchable;
034 import org.picocontainer.testmodel.Webster;
035
036 public final class NoneOfTheseTestsAffectCoverageMeaningTheyCouldGoTestCase {
037
038 //TODO - move to AbstractComponentRegistryTestCase
039 @Test public void testGetComponentSpecification() throws PicoCompositionException {
040 DefaultPicoContainer pico = new DefaultPicoContainer();
041
042 assertNull(pico.getComponentAdapter(Touchable.class, (NameBinding) null));
043 pico.addComponent(SimpleTouchable.class);
044 assertNotNull(pico.getComponentAdapter(SimpleTouchable.class, (NameBinding) null));
045 assertNotNull(pico.getComponentAdapter(Touchable.class,(NameBinding) null));
046 }
047
048
049 //TODO move
050 @Test public void testMultipleImplementationsAccessedThroughKey()
051 throws PicoCompositionException
052 {
053 SimpleTouchable Touchable1 = new SimpleTouchable();
054 SimpleTouchable Touchable2 = new SimpleTouchable();
055 DefaultPicoContainer pico = new DefaultPicoContainer();
056 pico.addComponent("Touchable1", Touchable1);
057 pico.addComponent("Touchable2", Touchable2);
058 pico.addComponent("fred1", DependsOnTouchable.class, new ComponentParameter("Touchable1"));
059 pico.addComponent("fred2", DependsOnTouchable.class, new ComponentParameter("Touchable2"));
060
061 DependsOnTouchable fred1 = (DependsOnTouchable) pico.getComponent("fred1");
062 DependsOnTouchable fred2 = (DependsOnTouchable) pico.getComponent("fred2");
063
064 assertFalse(fred1 == fred2);
065 assertSame(Touchable1, fred1.getTouchable());
066 assertSame(Touchable2, fred2.getTouchable());
067 }
068
069 //TODO - move
070 @Test public void testRegistrationByName() throws Exception {
071 DefaultPicoContainer pico = new DefaultPicoContainer();
072
073 Webster one = new Webster(new ArrayList());
074 Touchable two = new SimpleTouchable();
075
076 pico.addComponent("one", one);
077 pico.addComponent("two", two);
078
079 assertEquals("Wrong number of comps in the internals", 2, pico.getComponents().size());
080
081 assertEquals("Looking up one Touchable", one, pico.getComponent("one"));
082 assertEquals("Looking up two Touchable", two, pico.getComponent("two"));
083
084 assertTrue("Object one the same", one == pico.getComponent("one"));
085 assertTrue("Object two the same", two == pico.getComponent("two"));
086
087 assertEquals("Lookup of unknown key should return null", null, pico.getComponent("unknown"));
088 }
089
090 @Test public void testRegistrationByNameAndClassWithResolving() throws Exception {
091 DefaultPicoContainer pico = new DefaultPicoContainer();
092
093 pico.addComponent(List.class, new ArrayList());
094 pico.addComponent("one", Webster.class);
095 pico.addComponent("two", SimpleTouchable.class);
096
097 assertEquals("Wrong number of comps in the internals", 3, pico.getComponents().size());
098
099 assertNotNull("Object one the same", pico.getComponent("one"));
100 assertNotNull("Object two the same", pico.getComponent("two"));
101
102 assertNull("Lookup of unknown key should return null", pico.getComponent("unknown"));
103 }
104
105 @Test public void testDuplicateRegistrationWithTypeAndObject() throws PicoCompositionException {
106 DefaultPicoContainer pico = new DefaultPicoContainer();
107
108 pico.addComponent(SimpleTouchable.class);
109 try {
110 pico.addComponent(SimpleTouchable.class, new SimpleTouchable());
111 fail("Should have barfed with dupe registration");
112 } catch (PicoCompositionException e) {
113 // expected
114 assertTrue(e.getMessage().startsWith("Duplicate"));
115 assertTrue(e.getMessage().indexOf(SimpleTouchable.class.getName()) > 0);
116 }
117 }
118
119
120 @Test public void testComponentRegistrationMismatch() throws PicoCompositionException {
121 MutablePicoContainer pico = new DefaultPicoContainer();
122
123 try {
124 pico.addComponent(List.class, SimpleTouchable.class);
125 } catch (ClassCastException e) {
126 // not worded in message
127 assertTrue(e.getMessage().indexOf(List.class.getName()) > 0);
128 assertTrue(e.getMessage().indexOf(SimpleTouchable.class.getName()) == 0);
129 }
130
131 }
132
133 interface Animal {
134
135 String getFood();
136 }
137
138 public static class Dino implements Animal {
139 final String food;
140
141 public Dino(String food) {
142 this.food = food;
143 }
144
145 public String getFood() {
146 return food;
147 }
148 }
149
150 public static class Dino2 extends Dino {
151 public Dino2(int number) {
152 super(String.valueOf(number));
153 }
154 }
155
156 public static class Dino3 extends Dino {
157 public Dino3(String a, String b) {
158 super(a + b);
159 }
160 }
161
162 public static class Dino4 extends Dino {
163 public Dino4(String a, int n, String b, Touchable Touchable) {
164 super(a + n + b + " " + Touchable.getClass().getName());
165 }
166 }
167
168 @Test public void testParameterCanBePassedToConstructor() throws Exception {
169 DefaultPicoContainer pico = new DefaultPicoContainer();
170 pico.addComponent(Animal.class,
171 Dino.class,
172 new ConstantParameter("bones"));
173
174 Animal animal = pico.getComponent(Animal.class);
175 assertNotNull("Component not null", animal);
176 assertEquals("bones", animal.getFood());
177 }
178
179 @Test public void testParameterCanBePrimitive() throws Exception {
180 DefaultPicoContainer pico = new DefaultPicoContainer();
181 pico.addComponent(Animal.class, Dino2.class, new ConstantParameter(22));
182
183 Animal animal = pico.getComponent(Animal.class);
184 assertNotNull("Component not null", animal);
185 assertEquals("22", animal.getFood());
186 }
187
188 @Test public void testMultipleParametersCanBePassed() throws Exception {
189 DefaultPicoContainer pico = new DefaultPicoContainer();
190 pico.addComponent(Animal.class, Dino3.class, new ConstantParameter("a"),
191 new ConstantParameter("b"));
192
193 Animal animal = pico.getComponent(Animal.class);
194 assertNotNull("Component not null", animal);
195 assertEquals("ab", animal.getFood());
196
197 }
198
199 @Test public void testParametersCanBeMixedWithComponentsCanBePassed() throws Exception {
200 DefaultPicoContainer pico = new DefaultPicoContainer();
201 pico.addComponent(Touchable.class, SimpleTouchable.class);
202 pico.addComponent(Animal.class, Dino4.class, new ConstantParameter("a"),
203 new ConstantParameter(3),
204 new ConstantParameter("b"),
205 ComponentParameter.DEFAULT);
206
207 Animal animal = pico.getComponent(Animal.class);
208 assertNotNull("Component not null", animal);
209 assertEquals("a3b org.picocontainer.testmodel.SimpleTouchable", animal.getFood());
210 }
211
212 }