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 }