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