• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Guava 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 
17 package com.google.common.eventbus;
18 
19 import static org.junit.Assert.assertThrows;
20 
21 import com.google.common.collect.ImmutableSet;
22 import com.google.common.collect.Iterators;
23 import java.util.Iterator;
24 import junit.framework.TestCase;
25 
26 /**
27  * Tests for {@link SubscriberRegistry}.
28  *
29  * @author Colin Decker
30  */
31 public class SubscriberRegistryTest extends TestCase {
32 
33   private final SubscriberRegistry registry = new SubscriberRegistry(new EventBus());
34 
testRegister()35   public void testRegister() {
36     assertEquals(0, registry.getSubscribersForTesting(String.class).size());
37 
38     registry.register(new StringSubscriber());
39     assertEquals(1, registry.getSubscribersForTesting(String.class).size());
40 
41     registry.register(new StringSubscriber());
42     assertEquals(2, registry.getSubscribersForTesting(String.class).size());
43 
44     registry.register(new ObjectSubscriber());
45     assertEquals(2, registry.getSubscribersForTesting(String.class).size());
46     assertEquals(1, registry.getSubscribersForTesting(Object.class).size());
47   }
48 
testUnregister()49   public void testUnregister() {
50     StringSubscriber s1 = new StringSubscriber();
51     StringSubscriber s2 = new StringSubscriber();
52 
53     registry.register(s1);
54     registry.register(s2);
55 
56     registry.unregister(s1);
57     assertEquals(1, registry.getSubscribersForTesting(String.class).size());
58 
59     registry.unregister(s2);
60     assertTrue(registry.getSubscribersForTesting(String.class).isEmpty());
61   }
62 
testUnregister_notRegistered()63   public void testUnregister_notRegistered() {
64     assertThrows(IllegalArgumentException.class, () -> registry.unregister(new StringSubscriber()));
65 
66     StringSubscriber s1 = new StringSubscriber();
67     registry.register(s1);
68     assertThrows(IllegalArgumentException.class, () -> registry.unregister(new StringSubscriber()));
69 
70     registry.unregister(s1);
71 
72     assertThrows(IllegalArgumentException.class, () -> registry.unregister(s1));
73   }
74 
testGetSubscribers()75   public void testGetSubscribers() {
76     assertEquals(0, Iterators.size(registry.getSubscribers("")));
77 
78     registry.register(new StringSubscriber());
79     assertEquals(1, Iterators.size(registry.getSubscribers("")));
80 
81     registry.register(new StringSubscriber());
82     assertEquals(2, Iterators.size(registry.getSubscribers("")));
83 
84     registry.register(new ObjectSubscriber());
85     assertEquals(3, Iterators.size(registry.getSubscribers("")));
86     assertEquals(1, Iterators.size(registry.getSubscribers(new Object())));
87     assertEquals(1, Iterators.size(registry.getSubscribers(1)));
88 
89     registry.register(new IntegerSubscriber());
90     assertEquals(3, Iterators.size(registry.getSubscribers("")));
91     assertEquals(1, Iterators.size(registry.getSubscribers(new Object())));
92     assertEquals(2, Iterators.size(registry.getSubscribers(1)));
93   }
94 
testGetSubscribers_returnsImmutableSnapshot()95   public void testGetSubscribers_returnsImmutableSnapshot() {
96     StringSubscriber s1 = new StringSubscriber();
97     StringSubscriber s2 = new StringSubscriber();
98     ObjectSubscriber o1 = new ObjectSubscriber();
99 
100     Iterator<Subscriber> empty = registry.getSubscribers("");
101     assertFalse(empty.hasNext());
102 
103     empty = registry.getSubscribers("");
104 
105     registry.register(s1);
106     assertFalse(empty.hasNext());
107 
108     Iterator<Subscriber> one = registry.getSubscribers("");
109     assertEquals(s1, one.next().target);
110     assertFalse(one.hasNext());
111 
112     one = registry.getSubscribers("");
113 
114     registry.register(s2);
115     registry.register(o1);
116 
117     Iterator<Subscriber> three = registry.getSubscribers("");
118     assertEquals(s1, one.next().target);
119     assertFalse(one.hasNext());
120 
121     assertEquals(s1, three.next().target);
122     assertEquals(s2, three.next().target);
123     assertEquals(o1, three.next().target);
124     assertFalse(three.hasNext());
125 
126     three = registry.getSubscribers("");
127 
128     registry.unregister(s2);
129 
130     assertEquals(s1, three.next().target);
131     assertEquals(s2, three.next().target);
132     assertEquals(o1, three.next().target);
133     assertFalse(three.hasNext());
134 
135     Iterator<Subscriber> two = registry.getSubscribers("");
136     assertEquals(s1, two.next().target);
137     assertEquals(o1, two.next().target);
138     assertFalse(two.hasNext());
139   }
140 
141   public static class StringSubscriber {
142 
143     @Subscribe
handle(String s)144     public void handle(String s) {}
145   }
146 
147   public static class IntegerSubscriber {
148 
149     @Subscribe
handle(Integer i)150     public void handle(Integer i) {}
151   }
152 
153   public static class ObjectSubscriber {
154 
155     @Subscribe
handle(Object o)156     public void handle(Object o) {}
157   }
158 
testFlattenHierarchy()159   public void testFlattenHierarchy() {
160     assertEquals(
161         ImmutableSet.of(
162             Object.class,
163             HierarchyFixtureInterface.class,
164             HierarchyFixtureSubinterface.class,
165             HierarchyFixtureParent.class,
166             HierarchyFixture.class),
167         SubscriberRegistry.flattenHierarchy(HierarchyFixture.class));
168   }
169 
170   private interface HierarchyFixtureInterface {
171     // Exists only for hierarchy mapping; no members.
172   }
173 
174   private interface HierarchyFixtureSubinterface extends HierarchyFixtureInterface {
175     // Exists only for hierarchy mapping; no members.
176   }
177 
178   private static class HierarchyFixtureParent implements HierarchyFixtureSubinterface {
179     // Exists only for hierarchy mapping; no members.
180   }
181 
182   private static class HierarchyFixture extends HierarchyFixtureParent {
183     // Exists only for hierarchy mapping; no members.
184   }
185 }
186