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
011package org.picocontainer.defaults;
012
013import static org.junit.Assert.assertEquals;
014import static org.junit.Assert.assertFalse;
015import static org.junit.Assert.assertNotNull;
016import static org.junit.Assert.assertNull;
017import static org.junit.Assert.assertSame;
018import static org.junit.Assert.assertTrue;
019import static org.junit.Assert.fail;
020
021import java.util.ArrayList;
022import java.util.List;
023
024import org.junit.Test;
025import org.picocontainer.DefaultPicoContainer;
026import org.picocontainer.MutablePicoContainer;
027import org.picocontainer.NameBinding;
028import org.picocontainer.PicoCompositionException;
029import org.picocontainer.parameters.ComponentParameter;
030import org.picocontainer.parameters.ConstantParameter;
031import org.picocontainer.testmodel.DependsOnTouchable;
032import org.picocontainer.testmodel.SimpleTouchable;
033import org.picocontainer.testmodel.Touchable;
034import org.picocontainer.testmodel.Webster;
035
036public 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}