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.Parameter;
016    import org.picocontainer.parameters.CollectionComponentParameter;
017    import org.picocontainer.parameters.ComponentParameter;
018    import org.picocontainer.DefaultPicoContainer;
019    import org.picocontainer.injectors.ConstructorInjectionFactory;
020    import org.picocontainer.behaviors.CachingBehaviorFactory;
021    
022    import java.util.Arrays;
023    import java.util.List;
024    
025    
026    /**
027     * @author Aslak Hellesøy
028     * @author Jörg Schaible
029     * @version $Revision: 3603 $
030     */
031    public class ArraysTestCase
032            extends TestCase
033            implements CollectionDemoClasses {
034        private MutablePicoContainer pico;
035    
036        protected void setUp() throws Exception {
037            pico = new DefaultPicoContainer(new CachingBehaviorFactory().forThis(new ConstructorInjectionFactory()));
038        }
039    
040        private void explanation() {
041            // START SNIPPET: explanation
042    
043            Shark shark = new Shark();
044            Cod cod = new Cod();
045    
046            Fish[] fishes = new Fish[]{shark, cod};
047            Cod[] cods = new Cod[]{cod};
048    
049            Bowl bowl = new Bowl(fishes, cods);
050            // END SNIPPET: explanation
051        }
052    
053        // START SNIPPET: bowl
054    
055        public static class Bowl {
056            private final Fish[] fishes;
057            private final Cod[] cods;
058    
059            public Bowl(Fish[] fishes, Cod[] cods) {
060                this.fishes = fishes;
061                this.cods = cods;
062            }
063    
064            public Fish[] getFishes() {
065                return fishes;
066            }
067    
068            public Cod[] getCods() {
069                return cods;
070            }
071        }
072    
073        // END SNIPPET: bowl
074    
075        public void testShouldCreateBowlWithFishCollection() {
076    
077            //      START SNIPPET: usage
078    
079            pico.addComponent(Shark.class);
080            pico.addComponent(Cod.class);
081            pico.addComponent(Bowl.class);
082    
083            Bowl bowl = pico.getComponent(Bowl.class);
084            //      END SNIPPET: usage
085    
086            Shark shark = pico.getComponent(Shark.class);
087            Cod cod = pico.getComponent(Cod.class);
088    
089            List fishes = Arrays.asList(bowl.getFishes());
090            assertEquals(2, fishes.size());
091            assertTrue(fishes.contains(shark));
092            assertTrue(fishes.contains(cod));
093    
094            List cods = Arrays.asList(bowl.getCods());
095            assertEquals(1, cods.size());
096            assertTrue(cods.contains(cod));
097        }
098    
099        public void testShouldCreateBowlWithCodsOnly() {
100    
101            //      START SNIPPET: directUsage
102    
103            pico.addComponent(Shark.class);
104            pico.addComponent(Cod.class);
105            pico.addComponent(Bowl.class);
106            pico.addComponent(new Fish[]{});
107    
108            Bowl bowl = pico.getComponent(Bowl.class);
109            //      END SNIPPET: directUsage
110    
111            Cod cod = pico.getComponent(Cod.class);
112    
113            //      START SNIPPET: directDemo
114    
115            List cods = Arrays.asList(bowl.getCods());
116            assertEquals(1, cods.size());
117    
118            List fishes = Arrays.asList(bowl.getFishes());
119            assertEquals(0, fishes.size());
120            //      END SNIPPET: directDemo
121    
122            assertTrue(cods.contains(cod));
123        }
124    
125        public void testShouldCreateBowlWithFishCollectionAnyway() {
126    
127            //      START SNIPPET: ensureArray
128    
129            pico.addComponent(Shark.class);
130            pico.addComponent(Cod.class);
131            Parameter parameter = new CollectionComponentParameter();
132            pico.addComponent(Bowl.class, Bowl.class, parameter, parameter);
133            pico.addComponent(new Fish[]{});
134            pico.addComponent(new Cod[]{});
135    
136            Bowl bowl = pico.getComponent(Bowl.class);
137            //      END SNIPPET: ensureArray
138    
139            Shark shark = pico.getComponent(Shark.class);
140            Cod cod = pico.getComponent(Cod.class);
141    
142            //      START SNIPPET: ensureDemo
143    
144            List fishes = Arrays.asList(bowl.getFishes());
145            assertEquals(2, fishes.size());
146    
147            List cods = Arrays.asList(bowl.getCods());
148            assertEquals(1, cods.size());
149            //      END SNIPPET: ensureDemo
150    
151            assertTrue(fishes.contains(shark));
152            assertTrue(fishes.contains(cod));
153            assertTrue(cods.contains(cod));
154        }
155    
156        public void testShouldCreateBowlWithNoFishAtAll() {
157    
158            //      START SNIPPET: emptyArray
159    
160            Parameter parameter = CollectionComponentParameter.ARRAY_ALLOW_EMPTY;
161            pico.addComponent(Bowl.class, Bowl.class, parameter, parameter);
162    
163            Bowl bowl = pico.getComponent(Bowl.class);
164            //      END SNIPPET: emptyArray
165    
166            List fishes = Arrays.asList(bowl.getFishes());
167            assertEquals(0, fishes.size());
168            List cods = Arrays.asList(bowl.getCods());
169            assertEquals(0, cods.size());
170        }
171    
172        public void testShouldCreateBowlWithNamedFishesOnly() {
173    
174            //      START SNIPPET: useKeyType
175    
176            pico.addComponent(Shark.class);
177            pico.addComponent("Nemo", Cod.class);
178            pico.addComponent(Bowl.class, Bowl.class,
179                              new ComponentParameter(String.class, Fish.class, false), new ComponentParameter(Cod.class, false));
180    
181            Bowl bowl = pico.getComponent(Bowl.class);
182            //      END SNIPPET: useKeyType
183    
184            //      START SNIPPET: ensureKeyType
185    
186            List fishes = Arrays.asList(bowl.getFishes());
187            List cods = Arrays.asList(bowl.getCods());
188            assertEquals(1, fishes.size());
189            assertEquals(1, cods.size());
190            assertEquals(fishes, cods);
191            //      END SNIPPET: ensureKeyType
192        }
193    }