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 }