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