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