[picocontainer-scm] [scm-git][1/2] Isolating test case problem as close as possible. (Tests are failing right now)

Michael Rimov <git-yCVjj/[email protected]> Thu, 21 Feb 2013 01:42:22 -0600 (CST)
Newsgroups gmane.comp.java.picocontainer.cvs
Message-ID <[email protected]>
commit eab61262ebb50a9fdeff27e70f46ca6f60c7d933
Author:     Michael Rimov <[email protected]>
AuthorDate: Sat, 2 Feb 2013 23:16:06 -0800
Commit:     Michael Rimov <[email protected]>
CommitDate: Sat, 2 Feb 2013 23:16:06 -0800

    Isolating test case problem as close as possible.  (Tests are failing right now)

diff --git a/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java b/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java
index 93af131..feee697 100644
--- a/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java
+++ b/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java
@@ -477,9 +477,9 @@ public class DefaultPicoContainer implements MutablePicoContainer, Converting, C
             //JSR 330 Provider compatibility... we have to be able to return both the providers that provide
             //the type as well as the actual types themselves.
             Class<?> implementation = componentAdapter.getComponentImplementation();
-            boolean compatible;
             
-            compatible = JTypeHelper.isAssignableFrom(componentType, componentAdapter.getComponentImplementation());
+            
+            boolean compatible = JTypeHelper.isAssignableFrom(componentType, implementation);
             if (componentAdapter.findAdapterOfType(ProviderAdapter.class) != null) {
             	//If provider
             	//Todo: Direct access of provider adapter... work around.
diff --git a/pico/container/src/java/org/picocontainer/JTypeHelper.java b/pico/container/src/java/org/picocontainer/JTypeHelper.java
index ef9d866..114d0b7 100644
--- a/pico/container/src/java/org/picocontainer/JTypeHelper.java
+++ b/pico/container/src/java/org/picocontainer/JTypeHelper.java
@@ -18,12 +18,19 @@ public class JTypeHelper {
     public static final Generic BYTE = Generic.get(Byte.class);
     public static final Generic VOID = Generic.get(Void.TYPE);
 
+    /**
+     * 
+     * @param generic
+     * @param aClass
+     * @return
+     */
+    @SuppressWarnings("unchecked")
 	public static boolean isAssignableFrom(Generic<?> generic, Class<?> aClass) {
         Type type = generic.getType();
         if (type instanceof Class) {
             return ((Class) type).isAssignableFrom(aClass);
         } else if (type instanceof ParameterizedType) {
-            Generic g = Generic.get(aClass);
+            //Generic g = Generic.get(aClass);
             Type[] types = aClass.getGenericInterfaces();
             while (types.length == 0 && canGetSuperClass(aClass)) {
                 aClass = aClass.getSuperclass();
@@ -65,7 +72,14 @@ public class JTypeHelper {
 		return true;
 	}
 
-	public static boolean isAssignableTo(Generic<?> generic, Class aClass) {
+    /**
+     * Checks that the generic's type is a class, and performs a direct
+     * <code>aClass.isAssignableFrom(genericType)</code>
+     * @param generic the generic type to check
+     * @param aClass the type to check for compatibility/
+     * @return
+     */
+	public static boolean isAssignableTo(Generic<?> generic, Class<?> aClass) {
         if (generic.getType() instanceof Class) {
             return aClass.isAssignableFrom((Class<?>) generic.getType());
         }
diff --git a/pico/container/src/test/org/picocontainer/JTypeHelperTestCase.java b/pico/container/src/test/org/picocontainer/JTypeHelperTestCase.java
index 88f0138..341e704 100644
--- a/pico/container/src/test/org/picocontainer/JTypeHelperTestCase.java
+++ b/pico/container/src/test/org/picocontainer/JTypeHelperTestCase.java
@@ -2,13 +2,20 @@ package org.picocontainer;
 
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
+import java.lang.reflect.Type;
 import java.util.List;
 
+import javax.inject.Provider;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.picocontainer.adapters.SimpleNamedBindingAnnotationTestCase.Apple;
+import org.picocontainer.containers.JSRPicoContainerTestCase.ThreeAProvider;
+import org.picocontainer.containers.JSRPicoContainerTestCase.ThreeCProvider;
+import org.picocontainer.containers.JSRPicoContainerTestCase.C;
 
 import com.googlecode.jtype.Generic;
 
@@ -24,4 +31,61 @@ public class JTypeHelperTestCase {
 		assertFalse(JTypeHelper.isAssignableFrom(new Generic<List<HttpServletRequest>>() {}, Apple.class));
 	}
 	
+	@Test
+	public void testIsAssignableFromWithTwoClasses() {
+		Generic<List> listType = Generic.get(List.class);
+		assertTrue(JTypeHelper.isAssignableFrom(listType, List.class));
+	}
+	
+	
+	
+	
+	@Test
+	public void testIsAssignableWithACompoundTypeAndANormalClass() {
+		Generic<?> listType = Generic.get(List.class, String.class);
+		assertFalse(JTypeHelper.isAssignableFrom(listType, String.class));
+		assertTrue(JTypeHelper.isAssignableFrom(listType, List.class));
+	}
+	
+	
+	public static class SomeType implements Provider<String> {
+
+		public String get() {
+			return "Test";
+		}
+		
+	}
+	
+	@Test
+	public void testProviderType() {
+		Generic<SomeType> providerType = Generic.get(SomeType.class);
+		Generic<String> stringType = Generic.get(String.class);
+		
+		assertTrue(JTypeHelper.isAssignableFrom(stringType, String.class));
+		assertFalse(JTypeHelper.isAssignableFrom(providerType, String.class));
+		assertFalse(JTypeHelper.isAssignableFrom(stringType, SomeType.class));
+		assertTrue(JTypeHelper.isAssignableFrom(providerType, SomeType.class));
+	}
+	
+	
+	public static class TestArg {
+		public void doSomething(Provider<C> threeCProvider) {
+			
+		}
+	}
+	
+	@Test
+	public void testCombinationOfTypeFromOtherTests() throws NoSuchMethodException, SecurityException {
+		Generic<ThreeAProvider> aProvider = Generic.get(ThreeAProvider.class);
+		
+		assertFalse(JTypeHelper.isAssignableFrom(aProvider, ThreeCProvider.class));
+		
+		
+		Class<?> paramType = TestArg.class.getMethod("doSomething", Provider.class).getParameterTypes()[0];
+		Generic<?> argType = Generic.get(paramType);
+		
+		assertFalse(JTypeHelper.isAssignableFrom(argType, ThreeAProvider.class));
+	}
+
+
 }
diff --git a/pico/container/src/test/org/picocontainer/containers/JSRPicoContainerTestCase.java b/pico/container/src/test/org/picocontainer/containers/JSRPicoContainerTestCase.java
index fd28a57..2693f55 100644
--- a/pico/container/src/test/org/picocontainer/containers/JSRPicoContainerTestCase.java
+++ b/pico/container/src/test/org/picocontainer/containers/JSRPicoContainerTestCase.java
@@ -207,4 +207,43 @@ public class JSRPicoContainerTestCase {
 		assertTrue(testObject != null);
 	}
 	
+	
+	public static class ProvderTestThree {
+		public ProvderTestThree(Provider<C> arg) {
+			assertNotNull(arg);
+		}
+	}
+	
+	public static class ThreeCProvider implements Provider<C> {
+
+		public C get() {
+			return new C();
+		}
+		
+	}
+	
+	public static class ThreeAProvider implements Provider<A> {
+
+		public A get() {
+			return new A();
+		}
+		
+	}
+	
+	@Test
+	public void testConstructorInjectionCanDifferentiateDifferentGenericTypesOnProviders() {
+		MutablePicoContainer mpc = new JSRPicoContainer(new PicoBuilder().withCaching().withJavaEE5Lifecycle().build());
+		
+		
+		 mpc.addComponent(ProvderTestThree.class, ProvderTestThree.class, 
+						new JSR330ComponentParameter())  //The Test
+			.addProvider(new ThreeCProvider())  //No Qualifier
+			.addProvider(new ThreeAProvider()) //No Qualifier  Generic type provided should short it out
+			;
+		 
+		 ProvderTestThree testThree = mpc.getComponent(ProvderTestThree.class);
+		 assertNotNull(testThree);
+
+	}
+
 }
diff --git a/pico/container/src/test/org/picocontainer/injectors/ProviderAdapterTestCase.java b/pico/container/src/test/org/picocontainer/injectors/ProviderAdapterTestCase.java
index 73db591..3ee3fb9 100644
--- a/pico/container/src/test/org/picocontainer/injectors/ProviderAdapterTestCase.java
+++ b/pico/container/src/test/org/picocontainer/injectors/ProviderAdapterTestCase.java
@@ -1,10 +1,12 @@
 package org.picocontainer.injectors;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
-import org.junit.After;
-import org.junit.Before;
 import org.junit.Test;
+import org.picocontainer.JTypeHelper;
+
+import com.googlecode.jtype.Generic;
 
 public class ProviderAdapterTestCase {
 	
@@ -20,18 +22,17 @@ public class ProviderAdapterTestCase {
 		
 	}
 
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
 	@Test
 	public void testGetComponentKey() {
 		ProviderAdapter providerAdapter = new ProviderAdapter(new ProviderA());
 		assertEquals(A.class, providerAdapter.getComponentKey());
 	}
 	
+	@Test
+	public void testImplementationType() {
+		ProviderAdapter providerAdapter = new ProviderAdapter(new ProviderA());
+		assertEquals(ProviderA.class, providerAdapter.getComponentImplementation());
+		assertFalse(JTypeHelper.isAssignableFrom(Generic.get(A.class),  providerAdapter.getComponentImplementation()));
+	}
+
 }