    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    }