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    }