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 * Original code by Paul Hammant *
009 *****************************************************************************/
010
011 package org.picocontainer.classname;
012
013 import static org.junit.Assert.assertNotNull;
014 import static org.junit.Assert.assertTrue;
015
016 import java.util.List;
017 import java.util.Properties;
018
019 import org.jmock.Mockery;
020 import org.jmock.integration.junit4.JMock;
021 import org.jmock.integration.junit4.JUnit4Mockery;
022 import org.junit.Test;
023 import org.junit.runner.RunWith;
024 import org.picocontainer.Characteristics;
025 import org.picocontainer.DefaultPicoContainer;
026 import org.picocontainer.MutablePicoContainer;
027 import org.picocontainer.PicoContainer;
028 import org.picocontainer.classname.ClassLoadingPicoContainer;
029 import org.picocontainer.classname.DefaultClassLoadingPicoContainer;
030 import org.picocontainer.behaviors.Caching;
031 import org.picocontainer.monitors.ConsoleComponentMonitor;
032 import org.picocontainer.tck.AbstractPicoContainerTest;
033
034 /**
035 * @author Paul Hammant
036 */
037 @RunWith(JMock.class)
038 public class DefaultClassLoadingPicoContainerTestCase extends AbstractPicoContainerTest {
039
040 private Mockery context = new JUnit4Mockery();
041
042
043 protected MutablePicoContainer createPicoContainer(PicoContainer parent) {
044 return new DefaultClassLoadingPicoContainer(this.getClass().getClassLoader(), new DefaultPicoContainer(new Caching(), parent));
045 }
046
047 protected Properties[] getProperties() {
048 return new Properties[] { Characteristics.NONE};
049 }
050
051 @Test public void testNamedChildContainerIsAccessible() {
052 StringBuffer sb = new StringBuffer();
053 final ClassLoadingPicoContainer parent = (ClassLoadingPicoContainer) createPicoContainer(null);
054 parent.addComponent(sb);
055 final ClassLoadingPicoContainer child = (ClassLoadingPicoContainer) parent.makeChildContainer("foo");
056 child.addComponent(LifeCycleMonitoring.class,LifeCycleMonitoring.class);
057 LifeCycleMonitoring o = (LifeCycleMonitoring) parent.getComponent((Object)("foo/*" + LifeCycleMonitoring.class.getName()));
058 assertNotNull(o);
059 }
060
061 @Test public void testNamedChildContainerIsAccessibleForStringKeys() {
062 StringBuffer sb = new StringBuffer();
063 final ClassLoadingPicoContainer parent = (ClassLoadingPicoContainer) createPicoContainer(null);
064 parent.addComponent(sb);
065 final MutablePicoContainer child = parent.makeChildContainer("foo");
066 child.addComponent("lcm",LifeCycleMonitoring.class);
067 Object o = parent.getComponent("foo/lcm");
068 assertNotNull(o);
069 assertTrue(sb.toString().indexOf("-instantiated") != -1);
070 }
071
072 @Test public void testNamedChildContainerIsAccessibleForClassKeys() {
073 StringBuffer sb = new StringBuffer();
074 final ClassLoadingPicoContainer parent = (ClassLoadingPicoContainer) createPicoContainer(null);
075 parent.addComponent(sb);
076 final MutablePicoContainer child = parent.makeChildContainer("foo");
077 child.addComponent(LifeCycleMonitoring.class,LifeCycleMonitoring.class);
078 Object o = parent.getComponent("foo/*" + LifeCycleMonitoring.class.getName());
079 assertNotNull(o);
080 assertTrue(sb.toString().indexOf("-instantiated") != -1);
081 }
082
083 @Test public void testMakeRemoveChildContainer() {
084 final ClassLoadingPicoContainer parent = (ClassLoadingPicoContainer) createPicoContainer(null);
085 parent.addComponent("java.lang.String", "This is a test");
086 MutablePicoContainer pico = parent.makeChildContainer();
087 // Verify they are indeed wired together.
088 assertNotNull(pico.getComponent("java.lang.String"));
089 boolean result = parent.removeChildContainer(pico);
090 assertTrue(result);
091 }
092
093 // test methods inherited. This container is otherwise fully compliant.
094 @Test public void testAcceptImplementsBreadthFirstStrategy() {
095 super.testAcceptImplementsBreadthFirstStrategy();
096 }
097
098 @Test(expected=IllegalStateException.class)
099 public void testSwapComponentMonitorWithNoComponentMonitorStrategyDelegateThrowsIllegalStateException() {
100 MutablePicoContainer delegate = context.mock(MutablePicoContainer.class);
101 //Delegate it twice for effect.
102 DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer(new DefaultClassLoadingPicoContainer(delegate));
103 pico.changeMonitor(new ConsoleComponentMonitor());
104 }
105
106 @Test(expected=IllegalStateException.class)
107 public void testCurrentMonitorWithNoComponentMonitorStrategyDelegateThrowsIllegalStateException() {
108 Mockery context = new JUnit4Mockery();
109 MutablePicoContainer delegate = context.mock(MutablePicoContainer.class);
110 //Delegate it twice for effect.
111 DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer(new DefaultClassLoadingPicoContainer(delegate));
112 pico.currentMonitor();
113 }
114
115 protected void addContainers(List expectedList) {
116 expectedList.add(DefaultClassLoadingPicoContainer.class);
117 expectedList.add(DefaultPicoContainer.class);
118 }
119
120
121 protected void addDefaultComponentFactories(List expectedList) {
122 expectedList.add(Caching.class);
123 }
124
125
126 }