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 }