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 }