1 package com.atlassian.event.internal; 2 3 4 import com.atlassian.event.Event; 5 import com.atlassian.event.api.EventListener; 6 import com.atlassian.event.api.EventPublisher; 7 import com.google.common.collect.Lists; 8 import org.junit.Before; 9 import org.junit.Test; 10 import org.junit.runner.RunWith; 11 import org.mockito.runners.MockitoJUnitRunner; 12 13 import java.util.Collections; 14 import java.util.List; 15 16 import static com.atlassian.event.internal._TestEvent.TestInterface; 17 import static com.atlassian.event.internal._TestEvent.TestInterfacedEvent; 18 import static com.atlassian.event.internal._TestEvent.TestSubEvent; 19 import static com.atlassian.event.internal._TestEvent.TestSubInterface; 20 import static com.atlassian.event.internal._TestEvent.TestSubSubEvent; 21 import static junit.framework.Assert.assertEquals; 22 23 @RunWith(MockitoJUnitRunner.class) 24 @SuppressWarnings("deprecation") 25 public class EventPublisherImplOrderingTest { 26 27 private static final String OBJECT_LISTENER = "Object listener"; 28 private static final String SUBSUBEVENT_LISTENER = "TestSubSubEvent listener"; 29 private static final String SUBEVENT_LISTENER = "TestSubEvent listener"; 30 private static final String TESTEVENT_LISTENER = "TestEvent listener"; 31 private static final String EVENT_LISTENER = "Event listener"; 32 private static final String INTERFACEIMPL_LISTENER = "TestInterfacedEvent listener"; 33 private static final String INTERFACE_LISTENER = "TestInterface listener"; 34 private static final String SUBINTERFACE_LISTENER = "TestSubInterface listener"; 35 36 private static class TestListener { 37 protected final List<String> testEvents = Lists.newArrayList(); 38 39 @SuppressWarnings("unused") 40 @EventListener 41 public void onObjectEvent(final Object event) { 42 testEvents.add(OBJECT_LISTENER); 43 } 44 45 @SuppressWarnings("unused") 46 @EventListener 47 public void onSubSubEvent(final TestSubSubEvent event) { 48 testEvents.add(SUBSUBEVENT_LISTENER); 49 } 50 51 @SuppressWarnings("unused") 52 @EventListener 53 public void onSubEvent(final TestSubEvent event) { 54 testEvents.add(SUBEVENT_LISTENER); 55 } 56 57 @SuppressWarnings("unused") 58 @EventListener 59 public void onEvent(final _TestEvent event) { 60 testEvents.add(TESTEVENT_LISTENER); 61 } 62 63 @SuppressWarnings("unused") 64 @EventListener 65 public void onInterfacedEvent(final TestInterfacedEvent event) { 66 testEvents.add(INTERFACEIMPL_LISTENER); 67 } 68 69 @SuppressWarnings("unused") 70 @EventListener 71 public void onInterface(final TestInterface event) { 72 testEvents.add(INTERFACE_LISTENER); 73 } 74 75 @SuppressWarnings("unused") 76 @EventListener 77 public void onInterface(final TestSubInterface event) { 78 testEvents.add(SUBINTERFACE_LISTENER); 79 } 80 81 @SuppressWarnings("unused") 82 @EventListener 83 public void onEvent(final Event event) { 84 testEvents.add(EVENT_LISTENER); 85 } 86 } 87 88 private final TestListener listener = new TestListener(); 89 90 private EventPublisher eventPublisher = new EventPublisherImpl( 91 new StubEventDispatcher(), 92 () -> Collections.singletonList(new AnnotatedMethodsListenerHandler())); 93 94 @Before 95 public final void setUp() { 96 eventPublisher.register(listener); 97 } 98 99 @Test 100 public final void testInterfaceOrder() { 101 List<String> expectedEvents = Lists.newArrayList(INTERFACEIMPL_LISTENER, EVENT_LISTENER, OBJECT_LISTENER, SUBINTERFACE_LISTENER, INTERFACE_LISTENER); 102 testOrder(new TestInterfacedEvent(this), expectedEvents); 103 } 104 105 @Test 106 public final void testEventOrder() { 107 List<String> expectedEvents = Lists.newArrayList(SUBSUBEVENT_LISTENER, SUBEVENT_LISTENER, TESTEVENT_LISTENER, EVENT_LISTENER, OBJECT_LISTENER); 108 testOrder(new TestSubSubEvent(this), expectedEvents); 109 } 110 111 private void testOrder(Event testEvent, List<String> orderedListeners) { 112 eventPublisher.publish(testEvent); 113 114 assertEquals(orderedListeners.size(), listener.testEvents.size()); 115 assertEquals(orderedListeners, listener.testEvents); 116 } 117 }