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