1 package com.atlassian.plugin.event.impl;
2
3 import junit.framework.TestCase;
4 import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
5 import com.atlassian.plugin.event.impl.ListenerMethodSelector;
6 import com.atlassian.plugin.event.impl.MethodNameListenerMethodSelector;
7 import com.atlassian.plugin.event.PluginEventListener;
8 import com.atlassian.event.api.EventListener;
9
10 import java.lang.reflect.Method;
11
12 public class TestPluginEventManagerImpl extends TestCase
13 {
14 private DefaultPluginEventManager eventManager;
15
16 public void setUp()
17 {
18 eventManager = new DefaultPluginEventManager();
19 }
20
21 public void tearDown()
22 {
23 eventManager = null;
24 }
25
26 public void testRegister()
27 {
28 MethodTestListener methodTestListener = new MethodTestListener();
29 eventManager.register(methodTestListener);
30 eventManager.broadcast(new Object());
31 assertEquals(1, methodTestListener.called);
32 }
33
34 public void testRegisterWithBroadcastSupertype()
35 {
36 MethodTestListener methodTestListener = new MethodTestListener();
37 eventManager.register(methodTestListener);
38 eventManager.broadcast(new String());
39 assertEquals(1, methodTestListener.called);
40 }
41
42 public void testRegisterWithFooBroadcastSupertype()
43 {
44 MethodTestListener methodTestListener = new MethodTestListener();
45 eventManager.register(methodTestListener);
46 eventManager.broadcast(new MethodTestListener());
47 assertEquals(1, methodTestListener.fooCalled);
48 assertEquals(1, methodTestListener.called);
49 }
50
51 public void testRegisterTwice()
52 {
53 MethodTestListener methodTestListener = new MethodTestListener();
54 eventManager.register(methodTestListener);
55 eventManager.register(methodTestListener);
56 eventManager.broadcast(new Object());
57 assertEquals(1, methodTestListener.called);
58 }
59
60 public void testRegisterWithBadListener()
61 {
62 BadListener l = new BadListener();
63 try
64 {
65 eventManager.register(l);
66 fail();
67 }
68 catch (IllegalArgumentException ex)
69 {
70
71 }
72 assertEquals(0, l.called);
73 }
74
75 public void testRegisterWithCustomSelector()
76 {
77 eventManager = new DefaultPluginEventManager(new ListenerMethodSelector[]{
78 new ListenerMethodSelector() {
79 public boolean isListenerMethod(Method method)
80 {
81 return "onEvent".equals(method.getName());
82 }
83 }
84 });
85 MethodTestListener methodTestListener = new MethodTestListener();
86 eventManager.register(methodTestListener);
87 eventManager.broadcast("jim");
88 assertEquals(1, methodTestListener.jimCalled);
89 }
90
91 public void testRegisterWithOverlappingSelectorsBroadcastsTwoMessages()
92 {
93 eventManager = new DefaultPluginEventManager(new ListenerMethodSelector[]{
94 new MethodNameListenerMethodSelector(), new MethodNameListenerMethodSelector()});
95 MethodTestListener methodTestListener = new MethodTestListener();
96 eventManager.register(methodTestListener);
97 eventManager.broadcast(new Object());
98 assertEquals(2, methodTestListener.called);
99 }
100
101 public void testRegisterWithCustom()
102 {
103 MethodTestListener methodTestListener = new MethodTestListener();
104 eventManager.register(methodTestListener);
105 eventManager.broadcast(new Object());
106 assertEquals(1, methodTestListener.called);
107 }
108
109 public void testRegisterAnnotatedListener()
110 {
111 AnnotationTestListener listener = new AnnotationTestListener();
112 eventManager.register(listener);
113 eventManager.broadcast(new Object());
114 assertEquals(1, listener.eventListenerCalled);
115 assertEquals(1, listener.pluginEventListenerCalled);
116 }
117
118 public void testUnregister()
119 {
120 MethodTestListener methodTestListener = new MethodTestListener();
121 eventManager.register(methodTestListener);
122 eventManager.broadcast(new Object());
123 eventManager.unregister(methodTestListener);
124 eventManager.broadcast(new Object());
125 assertEquals(1, methodTestListener.called);
126 }
127
128 public void testSuperEvent()
129 {
130 MethodTestListener methodTestListener = new MethodTestListener();
131 eventManager.register(methodTestListener);
132 eventManager.broadcast(new MethodTestListener());
133 assertEquals(1, methodTestListener.called);
134 }
135
136 public void testRegisterNull()
137 {
138 try
139 {
140 eventManager.register(null);
141 fail("should have thrown exception");
142 }
143 catch (IllegalArgumentException ex)
144 {
145
146 }
147 }
148
149 public void testUnregisterNull()
150 {
151 try
152 {
153 eventManager.unregister(null);
154 fail("should have thrown an exception");
155 }
156 catch (IllegalArgumentException e)
157 {
158
159 }
160 }
161
162 public static class AnnotationTestListener
163 {
164 int pluginEventListenerCalled = 0;
165 int eventListenerCalled = 0;
166
167 @PluginEventListener
168 public void doEventOld(Object obj)
169 {
170 ++pluginEventListenerCalled;
171 }
172
173 @EventListener
174 public void doEventNew(Object obj)
175 {
176 ++eventListenerCalled;
177 }
178 }
179
180 public static class MethodTestListener
181 {
182 int called = 0;
183 int fooCalled = 0;
184 int jimCalled = 0;
185
186 public void channel(Object obj)
187 {
188 called++;
189 }
190
191 public void channel(MethodTestListener obj)
192 {
193 fooCalled++;
194 }
195
196 public void onEvent(String o)
197 {
198 jimCalled++;
199 }
200 }
201
202 public static class BadListener
203 {
204 int called = 0;
205 public void somemethod() {
206 called++;
207 }
208 }
209
210
211
212 }