/*
* Copyright (C) 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.cdi.producer.client.test;
import java.util.List;
import org.jboss.errai.cdi.producer.client.BeanConstrConsumersMultiProducers;
import org.jboss.errai.cdi.producer.client.BeanConstrConsumesOwnProducer;
import org.jboss.errai.cdi.producer.client.BeanConsumesOwnProducer;
import org.jboss.errai.cdi.producer.client.BeanConsumesOwnProducerB;
import org.jboss.errai.cdi.producer.client.BeanConsumesOwnProducerC;
import org.jboss.errai.cdi.producer.client.DepBeanConstrConsumesOwnProducer;
import org.jboss.errai.cdi.producer.client.DepBeanProducerConsumer;
import org.jboss.errai.cdi.producer.client.DependentProducedBeanDependentBean;
import org.jboss.errai.cdi.producer.client.Fooblie;
import org.jboss.errai.cdi.producer.client.FooblieDependentBean;
import org.jboss.errai.cdi.producer.client.FooblieMaker;
import org.jboss.errai.cdi.producer.client.Kayak;
import org.jboss.errai.cdi.producer.client.ProducerDependentTestBean;
import org.jboss.errai.cdi.producer.client.ProducerDependentTestBeanWithCycle;
import org.jboss.errai.cdi.producer.client.ProducerTestModule;
import org.jboss.errai.cdi.producer.client.PseudoBeanProducerConsumer;
import org.jboss.errai.cdi.producer.client.SingletonProducedBeanDependentBean;
import org.jboss.errai.cdi.producer.client.Thung;
import org.jboss.errai.ioc.client.IOCClientTestCase;
import org.jboss.errai.ioc.client.container.IOC;
import org.jboss.errai.ioc.client.container.SyncBeanDef;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
/**
* Tests CDI producers.
*
* @author Christian Sadilek <csadilek@redhat.com>
*/
//@RunWith(IOCSimulatedTestRunner.class)
public class ProducerIntegrationTest extends IOCClientTestCase {
@Override
public String getModuleName() {
return "org.jboss.errai.cdi.producer.ProducerTestModule";
}
ProducerTestModule module;
ProducerDependentTestBean testBean;
@Override
public void gwtSetUp() throws Exception {
super.gwtSetUp();
module = IOC.getBeanManager().lookupBean(ProducerTestModule.class).getInstance();
testBean = IOC.getBeanManager().lookupBean(ProducerDependentTestBean.class).getInstance();
}
public void testInjectionUsingProducerField() {
assertEquals("Failed to inject produced @A",
module.getNumberA(),
testBean.getIntegerA());
}
public void testInjectionUsingProducerMethod() {
assertEquals("Failed to inject produced @B",
module.getNumberB(),
testBean.getIntegerB());
}
public void testInjectionUsingDependentProducerMethods() {
assertEquals("Failed to inject produced @C",
module.getNumberC(),
testBean.getIntegerC());
assertEquals("Failed to inject produced String depending on @C",
module.getNumberC().toString(),
testBean.getProducedString());
}
public void testAnyQualifiedInjection() {
assertEquals("Failed to inject produced @D @E as @Any",
module.getFloatDE(),
testBean.getUnqualifiedFloat());
}
public void testSubsetQualifiedInjection() {
assertEquals("Failed to inject produced @D @E as @D",
module.getFloatDE(),
testBean.getFloatD());
}
public void testCyclicalDependencyWasSatisfied() {
assertEquals(testBean.getFloatD(), testBean.getFloatD());
assertEquals(testBean.getIntegerA(), testBean.getIntegerA());
assertEquals(testBean.getIntegerB(), testBean.getIntegerB());
final String val = "TestFieldABC";
testBean.setTestField(val);
assertEquals(val, testBean.getTestField());
}
public void testStaticProducers() {
assertNotNull("bean was not injected!", testBean.getStaticallyProducedBean());
assertNotNull("bean was not injected!", testBean.getStaticallyProducedBeanB());
}
public void testCycleThroughAProducedInterface() {
final ProducerDependentTestBeanWithCycle bean = IOC.getBeanManager()
.lookupBean(ProducerDependentTestBeanWithCycle.class).getInstance();
assertNotNull(bean);
assertNotNull(bean.getFooface());
assertEquals("HiThere", bean.getFooface().getMessage());
}
public void testBeanCanConsumeProducerFromItself() {
final BeanConsumesOwnProducer bean = IOC.getBeanManager().lookupBean(BeanConsumesOwnProducer.class).getInstance();
assertNotNull(bean);
assertNotNull("bean did not inject its own producer", bean.getMagic());
}
public void testBeanCanConsumerProducerFromItselfThroughConstrCycle() {
final BeanConstrConsumesOwnProducer bean = IOC.getBeanManager().lookupBean(BeanConstrConsumesOwnProducer.class).getInstance();
assertNotNull(bean);
assertNotNull(bean.getThing());
assertNotNull(bean.getThing().getThing());
}
public void testDependentBeanCanConsumerProducerFromItselfThroughConstrCycle() {
final DepBeanConstrConsumesOwnProducer bean = IOC.getBeanManager().lookupBean(DepBeanConstrConsumesOwnProducer.class).getInstance();
assertNotNull(bean);
assertNotNull(bean.getThang());
assertNotNull(bean.getThang().getThang());
}
public void testNormalBeanCanConsumeOwnProducerAsFieldInjectionMixedWithConstrInjection() {
final BeanConsumesOwnProducerB bean = IOC.getBeanManager().lookupBean(BeanConsumesOwnProducerB.class).getInstance();
assertNotNull(bean);
assertNotNull(bean.getFactory());
assertNotNull(bean.getThing());
assertNotNull(bean.getThung());
}
public void testNormalBeanCanConsumerOwnProducerWithQualifiedInjection() {
final BeanConsumesOwnProducerC bean = IOC.getBeanManager().lookupBean(BeanConsumesOwnProducerC.class).getInstance();
assertNotNull(bean);
assertNotNull(bean.getKite());
}
public void testApplicationScopedProducedBeanCanBeLookedUpProgrammatically() {
final SyncBeanDef<Thung> thungIOCBeanDef = IOC.getBeanManager().lookupBean(Thung.class);
final Thung thung = thungIOCBeanDef.getInstance();
assertNotNull(thung);
}
public void testProducersObserveSingletonScope() {
final SyncBeanManager beanManager = IOC.getBeanManager();
final SyncBeanDef<Kayak> kayakBean = beanManager.lookupBean(Kayak.class);
assertNotNull(kayakBean);
final SingletonProducedBeanDependentBean bean = beanManager.lookupBean(SingletonProducedBeanDependentBean.class)
.getInstance();
assertNotNull(bean);
assertNotNull(bean.getKayakA());
assertNotNull(bean.getKayakB());
assertEquals("singleton scope for producer violated!", bean.getKayakA().getId(), bean.getKayakB().getId());
final DependentProducedBeanDependentBean beanB = beanManager.lookupBean(DependentProducedBeanDependentBean.class)
.getInstance();
assertNotNull(beanB);
assertNotNull(beanB.getKayakA());
assertNotNull(beanB.getKayakB());
assertEquals("singleton scope for producer violated!", bean.getKayakA().getId(), beanB.getKayakA().getId());
assertEquals("singleton scope for producer violated!", bean.getKayakA().getId(), beanB.getKayakB().getId());
final Kayak kayakBeanInstance = kayakBean.getInstance();
assertNotNull(kayakBeanInstance);
assertEquals("manual lookup should produce the same bean",
kayakBeanInstance.getId(), beanB.getKayakA().getId());
final Kayak newKayak = kayakBean.newInstance();
assertNotNull(newKayak);
assertNotSame("new Kayak should have new ID", kayakBeanInstance.getId(), newKayak.getId());
}
public void testComplexConstructorInjectionScenario() {
final BeanConstrConsumersMultiProducers bean = IOC.getBeanManager().lookupBean(BeanConstrConsumersMultiProducers.class)
.getInstance();
assertNotNull(bean);
assertNotNull(bean.getGreeting());
assertNotNull(bean.getParting());
assertNotNull(bean.getResponse());
assertNotNull(bean.getTestEvent());
}
public void testDisposerMethod() {
final FooblieMaker maker = IOC.getBeanManager().lookupBean(FooblieMaker.class).getInstance();
final FooblieDependentBean fooblieDependentBean1
= IOC.getBeanManager().lookupBean(FooblieDependentBean.class).getInstance();
final FooblieDependentBean fooblieDependentBean2
= IOC.getBeanManager().lookupBean(FooblieDependentBean.class).getInstance();
IOC.getBeanManager().destroyBean(fooblieDependentBean1);
IOC.getBeanManager().destroyBean(fooblieDependentBean2);
final List<Fooblie> foobliesResponse = maker.getDestroyedFoobliesResponse();
assertEquals("there should be two destroyed beans", 2, foobliesResponse.size());
assertEquals(fooblieDependentBean1.getFooblieResponse(), foobliesResponse.get(0));
assertEquals(fooblieDependentBean2.getFooblieResponse(), foobliesResponse.get(1));
final List<Fooblie> foobliesGreets = maker.getDestroyedFoobliesGreets();
assertEquals("there should be two destroyed beans", 2, foobliesGreets.size());
assertEquals(fooblieDependentBean1.getFooblieGreets(), foobliesGreets.get(0));
assertEquals(fooblieDependentBean2.getFooblieGreets(), foobliesGreets.get(1));
final List<Fooblie> foobliesParts = maker.getDestroyedFoobliesParts();
assertEquals("there should be two destroyed beans", 2, foobliesParts.size());
assertEquals(fooblieDependentBean1.getFooblieParts(), foobliesParts.get(0));
assertEquals(fooblieDependentBean2.getFooblieParts(), foobliesParts.get(1));
}
public void testNormalDependentProducer() throws Exception {
final DepBeanProducerConsumer bean = IOC.getBeanManager().lookupBean(DepBeanProducerConsumer.class).getInstance();
assertNotNull("Produced injection failed with dependent producer.", bean.getProducable());
}
public void testPseudoProducer() throws Exception {
final PseudoBeanProducerConsumer bean = IOC.getBeanManager().lookupBean(PseudoBeanProducerConsumer.class).getInstance();
assertNotNull("Produced injection failed with pseudo-dependent producer.");
}
}