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.containers;
011
012 import static org.junit.Assert.assertEquals;
013 import static org.junit.Assert.assertNotNull;
014 import static org.junit.Assert.assertNull;
015 import static org.junit.Assert.fail;
016
017 import java.io.IOException;
018 import java.io.StringReader;
019 import org.junit.Test;
020 import org.picocontainer.Characteristics;
021 import org.picocontainer.DefaultPicoContainer;
022 import org.picocontainer.annotations.Inject;
023 import org.picocontainer.injectors.AbstractInjector;
024 import org.picocontainer.injectors.AnnotatedFieldInjection;
025 import org.picocontainer.injectors.SetterInjection;
026
027 public class CommandLinePicoContainerTestCase {
028
029 @Test public void testBasicParsing() {
030 CommandLinePicoContainer apc = new CommandLinePicoContainer(new String[] {
031 "foo=bar", "foo2=12", "foo3=true", "foo4="
032 });
033 assertEquals("bar",apc.getComponent("foo"));
034 assertEquals("12",apc.getComponent("foo2"));
035 assertEquals("true",apc.getComponent("foo3"));
036 assertEquals("true",apc.getComponent("foo4"));
037 }
038
039 @Test public void testAsParentContainer() {
040 CommandLinePicoContainer apc = new CommandLinePicoContainer(new String[] {
041 "a=aaa", "b=bbb", "d=22"});
042 assertEquals("aaa",apc.getComponent("a"));
043 assertEquals("bbb",apc.getComponent("b"));
044 assertEquals("22",apc.getComponent("d"));
045
046 DefaultPicoContainer dpc = new DefaultPicoContainer(apc);
047 dpc.addComponent(NeedsString.class);
048 assertEquals("bbb", dpc.getComponent(NeedsString.class).val);
049 }
050
051 public static class NeedsString {
052 public String val;
053 public NeedsString(String b) {
054 val = b;
055 }
056 }
057
058 @Test public void testParsingWithDiffSeparator() {
059 CommandLinePicoContainer apc = new CommandLinePicoContainer(":", new String[] {
060 "foo:bar", "foo2:12", "foo3:true"
061 });
062 assertEquals("bar",apc.getComponent("foo"));
063 assertEquals("12",apc.getComponent("foo2"));
064 assertEquals("true",apc.getComponent("foo3"));
065 }
066
067 @Test public void testParsingWithWrongSeparator() {
068 CommandLinePicoContainer apc = new CommandLinePicoContainer(":", new String[] {
069 "foo=bar", "foo2=12", "foo3=true"
070 });
071 assertEquals("true",apc.getComponent("foo=bar"));
072 assertEquals("true",apc.getComponent("foo2=12"));
073 assertEquals("true",apc.getComponent("foo3=true"));
074 }
075
076 @Test public void testParsingOfPropertiesFile() throws IOException {
077 CommandLinePicoContainer apc = new CommandLinePicoContainer(":",
078 new StringReader("foo:bar\nfoo2:12\nfoo3:true\n"));
079 assertEquals("bar",apc.getComponent("foo"));
080 assertEquals("12",apc.getComponent("foo2"));
081 assertEquals("true",apc.getComponent("foo3"));
082 }
083
084 @Test public void testParsingOfPropertiesFileAndArgs() throws IOException {
085 CommandLinePicoContainer apc = new CommandLinePicoContainer(":",
086 new StringReader("foo:bar\nfoo2:12\n"), new String[] {"foo3:true"});
087 assertEquals("bar",apc.getComponent("foo"));
088 assertEquals("12",apc.getComponent("foo2"));
089 assertEquals("true",apc.getComponent("foo3"));
090 }
091
092 @Test public void testParsingOfPropertiesFileAndArgsWithClash() throws IOException {
093 CommandLinePicoContainer apc = new CommandLinePicoContainer(":",
094 new StringReader("foo:bar\nfoo2:99\n"), new String[] {"foo2:12","foo3:true"});
095 assertEquals("bar",apc.getComponent("foo"));
096 assertEquals("12",apc.getComponent("foo2"));
097 assertEquals("true",apc.getComponent("foo3"));
098 }
099
100 @Test public void testbyTypeFailsEvenIfOneOfSameType() {
101 CommandLinePicoContainer apc = new CommandLinePicoContainer(new String[] {
102 "foo=bar"});
103 assertEquals("bar",apc.getComponent("foo"));
104 assertNull(apc.getComponent(String.class));
105 }
106
107 @Test public void testUnsatisfiableIfNoSuitableTyesForInjection() {
108 CommandLinePicoContainer apc = new CommandLinePicoContainer(new String[] {"zz=zz"});
109 DefaultPicoContainer pico = new DefaultPicoContainer(apc);
110 pico.as(Characteristics.USE_NAMES).addComponent(NeedsAFew.class);
111 try {
112 Object foo = pico.getComponent(NeedsAFew.class);
113 fail();
114 } catch (AbstractInjector.UnsatisfiableDependenciesException e) {
115 // expetced;
116 }
117 }
118 public static class NeedsAFew {
119 private final String a;
120 private final int b;
121 private final boolean c;
122 public NeedsAFew(String a, int b, boolean c) {
123 this.a = a;
124 this.b = b;
125 this.c = c;
126 }
127 }
128
129 @Test public void testConstructorInjectionComponentCanDependOnConfig() {
130 CommandLinePicoContainer apc = new CommandLinePicoContainer(new String[] {"a=a", "b=2", "c=true"});
131 DefaultPicoContainer pico = new DefaultPicoContainer(apc);
132 pico.addConfig("zzz","zzz");
133 pico.as(Characteristics.USE_NAMES).addComponent(NeedsAFew.class);
134 NeedsAFew needsAFew = pico.getComponent(NeedsAFew.class);
135 assertNotNull(needsAFew);
136 assertEquals("a", needsAFew.a);
137 assertEquals(2, needsAFew.b);
138 assertEquals(true, needsAFew.c);
139 }
140
141 public static class NeedsAFew2 {
142 private String a;
143 private int b;
144 private boolean c;
145
146 public void setA(String a) {
147 this.a = a;
148 }
149
150 public void setB(int b) {
151 this.b = b;
152 }
153
154 public void setC(boolean c) {
155 this.c = c;
156 }
157 }
158
159 @Test public void testSetterInjectionComponentCanDependOnConfig() {
160 CommandLinePicoContainer apc = new CommandLinePicoContainer(new String[] {"a=a", "b=2", "c=true"});
161 DefaultPicoContainer pico = new DefaultPicoContainer(new SetterInjection(), apc);
162 pico.addConfig("zzz","zzz");
163 pico.as(Characteristics.USE_NAMES).addComponent(NeedsAFew2.class);
164 NeedsAFew2 needsAFew = pico.getComponent(NeedsAFew2.class);
165 assertNotNull(needsAFew);
166 assertEquals("a", needsAFew.a);
167 assertEquals(2, needsAFew.b);
168 assertEquals(true, needsAFew.c);
169 }
170
171 public static class NeedsAFew3 {
172 @Inject
173 private String a;
174 @Inject
175 private int b;
176 @Inject
177 private boolean c;
178 }
179
180 @Test public void testAnnotatedFieldInjectionComponentCanDependOnConfig() {
181 CommandLinePicoContainer apc = new CommandLinePicoContainer(new String[] {"a=a", "b=2", "c=true"});
182 DefaultPicoContainer pico = new DefaultPicoContainer(new AnnotatedFieldInjection(), apc);
183 pico.addConfig("zzz","zzz");
184 pico.as(Characteristics.USE_NAMES).addComponent(NeedsAFew3.class);
185 NeedsAFew3 needsAFew = pico.getComponent(NeedsAFew3.class);
186 assertNotNull(needsAFew);
187 assertEquals("a", needsAFew.a);
188 assertEquals(2, needsAFew.b);
189 assertEquals(true, needsAFew.c);
190 }
191
192 @Test public void testRepresentationOfContainerTree() {
193 CommandLinePicoContainer parent = new CommandLinePicoContainer(new String[] {"a=a", "b=2", "c=true"});
194 parent.setName("parent");
195 DefaultPicoContainer child = new DefaultPicoContainer(parent);
196 child.setName("child");
197 child.addComponent("hello", "goodbye");
198 child.addComponent("bonjour", "aurevior");
199 assertEquals("child:2<I<D<parent:3<|", child.toString());
200 }
201
202
203 }