First version after introduction of meaningful ids and Identifiable interface.
[xmlrouter] / listener / src / test / java / org / wamblee / xmlrouter / listener / CompositeEventListenerTest.java
1 /*
2  * Copyright 2005-2011 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.xmlrouter.listener;
17
18 import static junit.framework.Assert.*;
19 import static org.mockito.Matchers.*;
20 import static org.mockito.Mockito.*;
21
22 import java.util.ArrayList;
23
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.wamblee.xmlrouter.config.Transformation;
27
28 public class CompositeEventListenerTest {
29
30     private static final String DESTINATION_ID = "destid";
31     private CompositeEventListener composite;
32
33     private EventInfo source;
34
35     @Before
36     public void setUp() {
37         composite = new CompositeEventListener();
38         source = mock(EventInfo.class);
39     }
40
41     @Test
42     public void testNoListeners() {
43         // verify no exceptions occur.
44         composite.delivered(mock(EventInfo.class), getTransformations(),
45             DESTINATION_ID, true);
46         composite.notDelivered(mock(EventInfo.class));
47     }
48
49     @Test
50     public void testOneListener() {
51         EventListener listener = mock(EventListener.class);
52         composite.addListener(listener);
53
54         invokeAndVerifyListenerInvoked(listener);
55     }
56
57     private void invokeAndVerifyListenerInvoked(EventListener... listeners) {
58         invokeDelivered();
59
60         for (EventListener listener : listeners) {
61             checkInvokeDelivered(listener);
62             verifyNoMoreInteractions(listener);
63             reset(listener);
64         }
65
66         invokeNotDelivered();
67         for (EventListener listener : listeners) {
68             verify(listener).notDelivered(same(source));
69             verifyNoMoreInteractions(listener);
70             reset(listener);
71         }
72     }
73
74     private void invokeDelivered() {
75         composite.delivered(source, getTransformations(), DESTINATION_ID, true);
76     }
77
78     private void invokeNotDelivered() {
79         composite.notDelivered(source);
80     }
81
82     private void checkInvokeDelivered(EventListener listener) {
83         verify(listener).delivered(same(source), eq(getTransformations()),
84             eq(DESTINATION_ID), eq(true));
85     }
86
87     @Test
88     public void testRemoveListener() {
89         EventListener listener1 = mock(EventListener.class);
90         composite.addListener(listener1);
91
92         EventListener listener2 = mock(EventListener.class);
93         assertFalse(composite.removeListener(listener2));
94
95         invokeAndVerifyListenerInvoked(listener1);
96
97         assertTrue(composite.removeListener(listener1));
98         invokeDelivered();
99         verifyNoMoreInteractions(listener1);
100         invokeNotDelivered();
101         verifyNoMoreInteractions(listener1);
102     }
103
104     private ArrayList<Transformation> getTransformations() {
105         return new ArrayList<Transformation>();
106     }
107
108     @Test
109     public void testMultipleListeners() {
110         EventListener listener1 = mock(EventListener.class);
111         EventListener listener2 = mock(EventListener.class);
112         composite.addListener(listener1);
113         composite.addListener(listener2);
114
115         invokeAndVerifyListenerInvoked(listener1, listener2);
116     }
117 }