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 }