001package org.picocontainer.defaults.issues;
002
003import static java.util.Arrays.asList;
004import static org.junit.Assert.assertEquals;
005
006import java.util.List;
007
008import org.junit.Test;
009import org.picocontainer.DefaultPicoContainer;
010
011public class Issue0382TestCase {
012
013    public interface Paramaterized<T> {
014        T get();
015    }
016
017    public static class StringParameterized implements Paramaterized<String> {
018
019        public String get() {
020            return "Hello World";
021        }
022    }
023
024    public static class AcceptsParameterized {
025        private final Paramaterized<?> _paramaterized;
026        private final String[] _strings;
027
028        public AcceptsParameterized(final Paramaterized<?> paramaterized, final String...strings) {
029            _paramaterized = paramaterized;
030            _strings = strings;
031        }
032    }
033
034    public static class AcceptsParameterizedWithWildcardArray extends AcceptsParameterized {
035        public AcceptsParameterizedWithWildcardArray(final Paramaterized<?> paramaterized, final String...strings) {
036            super(paramaterized, strings);
037        }
038    }
039
040    public static class AcceptsParameterizedWithoutWildcardArray extends AcceptsParameterized {
041        // Note wildcard is omitted deliberately.
042        public AcceptsParameterizedWithoutWildcardArray(@SuppressWarnings("rawtypes") final Paramaterized paramaterized, final String...strings) {
043            super(paramaterized, strings);
044        }
045    }
046
047
048    public static class AcceptsParameterizedWithWildcardList extends AcceptsParameterized {
049        public AcceptsParameterizedWithWildcardList(final Paramaterized<?> paramaterized, final List<String> strings) {
050            super(paramaterized, strings.toArray(new String[3]));
051        }
052    }
053
054    public static class AcceptsParameterizedWithoutWildcardList extends AcceptsParameterized {
055        // Note wildcard is omitted deliberately.
056        public AcceptsParameterizedWithoutWildcardList(@SuppressWarnings("rawtypes") final Paramaterized paramaterized, final List<String> strings) {
057            super(paramaterized, strings.toArray(new String[3]));
058        }
059    }
060
061    @Test
062    public void testWithWildcardArray() throws Exception {
063        Class<? extends AcceptsParameterized> type = AcceptsParameterizedWithWildcardArray.class;
064        assertConstructs(type);
065    }
066
067    @Test
068    public void testWithoutWildcardArray() throws Exception {
069        Class<? extends AcceptsParameterized> type = AcceptsParameterizedWithoutWildcardArray.class;
070        assertConstructs(type);
071    }
072
073
074    @Test
075    public void testWithWildcardList() throws Exception {
076        Class<? extends AcceptsParameterized> type = AcceptsParameterizedWithWildcardList.class;
077        assertConstructs(type);
078    }
079
080    @Test
081    public void testWithoutWildcardList() throws Exception {
082        Class<? extends AcceptsParameterized> type = AcceptsParameterizedWithoutWildcardList.class;
083        assertConstructs(type);
084    }
085
086    private void assertConstructs(final Class<? extends AcceptsParameterized> type) {
087        DefaultPicoContainer pico = new DefaultPicoContainer();
088        pico.addComponent(Paramaterized.class, StringParameterized.class);
089        pico.addComponent(type);
090        pico.addComponent(1, "one");
091        pico.addComponent(2, "two");
092        pico.addComponent(3, "three");
093        AcceptsParameterized component = pico.getComponent(AcceptsParameterized.class);
094        assertEquals("Hello World", component._paramaterized.get());
095        assertEquals(asList("one", "two", "three"), asList(component._strings));
096    }
097
098
099}
100