1 package com.atlassian.event.internal;
2
3 import com.atlassian.event.api.EventListener;
4 import com.atlassian.event.api.EventPublisher;
5 import com.google.common.collect.Lists;
6 import org.junit.After;
7 import org.junit.Before;
8 import org.junit.Test;
9
10 import java.util.List;
11
12 import static junit.framework.Assert.assertEquals;
13 import static junit.framework.Assert.assertSame;
14 import static org.junit.Assert.assertTrue;
15
16 public abstract class AbstractEventPublisherAnnotatedListenerMethodTest {
17 private EventPublisher eventPublisher;
18
19 @Before
20 public final void setUp() {
21 eventPublisher = getEventPublisherForTest();
22 }
23
24 abstract EventPublisher getEventPublisherForTest();
25
26 @After
27 public final void tearDown() throws Exception {
28 eventPublisher = null;
29 }
30
31 @Test(expected = NullPointerException.class)
32 public final void testPublishNullEvent() {
33 eventPublisher.publish(null);
34 }
35
36 @Test
37 public final void testRegisterListener() {
38 final Object event = new _TestEvent(this);
39 final TestListener listener = new TestListener();
40
41 eventPublisher.register(listener);
42 eventPublisher.publish(event);
43
44 assertEquals(1, listener.testEvents.size());
45 assertSame(event, listener.testEvents.get(0));
46 }
47
48 @Test
49 public final void testListenerWithoutMatchingEventClass() {
50 final TestListener listener = new TestListener();
51
52 eventPublisher.register(listener);
53 eventPublisher.publish(new Object());
54
55 assertTrue(listener.testEvents.isEmpty());
56 }
57
58 @Test
59 public final void testUnRegisterListener() {
60 final Object event = new _TestEvent(this);
61 final TestListener listener = new TestListener();
62
63 eventPublisher.register(listener);
64 eventPublisher.publish(event);
65
66 assertEquals(1, listener.testEvents.size());
67 assertSame(event, listener.testEvents.get(0));
68
69 eventPublisher.unregister(listener);
70 eventPublisher.publish(event);
71
72 assertEquals(1, listener.testEvents.size());
73 }
74
75 @Test
76 public final void testUnRegisterAll() {
77 final Object event = new _TestEvent(this);
78 final TestListener listener = new TestListener();
79
80 eventPublisher.register(listener);
81 eventPublisher.publish(event);
82
83 assertEquals(1, listener.testEvents.size());
84 assertSame(event, listener.testEvents.get(0));
85
86 eventPublisher.unregisterAll();
87 eventPublisher.publish(event);
88
89 assertEquals(1, listener.testEvents.size());
90 }
91
92 @Test
93 public final void testInterfacesHandled() throws Exception {
94 final Object event = new AnInterface() {
95 };
96 final TestListener listener = new TestListener();
97
98 eventPublisher.register(listener);
99 eventPublisher.publish(event);
100
101 assertEquals(1, listener.testInterfaceEvents.size());
102 assertSame(event, listener.testInterfaceEvents.get(0));
103 }
104
105 @Test
106 public final void testChildrenHandled() throws Exception {
107 final Object event = new SubTestEvent(this);
108 final TestListener listener = new TestListener();
109
110 eventPublisher.register(listener);
111 eventPublisher.publish(event);
112
113 assertEquals(1, listener.testEvents.size());
114 assertSame(event, listener.testEvents.get(0));
115 }
116
117 @Test
118 public final void testAllHandlersInvokedWhenExceptionEncountered() throws Exception {
119 final Object event = new SubTestEvent(this);
120 final TestListener listenerBefore = new TestListener();
121 final TestListenerThatThrowsException listenerThatThrowsException = new TestListenerThatThrowsException();
122 final TestListener listenerAfter = new TestListener();
123
124 eventPublisher.register(listenerBefore);
125 eventPublisher.register(listenerThatThrowsException);
126 eventPublisher.register(listenerAfter);
127 eventPublisher.publish(event);
128
129 assertEquals(1, listenerBefore.testEvents.size());
130 assertEquals(1, listenerThatThrowsException.testEvents.size());
131 assertEquals(1, listenerAfter.testEvents.size());
132 }
133
134 private static class TestListener {
135 protected final List<Object> testEvents = Lists.newArrayList();
136 protected final List<Object> testInterfaceEvents = Lists.newArrayList();
137
138 @SuppressWarnings("unused")
139 @EventListener
140 public void onEvent(final _TestEvent event) {
141 testEvents.add(event);
142 }
143
144 @SuppressWarnings("unused")
145 @EventListener
146 public void onInterface(final AnInterface event) {
147 testInterfaceEvents.add(event);
148 }
149 }
150
151 private static class TestListenerThatThrowsException extends TestListener {
152 @SuppressWarnings("unused")
153 @EventListener
154 @Override
155 public void onEvent(final _TestEvent event) {
156 super.onEvent(event);
157 throw new RuntimeException("event exception");
158 }
159
160 @SuppressWarnings("unused")
161 @EventListener
162 @Override
163 public void onInterface(final AnInterface event) {
164 super.onInterface(event);
165 throw new RuntimeException("event interface exception");
166 }
167 }
168
169 private static interface AnInterface {
170 }
171
172 private static class SubTestEvent extends _TestEvent {
173 public SubTestEvent(final Object src) {
174 super(src);
175 }
176 }
177 }