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.defaults.issues;
011    
012    import static org.junit.Assert.fail;
013    import static org.junit.Assert.assertNotNull;
014    
015    import org.junit.Test;
016    import org.junit.Assert;
017    import org.picocontainer.DefaultPicoContainer;
018    import org.picocontainer.MutablePicoContainer;
019    import org.picocontainer.injectors.AbstractInjector;
020    
021    public final class Issue0342TestCase {
022    
023        interface Interface {
024        }
025    
026        interface SubInterface extends Interface {
027        }
028    
029        public static class Generic<I extends Interface> {
030            private final I iface;
031    
032            public Generic(final I iface) {
033                this.iface = iface;
034            }
035        }
036    
037        public static class Implementation implements Interface {
038        }
039    
040        public static class SubImplementation implements SubInterface {
041        }
042    
043    
044        @Test
045        public void testNotTheBug() {
046            //hard coded instantitation
047            Generic<Implementation> generic1 = new Generic<Implementation>(new Implementation());
048            Assert.assertNotNull(generic1);
049            Generic<SubImplementation> generic2 = new Generic<SubImplementation>(new SubImplementation());
050            Assert.assertNotNull(generic2);
051        }
052    
053    
054        @Test
055        public void testTheBug() {
056    
057            //using picocontainer
058            DefaultPicoContainer container = new DefaultPicoContainer();
059            container.addComponent(Implementation.class);
060            container.addComponent(Generic.class);
061            Generic result = container.getComponent(Generic.class); // fails here.
062            Assert.assertNotNull(result);
063            Assert.assertNotNull(result.iface);
064    
065        }
066    
067    
068        @Test
069        public void testTheBug2() {
070    
071            DefaultPicoContainer container = new DefaultPicoContainer();
072            container.addComponent(SubImplementation.class);
073            container.addComponent(Generic.class);
074            //should be Generic<SubImplementation> but requires unsafe cast
075            Generic<?> result2 = container.getComponent(Generic.class); // fails here
076            Assert.assertNotNull(result2);
077            Assert.assertNotNull(result2.iface);
078    
079        }
080    
081    }