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 *****************************************************************************/
010package org.picocontainer.defaults.issues;
011
012import static org.junit.Assert.fail;
013import static org.junit.Assert.assertNotNull;
014
015import org.junit.Test;
016import org.junit.Assert;
017import org.picocontainer.DefaultPicoContainer;
018import org.picocontainer.MutablePicoContainer;
019import org.picocontainer.injectors.AbstractInjector;
020
021public 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}