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    }