001    package org.picocontainer.doc.advanced;
002    
003    import junit.framework.TestCase;
004    
005    import org.picocontainer.MutablePicoContainer;
006    import org.picocontainer.Parameter;
007    import org.picocontainer.defaults.CollectionComponentParameter;
008    import org.picocontainer.defaults.ComponentParameter;
009    import org.picocontainer.defaults.DefaultPicoContainer;
010    
011    import java.util.Collection;
012    import java.util.HashSet;
013    import java.util.LinkedList;
014    import java.util.Set;
015    
016    
017    /**
018     * @author Jörg Schaible
019     * @version $Revision: 1796 $
020     */
021    public class CollectionsTestCase
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 LinkedList fishes;
034            private final Collection cods;
035    
036            public Bowl(LinkedList fishes, Collection cods) {
037                this.fishes = fishes;
038                this.cods = cods;
039            }
040    
041            public Collection getFishes() {
042                return fishes;
043            }
044    
045            public Collection 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.class);
057            pico.registerComponentImplementation(Cod.class);
058            pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{
059                    new ComponentParameter(Fish.class, false), new ComponentParameter(Cod.class, false)});
060            //      END SNIPPET: usage
061    
062            Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class);
063            Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class);
064            Bowl bowl = (Bowl) pico.getComponentInstanceOfType(Bowl.class);
065    
066            Collection fishes = bowl.getFishes();
067            assertEquals(2, fishes.size());
068            assertTrue(fishes.contains(shark));
069            assertTrue(fishes.contains(cod));
070    
071            Collection cods = bowl.getCods();
072            assertEquals(1, cods.size());
073            assertTrue(cods.contains(cod));
074        }
075    
076        public void testShouldCreateBowlWithFishesOnly() {
077    
078            //      START SNIPPET: directUsage
079    
080            final Set set = new HashSet();
081            pico.registerComponentImplementation(Shark.class);
082            pico.registerComponentImplementation(Cod.class);
083            pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{
084                    new ComponentParameter(Fish.class, false), new ComponentParameter(Cod.class, false)});
085            pico.registerComponentInstance(set);
086    
087            Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class);
088            //      END SNIPPET: directUsage
089    
090            Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class);
091            Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class);
092    
093            //      START SNIPPET: directDemo
094    
095            Collection cods = bowl.getCods();
096            assertEquals(0, cods.size());
097            assertSame(set, cods);
098    
099            Collection fishes = bowl.getFishes();
100            assertEquals(2, fishes.size());
101            //      END SNIPPET: directDemo
102    
103            assertTrue(fishes.contains(cod));
104            assertTrue(fishes.contains(shark));
105        }
106    
107        public void testShouldCreateBowlWithFishCollectionAnyway() {
108    
109            //      START SNIPPET: ensureCollection
110    
111            pico.registerComponentImplementation(Shark.class);
112            pico.registerComponentImplementation(Cod.class);
113            pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{
114                    new CollectionComponentParameter(Fish.class, false), new CollectionComponentParameter(Cod.class, false)});
115            // This component will match both arguments of Bowl's constructor
116            pico.registerComponentInstance(new LinkedList());
117    
118            Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class);
119            //      END SNIPPET: ensureCollection
120    
121            Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class);
122            Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class);
123    
124            Collection fishes = bowl.getFishes();
125            assertEquals(2, fishes.size());
126            Collection cods = bowl.getCods();
127            assertEquals(1, cods.size());
128    
129            assertTrue(fishes.contains(shark));
130            assertTrue(fishes.contains(cod));
131            assertTrue(cods.contains(cod));
132        }
133    
134        public void testShouldCreateBowlWithNoFishAtAll() {
135    
136            //      START SNIPPET: emptyCollection
137    
138            pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{
139                    new ComponentParameter(Fish.class, true), new ComponentParameter(Cod.class, true)});
140    
141            Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class);
142            //      END SNIPPET: emptyCollection
143    
144            Collection fishes = bowl.getFishes();
145            assertEquals(0, fishes.size());
146            Collection cods = bowl.getCods();
147            assertEquals(0, cods.size());
148        }
149    }