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 Joerg Schaible * 009 *****************************************************************************/ 010 package org.picocontainer.defaults; 011 012 import org.picocontainer.ComponentAdapter; 013 import org.picocontainer.Disposable; 014 import org.picocontainer.MutablePicoContainer; 015 import org.picocontainer.PicoContainer; 016 import org.picocontainer.Startable; 017 import org.picocontainer.tck.AbstractComponentAdapterTestCase; 018 import org.picocontainer.testmodel.NullLifecycle; 019 import org.picocontainer.testmodel.SimpleTouchable; 020 import org.picocontainer.testmodel.Touchable; 021 022 import java.util.Map; 023 024 /** 025 * Test the InstanceComponentAdapter. 026 * 027 * @author Jörg Schaible 028 * @since 1.1 029 */ 030 public class InstanceComponentAdapterTestCase 031 extends AbstractComponentAdapterTestCase { 032 033 public void testComponentAdapterReturnsSame() { 034 final Touchable touchable = new SimpleTouchable(); 035 final ComponentAdapter componentAdapter = new InstanceComponentAdapter(Touchable.class, touchable); 036 assertSame(touchable, componentAdapter.getComponentInstance(null)); 037 } 038 039 public void testDefaultLifecycleStrategy() { 040 LifecycleComponent component = new LifecycleComponent(); 041 InstanceComponentAdapter componentAdapter = 042 new InstanceComponentAdapter(LifecycleComponent.class, component); 043 PicoContainer pico = new DefaultPicoContainer(); 044 componentAdapter.start(pico); 045 componentAdapter.stop(pico); 046 componentAdapter.dispose(pico); 047 assertEquals("start>stop>dispose>", component.buffer.toString()); 048 componentAdapter.start(component); 049 componentAdapter.stop(component); 050 componentAdapter.dispose(component); 051 assertEquals("start>stop>dispose>start>stop>dispose>", component.buffer.toString()); 052 } 053 054 private static class LifecycleComponent implements Startable, Disposable { 055 StringBuffer buffer = new StringBuffer(); 056 057 public void start() { 058 buffer.append("start>"); 059 } 060 061 public void stop() { 062 buffer.append("stop>"); 063 } 064 065 public void dispose() { 066 buffer.append("dispose>"); 067 } 068 } 069 070 public void testCustomLifecycleCanBeInjected() { 071 NullLifecycle component = new NullLifecycle(); 072 RecordingLifecycleStrategy strategy = new RecordingLifecycleStrategy(new StringBuffer()); 073 InstanceComponentAdapter componentAdapter = new InstanceComponentAdapter(NullLifecycle.class, component, strategy); 074 PicoContainer pico = new DefaultPicoContainer(); 075 componentAdapter.start(pico); 076 componentAdapter.stop(pico); 077 componentAdapter.dispose(pico); 078 assertEquals("<start<stop<dispose", strategy.recording()); 079 componentAdapter.start(component); 080 componentAdapter.stop(component); 081 componentAdapter.dispose(component); 082 assertEquals("<start<stop<dispose<start<stop<dispose", strategy.recording()); 083 } 084 085 public void testComponentAdapterCanIgnoreLifecycle() { 086 final Touchable touchable = new SimpleTouchable(); 087 InstanceComponentAdapter componentAdapter = new InstanceComponentAdapter(Touchable.class, touchable); 088 PicoContainer pico = new DefaultPicoContainer(); 089 componentAdapter.start(pico); 090 componentAdapter.stop(pico); 091 componentAdapter.dispose(pico); 092 componentAdapter.start(touchable); 093 componentAdapter.stop(touchable); 094 componentAdapter.dispose(touchable); 095 } 096 097 public void testGuardAgainstNullInstance() { 098 try { 099 new InstanceComponentAdapter(Map.class, null); 100 fail("should have barfed"); 101 } catch (NullPointerException e) { 102 assertEquals("componentInstance cannot be null", e.getMessage()); 103 } 104 } 105 106 107 /** 108 * {@inheritDoc} 109 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#getComponentAdapterType() 110 */ 111 protected Class getComponentAdapterType() { 112 return InstanceComponentAdapter.class; 113 } 114 115 /** 116 * {@inheritDoc} 117 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#getComponentAdapterNature() 118 */ 119 protected int getComponentAdapterNature() { 120 return super.getComponentAdapterNature() & ~(RESOLVING | VERIFYING | INSTANTIATING ); 121 } 122 123 /** 124 * {@inheritDoc} 125 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_verifyWithoutDependencyWorks(org.picocontainer.MutablePicoContainer) 126 */ 127 protected ComponentAdapter prepDEF_verifyWithoutDependencyWorks(MutablePicoContainer picoContainer) { 128 return new InstanceComponentAdapter("foo", "bar"); 129 } 130 131 /** 132 * {@inheritDoc} 133 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_verifyDoesNotInstantiate(org.picocontainer.MutablePicoContainer) 134 */ 135 protected ComponentAdapter prepDEF_verifyDoesNotInstantiate( 136 MutablePicoContainer picoContainer) { 137 return new InstanceComponentAdapter("Key", new Integer(4711)); 138 } 139 140 /** 141 * {@inheritDoc} 142 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_visitable() 143 */ 144 protected ComponentAdapter prepDEF_visitable() { 145 return new InstanceComponentAdapter("Key", new Integer(4711)); 146 } 147 148 /** 149 * {@inheritDoc} 150 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepSER_isSerializable(org.picocontainer.MutablePicoContainer) 151 */ 152 protected ComponentAdapter prepSER_isSerializable(MutablePicoContainer picoContainer) { 153 return new InstanceComponentAdapter("Key", new Integer(4711)); 154 } 155 156 /** 157 * {@inheritDoc} 158 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepSER_isXStreamSerializable(org.picocontainer.MutablePicoContainer) 159 */ 160 protected ComponentAdapter prepSER_isXStreamSerializable(MutablePicoContainer picoContainer) { 161 return new InstanceComponentAdapter("Key", new Integer(4711)); 162 } 163 164 }