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 junit.framework.TestCase;
013    
014    import org.picocontainer.MutablePicoContainer;
015    import org.picocontainer.parameters.CollectionComponentParameter;
016    import org.picocontainer.parameters.ComponentParameter;
017    import org.picocontainer.DefaultPicoContainer;
018    import org.picocontainer.injectors.AdaptiveInjectionFactory;
019    import org.picocontainer.behaviors.CachingBehaviorFactory;
020    
021    import java.util.Collection;
022    import java.util.HashSet;
023    import java.util.LinkedList;
024    import java.util.Set;
025    
026    
027    /**
028     * @author Jörg Schaible
029     * @version $Revision: 3615 $
030     */
031    public class CollectionsTestCase
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 LinkedList fishes;
044            private final Collection cods;
045    
046            public Bowl(LinkedList fishes, Collection cods) {
047                this.fishes = fishes;
048                this.cods = cods;
049            }
050    
051            public Collection getFishes() {
052                return fishes;
053            }
054    
055            public Collection 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.class);
067            pico.addComponent(Cod.class);
068            pico.addComponent(Bowl.class, Bowl.class,
069                              new ComponentParameter(Fish.class, false), 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            Collection fishes = bowl.getFishes();
077            assertEquals(2, fishes.size());
078            assertTrue(fishes.contains(shark));
079            assertTrue(fishes.contains(cod));
080    
081            Collection cods = bowl.getCods();
082            assertEquals(1, cods.size());
083            assertTrue(cods.contains(cod));
084        }
085    
086        public void testShouldCreateBowlWithFishesOnly() {
087    
088            //      START SNIPPET: directUsage
089    
090            final Set set = new HashSet();
091            pico.addComponent(Shark.class);
092            pico.addComponent(Cod.class);
093            pico.addComponent(Bowl.class, Bowl.class,
094                              new ComponentParameter(Fish.class, false), new ComponentParameter(Cod.class, false));
095            pico.addComponent(set);
096    
097            Bowl bowl = pico.getComponent(Bowl.class);
098            //      END SNIPPET: directUsage
099    
100            Shark shark = pico.getComponent(Shark.class);
101            Cod cod = pico.getComponent(Cod.class);
102    
103            //      START SNIPPET: directDemo
104    
105            Collection cods = bowl.getCods();
106            assertEquals(0, cods.size());
107            assertSame(set, cods);
108    
109            Collection fishes = bowl.getFishes();
110            assertEquals(2, fishes.size());
111            //      END SNIPPET: directDemo
112    
113            assertTrue(fishes.contains(cod));
114            assertTrue(fishes.contains(shark));
115        }
116    
117        public void testShouldCreateBowlWithFishCollectionAnyway() {
118    
119            //      START SNIPPET: ensureCollection
120    
121            pico.addComponent(Shark.class);
122            pico.addComponent(Cod.class);
123            pico.addComponent(Bowl.class, Bowl.class,
124                              new CollectionComponentParameter(Fish.class, false), new CollectionComponentParameter(Cod.class, false));
125            // This component will match both arguments of Bowl's constructor
126            pico.addComponent(new LinkedList());
127    
128            Bowl bowl = pico.getComponent(Bowl.class);
129            //      END SNIPPET: ensureCollection
130    
131            Shark shark = pico.getComponent(Shark.class);
132            Cod cod = pico.getComponent(Cod.class);
133    
134            Collection fishes = bowl.getFishes();
135            assertEquals(2, fishes.size());
136            Collection cods = bowl.getCods();
137            assertEquals(1, cods.size());
138    
139            assertTrue(fishes.contains(shark));
140            assertTrue(fishes.contains(cod));
141            assertTrue(cods.contains(cod));
142        }
143    
144        public void testShouldCreateBowlWithNoFishAtAll() {
145    
146            //      START SNIPPET: emptyCollection
147    
148            pico.addComponent(Bowl.class, Bowl.class,
149                              new ComponentParameter(Fish.class, true), new ComponentParameter(Cod.class, true));
150    
151            Bowl bowl = pico.getComponent(Bowl.class);
152            //      END SNIPPET: emptyCollection
153    
154            Collection fishes = bowl.getFishes();
155            assertEquals(0, fishes.size());
156            Collection cods = bowl.getCods();
157            assertEquals(0, cods.size());
158        }
159    }