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 * 009 *****************************************************************************/ 010 package org.picocontainer.behaviors; 011 012 import static org.junit.Assert.assertEquals; 013 import static org.junit.Assert.assertNotNull; 014 import static org.picocontainer.Characteristics.AUTOMATIC; 015 import static org.picocontainer.behaviors.Behaviors.automatic; 016 import static org.picocontainer.behaviors.Behaviors.caching; 017 018 import org.junit.Test; 019 import org.picocontainer.ComponentAdapter; 020 import org.picocontainer.DefaultPicoContainer; 021 import org.picocontainer.MutablePicoContainer; 022 import org.picocontainer.PicoBuilder; 023 import org.picocontainer.injectors.ConstructorInjector; 024 import org.picocontainer.lifecycle.NullLifecycleStrategy; 025 import org.picocontainer.monitors.NullComponentMonitor; 026 027 public class AutomatingTestCase { 028 029 private static String MESSAGE = 030 "Foo was instantiated, even though it was not required to be given it was not depended on by anything looked up"; 031 032 public static class Foo { 033 public Foo(StringBuilder sb) { 034 sb.append(MESSAGE); 035 } 036 } 037 038 public static class Bar { 039 } 040 041 @Test public void testAutomaticBehavior() { 042 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new Automating())); 043 pico.addComponent(StringBuilder.class); 044 pico.addComponent(Foo.class); 045 pico.addComponent(Bar.class); 046 pico.start(); 047 assertNotNull(pico.getComponent(Bar.class)); 048 StringBuilder sb = pico.getComponent(StringBuilder.class); 049 assertEquals(MESSAGE, sb.toString()); 050 ComponentAdapter<?> adapter = pico.getComponentAdapter(Foo.class); 051 String s = adapter.toString(); 052 assertEquals("Cached+Lifecycle:Automated:LifecycleAdapter:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", s); 053 } 054 055 @Test public void testAutomaticBehaviorViaAdapter() { 056 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new Automating())); 057 pico.addComponent(StringBuilder.class); 058 pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), false)); 059 pico.addComponent(Bar.class); 060 pico.start(); 061 assertNotNull(pico.getComponent(Bar.class)); 062 StringBuilder sb = pico.getComponent(StringBuilder.class); 063 assertEquals(MESSAGE, sb.toString()); 064 assertEquals("Cached+Lifecycle:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 065 } 066 067 @Test public void testNonAutomaticBehaviorAsContrastToTheAbove() { 068 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching()); 069 pico.addComponent(StringBuilder.class); 070 pico.addComponent(Foo.class); 071 pico.addComponent(Bar.class); 072 pico.start(); 073 assertNotNull(pico.getComponent(Bar.class)); 074 StringBuilder sb = pico.getComponent(StringBuilder.class); 075 assertEquals("", sb.toString()); 076 } 077 078 @Test public void testNonAutomaticBehaviorAsContrastToTheAboveViaAdapter() { 079 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching()); 080 pico.addComponent(StringBuilder.class); 081 pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), false)); 082 pico.addComponent(Bar.class); 083 pico.start(); 084 assertNotNull(pico.getComponent(Bar.class)); 085 StringBuilder sb = pico.getComponent(StringBuilder.class); 086 assertEquals("", sb.toString()); 087 } 088 089 @Test public void testAutomaticBehaviorByBuilder() { 090 MutablePicoContainer pico = new PicoBuilder().withCaching().withAutomatic().build(); 091 pico.addComponent(StringBuilder.class); 092 pico.addComponent(Foo.class); 093 pico.addComponent(Bar.class); 094 pico.start(); 095 assertNotNull(pico.getComponent(Bar.class)); 096 StringBuilder sb = pico.getComponent(StringBuilder.class); 097 assertEquals(MESSAGE, sb.toString()); 098 assertEquals("Cached+Lifecycle:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 099 } 100 101 @Test public void testAutomaticBehaviorByBuilderViaAdapter() { 102 MutablePicoContainer pico = new PicoBuilder().withCaching().withAutomatic().build(); 103 pico.addComponent(StringBuilder.class); 104 pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), false)); 105 pico.addComponent(Bar.class); 106 pico.start(); 107 assertNotNull(pico.getComponent(Bar.class)); 108 StringBuilder sb = pico.getComponent(StringBuilder.class); 109 assertEquals(MESSAGE, sb.toString()); 110 assertEquals("Cached+Lifecycle:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 111 } 112 113 @Test public void testAutomaticBehaviorByBuilderADifferentWay() { 114 MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build(); 115 pico.addComponent(StringBuilder.class); 116 pico.addComponent(Foo.class); 117 pico.addComponent(Bar.class); 118 pico.start(); 119 assertNotNull(pico.getComponent(Bar.class)); 120 StringBuilder sb = pico.getComponent(StringBuilder.class); 121 assertEquals(MESSAGE, sb.toString()); 122 assertEquals("Cached+Lifecycle:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 123 } 124 125 @Test public void testAutomaticBehaviorByBuilderADifferentWayViaAdapter() { 126 MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build(); 127 pico.addComponent(StringBuilder.class); 128 pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), false)); 129 pico.addComponent(Bar.class); 130 pico.start(); 131 assertNotNull(pico.getComponent(Bar.class)); 132 StringBuilder sb = pico.getComponent(StringBuilder.class); 133 assertEquals(MESSAGE, sb.toString()); 134 assertEquals("Cached+Lifecycle:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 135 } 136 137 @Test public void testAutomaticBehaviorWorksForAdaptiveBehaviorToo() { 138 MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build(); 139 pico.addComponent(StringBuilder.class); 140 pico.as(AUTOMATIC).addComponent(Foo.class); 141 pico.addComponent(Bar.class); 142 pico.start(); 143 assertNotNull(pico.getComponent(Bar.class)); 144 StringBuilder sb = pico.getComponent(StringBuilder.class); 145 assertEquals(MESSAGE, sb.toString()); 146 assertEquals("Cached+Lifecycle:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 147 } 148 149 @Test public void testAutomaticBehaviorWorksForAdaptiveBehaviorTooViaAdapter() { 150 MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build(); 151 pico.addComponent(StringBuilder.class); 152 pico.as(AUTOMATIC).addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), false)); 153 pico.addComponent(Bar.class); 154 pico.start(); 155 assertNotNull(pico.getComponent(Bar.class)); 156 StringBuilder sb = pico.getComponent(StringBuilder.class); 157 assertEquals(MESSAGE, sb.toString()); 158 assertEquals("Cached+Lifecycle:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomatingTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 159 } 160 161 }