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.Collection;
012 import java.util.HashSet;
013 import java.util.LinkedList;
014 import java.util.Set;
015
016
017 /**
018 * @author Jörg Schaible
019 * @version $Revision: 1796 $
020 */
021 public class CollectionsTestCase
022 extends TestCase
023 implements CollectionDemoClasses {
024 private MutablePicoContainer pico;
025
026 protected void setUp() throws Exception {
027 pico = new DefaultPicoContainer();
028 }
029
030 // START SNIPPET: bowl
031
032 public static class Bowl {
033 private final LinkedList fishes;
034 private final Collection cods;
035
036 public Bowl(LinkedList fishes, Collection cods) {
037 this.fishes = fishes;
038 this.cods = cods;
039 }
040
041 public Collection getFishes() {
042 return fishes;
043 }
044
045 public Collection getCods() {
046 return cods;
047 }
048 }
049
050 // END SNIPPET: bowl
051
052 public void testShouldCreateBowlWithFishCollection() {
053
054 // START SNIPPET: usage
055
056 pico.registerComponentImplementation(Shark.class);
057 pico.registerComponentImplementation(Cod.class);
058 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{
059 new ComponentParameter(Fish.class, false), new ComponentParameter(Cod.class, false)});
060 // END SNIPPET: usage
061
062 Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class);
063 Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class);
064 Bowl bowl = (Bowl) pico.getComponentInstanceOfType(Bowl.class);
065
066 Collection fishes = bowl.getFishes();
067 assertEquals(2, fishes.size());
068 assertTrue(fishes.contains(shark));
069 assertTrue(fishes.contains(cod));
070
071 Collection cods = bowl.getCods();
072 assertEquals(1, cods.size());
073 assertTrue(cods.contains(cod));
074 }
075
076 public void testShouldCreateBowlWithFishesOnly() {
077
078 // START SNIPPET: directUsage
079
080 final Set set = new HashSet();
081 pico.registerComponentImplementation(Shark.class);
082 pico.registerComponentImplementation(Cod.class);
083 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{
084 new ComponentParameter(Fish.class, false), new ComponentParameter(Cod.class, false)});
085 pico.registerComponentInstance(set);
086
087 Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class);
088 // END SNIPPET: directUsage
089
090 Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class);
091 Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class);
092
093 // START SNIPPET: directDemo
094
095 Collection cods = bowl.getCods();
096 assertEquals(0, cods.size());
097 assertSame(set, cods);
098
099 Collection fishes = bowl.getFishes();
100 assertEquals(2, fishes.size());
101 // END SNIPPET: directDemo
102
103 assertTrue(fishes.contains(cod));
104 assertTrue(fishes.contains(shark));
105 }
106
107 public void testShouldCreateBowlWithFishCollectionAnyway() {
108
109 // START SNIPPET: ensureCollection
110
111 pico.registerComponentImplementation(Shark.class);
112 pico.registerComponentImplementation(Cod.class);
113 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{
114 new CollectionComponentParameter(Fish.class, false), new CollectionComponentParameter(Cod.class, false)});
115 // This component will match both arguments of Bowl's constructor
116 pico.registerComponentInstance(new LinkedList());
117
118 Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class);
119 // END SNIPPET: ensureCollection
120
121 Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class);
122 Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class);
123
124 Collection fishes = bowl.getFishes();
125 assertEquals(2, fishes.size());
126 Collection cods = bowl.getCods();
127 assertEquals(1, cods.size());
128
129 assertTrue(fishes.contains(shark));
130 assertTrue(fishes.contains(cod));
131 assertTrue(cods.contains(cod));
132 }
133
134 public void testShouldCreateBowlWithNoFishAtAll() {
135
136 // START SNIPPET: emptyCollection
137
138 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{
139 new ComponentParameter(Fish.class, true), new ComponentParameter(Cod.class, true)});
140
141 Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class);
142 // END SNIPPET: emptyCollection
143
144 Collection fishes = bowl.getFishes();
145 assertEquals(0, fishes.size());
146 Collection cods = bowl.getCods();
147 assertEquals(0, cods.size());
148 }
149 }