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