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 }