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