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