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