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