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