001 package org.picocontainer.doc.advanced; 002 003 import java.util.Collection; 004 import java.util.Map; 005 import java.util.TreeMap; 006 007 import junit.framework.TestCase; 008 009 import org.picocontainer.ComponentAdapter; 010 import org.picocontainer.MutablePicoContainer; 011 import org.picocontainer.Parameter; 012 import org.picocontainer.defaults.CollectionComponentParameter; 013 import org.picocontainer.defaults.ComponentParameter; 014 import org.picocontainer.defaults.DefaultPicoContainer; 015 016 017 /** 018 * @author Jörg Schaible 019 * @version $Revision: 2024 $ 020 */ 021 public class MapsTestCase 022 extends TestCase 023 implements CollectionDemoClasses { 024 private MutablePicoContainer pico; 025 026 protected void setUp() throws Exception { 027 pico = new DefaultPicoContainer(); 028 } 029 030 // START SNIPPET: bowl 031 032 public static class Bowl { 033 private final TreeMap fishes; 034 private final Map cods; 035 036 public Bowl(TreeMap fishes, Map cods) { 037 this.fishes = fishes; 038 this.cods = cods; 039 } 040 041 public Map getFishes() { 042 return fishes; 043 } 044 045 public Map getCods() { 046 return cods; 047 } 048 } 049 050 // END SNIPPET: bowl 051 052 public void testShouldCreateBowlWithFishCollection() { 053 054 // START SNIPPET: usage 055 056 pico.registerComponentImplementation("Shark", Shark.class); 057 pico.registerComponentImplementation("Cod", Cod.class); 058 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 059 new ComponentParameter(Fish.class, false), 060 new ComponentParameter(Cod.class, false) 061 }); 062 // END SNIPPET: usage 063 064 Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class); 065 Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class); 066 Bowl bowl = (Bowl) pico.getComponentInstanceOfType(Bowl.class); 067 068 Map fishMap = bowl.getFishes(); 069 assertEquals(2, fishMap.size()); 070 Collection fishes = fishMap.values(); 071 assertTrue(fishes.contains(shark)); 072 assertTrue(fishes.contains(cod)); 073 074 Map codMap = bowl.getCods(); 075 assertEquals(1, codMap.size()); 076 Collection cods = fishMap.values(); 077 assertTrue(cods.contains(cod)); 078 } 079 080 public void testShouldCreateBowlWithNamedFishesOnly() { 081 082 // START SNIPPET: useKeyType 083 084 pico.registerComponentImplementation(Shark.class); 085 pico.registerComponentImplementation("Nemo", Cod.class); 086 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 087 new ComponentParameter(String.class, Fish.class, false), 088 new ComponentParameter(Cod.class, false) 089 }); 090 091 Bowl bowl = (Bowl) pico.getComponentInstanceOfType(Bowl.class); 092 // END SNIPPET: useKeyType 093 094 // START SNIPPET: ensureKeyType 095 096 Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class); 097 Map fishMap = bowl.getFishes(); 098 Map codMap = bowl.getCods(); 099 assertEquals(1, fishMap.size()); 100 assertEquals(1, codMap.size()); 101 assertEquals(fishMap, codMap); 102 assertSame(cod,fishMap.get("Nemo")); 103 // END SNIPPET: ensureKeyType 104 } 105 106 public void testShouldCreateBowlWithFishesFromParent() { 107 108 // START SNIPPET: scope 109 110 MutablePicoContainer parent = new DefaultPicoContainer(); 111 parent.registerComponentImplementation("Tom", Cod.class); 112 parent.registerComponentImplementation("Harry", Cod.class); 113 MutablePicoContainer child = new DefaultPicoContainer(parent); 114 child.registerComponentImplementation("Dick", Cod.class); 115 child.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 116 new ComponentParameter(Fish.class, false), 117 new ComponentParameter(Cod.class, false) 118 }); 119 Bowl bowl = (Bowl) child.getComponentInstance(Bowl.class); 120 assertEquals(3, bowl.fishes.size()); 121 assertEquals(3, bowl.cods.size()); 122 123 // END SNIPPET: scope 124 } 125 126 public void testShouldCreateBowlWith2CodsOnly() { 127 128 // START SNIPPET: scopeOverlay 129 130 MutablePicoContainer parent = new DefaultPicoContainer(); 131 parent.registerComponentImplementation("Tom", Cod.class); 132 parent.registerComponentImplementation("Dick", Cod.class); 133 parent.registerComponentImplementation("Harry", Cod.class); 134 MutablePicoContainer child = new DefaultPicoContainer(parent); 135 child.registerComponentImplementation("Dick", Shark.class); 136 child.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 137 new ComponentParameter(Fish.class, false), 138 new ComponentParameter(Cod.class, false) 139 }); 140 Bowl bowl = (Bowl) child.getComponentInstance(Bowl.class); 141 assertEquals(3, bowl.fishes.size()); 142 assertEquals(2, bowl.cods.size()); 143 144 // END SNIPPET: scopeOverlay 145 } 146 147 public void testShouldCreateBowlWithoutTom() { 148 149 // START SNIPPET: individualSelection 150 151 MutablePicoContainer mpc = new DefaultPicoContainer(); 152 mpc.registerComponentImplementation("Tom", Cod.class); 153 mpc.registerComponentImplementation("Dick", Cod.class); 154 mpc.registerComponentImplementation("Harry", Cod.class); 155 mpc.registerComponentImplementation("Sharky", Shark.class); 156 mpc.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 157 new CollectionComponentParameter(Fish.class, false), 158 new CollectionComponentParameter(Cod.class, false) { 159 protected boolean evaluate(ComponentAdapter adapter) { 160 return !"Tom".equals(adapter.getComponentKey()); 161 } 162 } 163 }); 164 Cod tom = (Cod) mpc.getComponentInstance("Tom"); 165 Bowl bowl = (Bowl) mpc.getComponentInstance(Bowl.class); 166 assertTrue(bowl.fishes.values().contains(tom)); 167 assertFalse(bowl.cods.values().contains(tom)); 168 169 // END SNIPPET: individualSelection 170 } 171 }