001    package org.picocontainer.defaults.issues;
002    
003    import static java.util.Arrays.asList;
004    import static org.junit.Assert.assertEquals;
005    
006    import java.util.List;
007    
008    import org.junit.Test;
009    import org.picocontainer.DefaultPicoContainer;
010    
011    public 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