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 }