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    }