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