/* * JBoss, Home of Professional Open Source * Copyright 2010, Red Hat, Inc., and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * 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.cdi.tck.tests.event.eventTypes; import static org.jboss.cdi.tck.cdi.Sections.EVENT_TYPES_AND_QUALIFIER_TYPES; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import javax.enterprise.event.Event; import javax.enterprise.util.AnnotationLiteral; import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.cdi.tck.AbstractTest; import org.jboss.cdi.tck.shrinkwrap.WebArchiveBuilder; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.jboss.test.audit.annotations.SpecAssertion; import org.jboss.test.audit.annotations.SpecAssertions; import org.jboss.test.audit.annotations.SpecVersion; import org.testng.annotations.Test; /** * * @author Dan Allen * @author Martin Kouba */ @SpecVersion(spec = "cdi", version = "2.0-PFD") public class EventTypesTest extends AbstractTest { private AnnotationLiteral<Extra> extraLiteral = new AnnotationLiteral<Extra>() { }; @Deployment public static WebArchive createTestArchive() { return new WebArchiveBuilder().withTestClassPackage(EventTypesTest.class).build(); } @Inject Event<Song> songEvent; @Inject Event<Song[]> songArrayEvent; @Inject Event<int[]> intArrayEvent; @Test @SpecAssertions({ @SpecAssertion(section = EVENT_TYPES_AND_QUALIFIER_TYPES, id = "aa"), @SpecAssertion(section = EVENT_TYPES_AND_QUALIFIER_TYPES, id = "j") }) public void testEventTypeIsConcreteTypeWithNoTypeVariables() { Listener listener = getContextualReference(Listener.class); listener.reset(); // typical concrete type Song s = new Song(); getContextualReference(TuneSelect.class).songPlaying(s); assert listener.getObjectsFired().size() == 1; assert listener.getObjectsFired().get(0) == s; songEvent.fire(s); // Fire an event via built-in bean is more typical // getCurrentManager().fireEvent(s); assert listener.getObjectsFired().size() == 2; assert listener.getObjectsFired().get(1) == s; // anonymous instance Broadcast b = new Broadcast() { }; getContextualReference(TuneSelect.class).broadcastPlaying(b); assert listener.getObjectsFired().size() == 3; assert listener.getObjectsFired().get(2) == b; // boxed primitive getCurrentManager().fireEvent(1, extraLiteral); assert listener.getObjectsFired().size() == 4; assert listener.getObjectsFired().get(3).equals(1); } @Test @SpecAssertions({ @SpecAssertion(section = EVENT_TYPES_AND_QUALIFIER_TYPES, id = "j") }) public void testEventTypeIsArray() { Listener listener = getContextualReference(Listener.class); listener.reset(); // array of concrete types Song[] songArray = new Song[] { new Song() }; songArrayEvent.fire(songArray); assertEquals(listener.getObjectsFired().size(), 1); assertTrue(listener.getObjectsFired().get(0) instanceof Song[]); assertEquals(listener.getObjectsFired().get(0), songArray); // array of boxed primitives Integer[] integerArray = new Integer[] { 0, 1 }; getCurrentManager().fireEvent(integerArray); assertEquals(listener.getObjectsFired().size(), 2); assertTrue(listener.getObjectsFired().get(1) instanceof Integer[]); assertEquals(listener.getObjectsFired().get(1), integerArray); // array of primitives int[] intArray = new int[] { 1, 2 }; intArrayEvent.fire(intArray); assertEquals(listener.getObjectsFired().size(), 3); assertTrue(listener.getObjectsFired().get(2) instanceof int[]); assertEquals(listener.getObjectsFired().get(2), intArray); } @Test @SpecAssertion(section = EVENT_TYPES_AND_QUALIFIER_TYPES, id = "c") public void testEventTypeIncludesAllSuperclassesAndInterfacesOfEventObject() { // we have to use a dependent-scoped observer here because we it is observing the Object event type // and a request-scoped object would get called outside of when the request scope is active in this situation EventTypeFamilyObserver observer = getContextualReference(EventTypeFamilyObserver.class); observer.reset(); getCurrentManager().fireEvent(new ComplexEvent()); assert observer.getGeneralEventQuantity() == 1; assert observer.getAbstractEventQuantity() == 1; assert observer.getComplexEventQuantity() == 1; assert observer.getObjectEventQuantity() == 1; assert observer.getTotalEventsObserved() == 4; } }