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 package org.picocontainer.defaults;
009
010 import java.util.ArrayList;
011 import java.util.HashSet;
012 import java.util.Iterator;
013 import java.util.List;
014 import java.util.Set;
015
016 import junit.framework.TestCase;
017
018 import org.picocontainer.ComponentAdapter;
019 import org.picocontainer.MutablePicoContainer;
020 import org.picocontainer.Parameter;
021 import org.picocontainer.PicoContainer;
022 import org.picocontainer.PicoVisitor;
023
024 /**
025 * @author Michael Rimov
026 */
027 public class TraversalCheckingVisitorTestCase extends TestCase {
028
029 private MutablePicoContainer pico;
030
031 private MutablePicoContainer child;
032
033 private ComponentAdapter parentAdapter;
034
035 private ComponentAdapter childAdapter;
036
037 protected void setUp() throws Exception {
038 super.setUp();
039
040 pico = new DefaultPicoContainer();
041 parentAdapter = pico.registerComponent(new SetterInjectionComponentAdapter(StringBuffer.class, StringBuffer.class, null));
042
043 child = pico.makeChildContainer();
044
045 childAdapter = child.registerComponent(new ConstructorInjectionComponentAdapter(ArrayList.class, ArrayList.class,
046 new Parameter[] {
047 new ConstantParameter(new Integer(3))
048 }));
049 }
050
051 protected void tearDown() throws Exception {
052 super.tearDown();
053 child = null;
054 pico = null;
055 parentAdapter = null;
056 childAdapter = null;
057 }
058
059 public void testVisitComponentAdapter() {
060 final int numExpectedComponentAdapters = 2;
061 final List allAdapters = new ArrayList();
062
063 Set knownAdapters = new HashSet();
064 knownAdapters.add(parentAdapter);
065 knownAdapters.add(childAdapter);
066
067 PicoVisitor containerCollector = new TraversalCheckingVisitor() {
068 public void visitComponentAdapter(ComponentAdapter adapter) {
069 super.visitComponentAdapter(adapter); //Calls checkTraversal for us.
070 allAdapters.add(adapter);
071 }
072 };
073 containerCollector.traverse(pico);
074
075 assertEquals(numExpectedComponentAdapters, allAdapters.size());
076
077 for (Iterator i = allAdapters.iterator(); i.hasNext(); ) {
078 boolean knownAdapter = knownAdapters.remove(i.next());
079 assertTrue("Encountered unknown adapter in collection: " + allAdapters.toString(), knownAdapter);
080 }
081
082 assertTrue("All adapters should match known adapters.", knownAdapters.size() == 0);
083 }
084
085 public void testVisitContainer() {
086 final List allContainers = new ArrayList();
087 final int expectedNumberOfContainers = 2;
088
089 PicoVisitor containerCollector = new TraversalCheckingVisitor() {
090 public void visitContainer(PicoContainer pico) {
091 super.visitContainer(pico); //Calls checkTraversal for us.
092 allContainers.add(pico);
093 }
094 };
095
096 containerCollector.traverse(pico);
097
098 assertTrue(allContainers.size() == expectedNumberOfContainers);
099
100 Set knownContainers = new HashSet();
101 knownContainers.add(pico);
102 knownContainers.add(child);
103 for (Iterator i = allContainers.iterator(); i.hasNext(); ) {
104 PicoContainer oneContainer = (PicoContainer) i.next();
105 boolean knownContainer = knownContainers.remove(oneContainer);
106 assertTrue("Found a picocontainer that wasn't previously expected.", knownContainer);
107 }
108
109 assertTrue("All containers must match what is returned by traversal.",
110 knownContainers.size() == 0);
111
112 }
113
114
115 public void testVisitParameter() {
116 final List allParameters = new ArrayList();
117
118 PicoVisitor containerCollector = new TraversalCheckingVisitor() {
119 public void visitParameter(Parameter param) {
120 super.visitParameter(param); //Calls checkTraversal for us.
121 allParameters.add(param);
122 }
123 };
124
125 containerCollector.traverse(pico);
126
127 assertTrue(allParameters.size() == 1);
128 assertTrue(allParameters.get(0) instanceof ConstantParameter);
129 assertTrue( ( (ConstantParameter) allParameters.get(0)).resolveInstance(null, null, null) instanceof Integer);
130 assertEquals(3, ( (Integer) ( (ConstantParameter) allParameters.get(0)).resolveInstance(null, null,
131 null)).intValue());
132 }
133
134 }