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    }