/******************************************************************************* * Copyright (c) 2010 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.core.test.tck.lookup; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IType; import org.jboss.tools.cdi.core.IBean; import org.jboss.tools.cdi.core.IClassBean; import org.jboss.tools.cdi.core.IInjectionPoint; import org.jboss.tools.cdi.core.IInjectionPointField; import org.jboss.tools.cdi.core.IProducerField; import org.jboss.tools.cdi.core.IProducerMethod; import org.jboss.tools.cdi.core.IQualifierDeclaration; import org.jboss.tools.cdi.core.test.tck.TCKTest; import org.jboss.tools.common.EclipseUtil; import org.jboss.tools.common.java.IParametedType; import org.jboss.tools.common.model.util.EclipseJavaUtil; /** * @author Alexey Kazakov */ public class ResolutionByTypeTest extends TCKTest { /** * Section 5.2 - Typesafe resolution * lb) Test with beans without required qualifiers. * * @throws CoreException */ public void testDefaultBindingTypeAssumed() throws CoreException { Collection<IBean> beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Tuna"); assertEquals("Wrong number of the beans", 1, beans.size()); assertContainsBeanTypes(false, beans.iterator().next(), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Tuna"); } /** * Section 5.2 - Typesafe resolution * hc) Check multiple types resolve to a single getBeans(). * * @throws CoreException */ public void testResolveByType() throws CoreException { Collection<IBean> beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Tuna", "javax.enterprise.inject.Default"); assertEquals("Wrong number of the beans", 1, beans.size()); beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Animal", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.FishILike"); assertEquals("Wrong number of the beans", 3, beans.size()); assertContainsBeanClasses(beans, "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Salmon", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.SeaBass", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Haddock"); } /** * Section 5.2 - Typesafe resolution * lc) Test with matching beans with matching qualifier with same type. * * @throws CoreException */ public void testAllQualifiersSpecifiedForResolutionMustAppearOnBean() throws CoreException { Collection<IBean> beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Animal", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Chunky", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Whitefish"); assertEquals("Wrong number of the beans", 1, beans.size()); beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.ScottishFish", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Whitefish"); assertEquals("Wrong number of the beans", 2, beans.size()); assertContainsBeanClasses(beans, "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Cod", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Sole"); } /** * Section 5.2 - Typesafe resolution * ka) Test with a parameterized type. * * @throws CoreException */ public void testResolveByTypeWithTypeParameter() throws CoreException { IType type = EclipseJavaUtil.findType(EclipseUtil.getJavaProject(cdiProject.getNature().getProject()), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.ScottishFishFarmer"); IParametedType parametedType = cdiProject.getNature().getTypeFactory().getParametedType(type, "QFarmer<QScottishFish;>;"); Collection<IBean> beans = cdiProject.getBeans(true, parametedType, new IQualifierDeclaration[0]); assertEquals("Wrong number of the beans", 1, beans.size()); assertContainsBeanClasses(beans, "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.ScottishFishFarmer"); } /** * Section 5.2 - Typesafe resolution * j) Test with an array type. * * @throws CoreException */ public void testResolveByTypeWithArray() throws CoreException { IType type = EclipseJavaUtil.findType(EclipseUtil.getJavaProject(cdiProject.getNature().getProject()), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.SpiderProducer"); IParametedType parametedType = cdiProject.getNature().getTypeFactory().getParametedType(type, "[QSpider;"); Collection<IBean> beans = cdiProject.getBeans(true, parametedType, new IQualifierDeclaration[0]); assertEquals("Wrong number of the beans", 1, beans.size()); assertTrue("The bean should be a producer method.", beans.iterator().next() instanceof IProducerMethod); } /** * Section 5.2 - Typesafe resolution * i) Test with a primitive type. * * @throws CoreException */ public void testResolveByTypeWithPrimitives() throws CoreException { Collection<IBean> beans = getBeans("java.lang.Double", "javax.enterprise.inject.Any"); // There is checks for 2 beans (not for 3) in TCK but actually there is one more bean in another package which matches. So let's check for 3 beans. assertEquals("Wrong number of the beans", 3, beans.size()); IClassBean bean = getClassBean("JavaSource/org/jboss/jsr299/tck/tests/lookup/typesafe/resolution/NumberProducer.java"); assertNotNull("Bean can't be a null", bean); Collection<IInjectionPoint> injections = bean.getInjectionPoints(); assertEquals("Wrong number of the injection points", 2, injections.size()); for (IInjectionPoint injectionPoint : injections) { beans = cdiProject.getBeans(true, injectionPoint); assertEquals("Wrong number of the beans", 1, beans.size()); } } public void testAbstractClassIsNotEligibleForInjection() throws CoreException { IClassBean bean = getClassBean("JavaSource/org/jboss/jsr299/tck/tests/jbt/resolution/chain/CurrentProject.java"); Collection<IInjectionPoint> injections = bean.getInjectionPoints(); assertEquals("Wrong number of the injection points", 1, injections.size()); IInjectionPoint injectionPoint = injections.iterator().next(); assertNotNull(injectionPoint); Collection<IBean> bs = cdiProject.getBeans(true, injectionPoint); assertEquals(2, bs.size()); Set<String> names = new HashSet<String>(); System.out.println(bs.size()); for (IBean b: bs) { names.add(b.getElementName()); } names.contains("CurrentProject.getCurrent()"); names.contains("ProjectImpl"); } /** * Section 5.2 - Typesafe resolution * ld) Test with matching beans with matching qualifier with same annotation member value for each member which is not annotated @javax.enterprise.util.NonBinding. * * @throws CoreException */ public void testResolveByTypeWithNonBindingMembers() throws CoreException { IQualifierDeclaration expensiveQualifier = getQualifierDeclarationFromClass("JavaSource/org/jboss/jsr299/tck/tests/lookup/typesafe/resolution/RoundWhitefish.java", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Expensive"); IQualifierDeclaration whitefishQualifier = getQualifierDeclarationFromClass("JavaSource/org/jboss/jsr299/tck/tests/lookup/typesafe/resolution/RoundWhitefish.java", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Whitefish"); IParametedType type = getType("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Animal"); Collection<IBean> beans = cdiProject.getBeans(true, type, new IQualifierDeclaration[]{expensiveQualifier, whitefishQualifier}); assertContainsBeanClasses(beans, new String[]{"org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.RoundWhitefish", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Halibut"}); } /** * 5.1.4. Inter-module injection * i) Check a disabled managed bean is not injectable. * * @throws CoreException */ public void testPolicyNotAvailableInNonDeploymentArchive() throws CoreException { Collection<IBean> beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Spider"); assertFalse("Wrong number of the beans", beans.isEmpty()); assertDoesNotContainBeanClasses(beans, new String[]{"org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.CrabSpider", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.DaddyLongLegs"}); beans = cdiProject.getBeans("crabSpider", true); assertTrue("Wrong nuber of the beans", beans.isEmpty()); } /** * Section 2.2.2 - Restricting the bean types of a bean * a) Check managed bean. * * @throws CoreException */ public void testBeanTypesOnManagedBean() throws CoreException { Collection<IBean> beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Canary"); assertEquals("Wrong number of the beans", 1, beans.size()); IBean bean = beans.iterator().next(); beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Bird"); assertEquals("Wrong number of the beans", 0, beans.size()); assertContainsBeanTypes(bean, "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Canary", "java.lang.Object"); } /** * Section 2.2.2 - Restricting the bean types of a bean * e) Check generic managed bean. * * @throws CoreException */ public void testGenericBeanTypesOnManagedBean() throws CoreException { IType type = EclipseJavaUtil.findType(EclipseUtil.getJavaProject(cdiProject.getNature().getProject()), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Emu"); IParametedType parametedType = cdiProject.getNature().getTypeFactory().getParametedType(type, "QFlightlessBird<QAustralian;>;"); Collection<IBean> beans = cdiProject.getBeans(true, parametedType, new IQualifierDeclaration[0]); assertEquals("Wrong number of the beans", 1, beans.size()); IBean bean = beans.iterator().next(); beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Emu"); assertEquals("Wrong number of the beans", 0, beans.size()); type = EclipseJavaUtil.findType(EclipseUtil.getJavaProject(cdiProject.getNature().getProject()), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Emu"); parametedType = cdiProject.getNature().getTypeFactory().getParametedType(type, "QFlightlessBird<QEuropean;>;"); beans = cdiProject.getBeans(true, parametedType, new IQualifierDeclaration[0]); assertEquals("Wrong number of the beans", 0, beans.size()); assertContainsBeanTypes(false, bean, "java.lang.Object"); assertContainsBeanTypes(false, bean, "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.FlightlessBird"); assertContainsBeanTypeSignatures(false, bean, "Lorg.jboss.jsr299.tck.tests.lookup.typesafe.resolution.FlightlessBird<Lorg.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Australian;>;"); } /** * Section 2.2.2 - Restricting the bean types of a bean * c) Check producer method. * * @throws CoreException */ public void testBeanTypesOnProducerMethod() throws CoreException { Collection<IBean> beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Parrot"); assertEquals("Wrong number of the beans", 1, beans.size()); assertContainsBeanTypes(beans.iterator().next(), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Parrot", "java.lang.Object"); beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Bird"); assertEquals("Wrong number of the beans", 0, beans.size()); } /** * Section 2.2.2 - Restricting the bean types of a bean * h) Check generic producer field. * * @throws CoreException */ public void testGenericBeanTypesOnProducerField() throws CoreException { IType type = EclipseJavaUtil.findType(EclipseUtil.getJavaProject(cdiProject.getNature().getProject()), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.PetShop"); IParametedType parametedType = cdiProject.getNature().getTypeFactory().getParametedType(type, "QCat<QEuropean;>;"); IQualifierDeclaration qualifier = getQualifierDeclarationFromClass("JavaSource/org/jboss/jsr299/tck/tests/lookup/typesafe/resolution/PetShop.java", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Tame"); assertNotNull("Can't find the qualifier.", qualifier); Collection<IBean> beans = cdiProject.getBeans(true, parametedType, new IQualifierDeclaration[]{qualifier}); assertEquals("Wrong number of the beans", 1, beans.size()); IBean bean = beans.iterator().next(); assertContainsBeanTypes(false, bean, "java.lang.Object"); assertContainsBeanTypes(false, bean, "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Cat"); assertContainsBeanTypeSignatures(false, bean, "Lorg.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Cat<Lorg.jboss.jsr299.tck.tests.lookup.typesafe.resolution.European;>;"); beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.DomesticCat", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Tame"); assertEquals("Wrong number of the beans", 0, beans.size()); } /** * Section 2.2.2 - Restricting the bean types of a bean * g) Check generic producer method. * * @throws CoreException */ public void testGenericBeanTypesOnProducerMethod() throws CoreException { IType type = EclipseJavaUtil.findType(EclipseUtil.getJavaProject(cdiProject.getNature().getProject()), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.PetShop"); IParametedType parametedType = cdiProject.getNature().getTypeFactory().getParametedType(type, "QCat<QAfrican;>;"); IQualifierDeclaration qualifier = getQualifierDeclarationFromClass("JavaSource/org/jboss/jsr299/tck/tests/lookup/typesafe/resolution/PetShop.java", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Wild"); assertNotNull("Can't find the qualifier.", qualifier); Collection<IBean> beans = cdiProject.getBeans(true, parametedType, new IQualifierDeclaration[]{qualifier}); assertEquals("Wrong number of the beans", 1, beans.size()); IBean bean = beans.iterator().next(); assertContainsBeanTypes(false, bean, "java.lang.Object"); assertContainsBeanTypes(false, bean, "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Cat"); assertContainsBeanTypeSignatures(false, bean, "Lorg.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Cat<Lorg.jboss.jsr299.tck.tests.lookup.typesafe.resolution.African;>;"); beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Lion", "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Wild"); assertEquals("Wrong number of the beans", 0, beans.size()); } /** * Section 2.2.2 - Restricting the bean types of a bean * d) Check producer field. * * @throws CoreException */ public void testBeanTypesOnProducerField() throws CoreException { Collection<IBean> beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Dove"); assertEquals("Wrong number of the beans", 1, beans.size()); assertContainsBeanTypes(beans.iterator().next(), "org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Dove", "java.lang.Object"); beans = getBeans("org.jboss.jsr299.tck.tests.lookup.typesafe.resolution.Bird"); assertEquals("Wrong number of the beans", 0, beans.size()); } public void testInjectionResolutionOfRestrictedProducerField() throws CoreException { IInjectionPointField injection = getInjectionPointField("JavaSource/org/jboss/jsr299/tck/tests/jbt/resolution/Zoo.java", "cats"); Collection<IBean> beans = cdiProject.getBeans(true, injection); assertEquals("Wrong number of the beans", 1, beans.size()); IBean bean = beans.iterator().next(); assertTrue(bean instanceof IProducerField); } public void testInjectionResolutionOfRestrictedProducerMethod() throws CoreException { IInjectionPointField injection = getInjectionPointField("JavaSource/org/jboss/jsr299/tck/tests/jbt/resolution/Zoo.java", "lions"); Collection<IBean> beans = cdiProject.getBeans(true, injection); assertEquals("Wrong number of the beans", 1, beans.size()); IBean bean = beans.iterator().next(); assertTrue(bean instanceof IProducerMethod); } }