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