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