| /* |
| * Copyright (C) 2014 The Guava Authors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.google.common.eventbus; |
| |
| import com.google.common.collect.ImmutableSet; |
| import com.google.common.collect.Iterators; |
| import java.util.Iterator; |
| import junit.framework.TestCase; |
| |
| /** |
| * Tests for {@link SubscriberRegistry}. |
| * |
| * @author Colin Decker |
| */ |
| public class SubscriberRegistryTest extends TestCase { |
| |
| private final SubscriberRegistry registry = new SubscriberRegistry(new EventBus()); |
| |
| public void testRegister() { |
| assertEquals(0, registry.getSubscribersForTesting(String.class).size()); |
| |
| registry.register(new StringSubscriber()); |
| assertEquals(1, registry.getSubscribersForTesting(String.class).size()); |
| |
| registry.register(new StringSubscriber()); |
| assertEquals(2, registry.getSubscribersForTesting(String.class).size()); |
| |
| registry.register(new ObjectSubscriber()); |
| assertEquals(2, registry.getSubscribersForTesting(String.class).size()); |
| assertEquals(1, registry.getSubscribersForTesting(Object.class).size()); |
| } |
| |
| public void testUnregister() { |
| StringSubscriber s1 = new StringSubscriber(); |
| StringSubscriber s2 = new StringSubscriber(); |
| |
| registry.register(s1); |
| registry.register(s2); |
| |
| registry.unregister(s1); |
| assertEquals(1, registry.getSubscribersForTesting(String.class).size()); |
| |
| registry.unregister(s2); |
| assertTrue(registry.getSubscribersForTesting(String.class).isEmpty()); |
| } |
| |
| public void testUnregister_notRegistered() { |
| try { |
| registry.unregister(new StringSubscriber()); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| } |
| |
| StringSubscriber s1 = new StringSubscriber(); |
| registry.register(s1); |
| try { |
| registry.unregister(new StringSubscriber()); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| // a StringSubscriber was registered, but not the same one we tried to unregister |
| } |
| |
| registry.unregister(s1); |
| |
| try { |
| registry.unregister(s1); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| } |
| } |
| |
| public void testGetSubscribers() { |
| assertEquals(0, Iterators.size(registry.getSubscribers(""))); |
| |
| registry.register(new StringSubscriber()); |
| assertEquals(1, Iterators.size(registry.getSubscribers(""))); |
| |
| registry.register(new StringSubscriber()); |
| assertEquals(2, Iterators.size(registry.getSubscribers(""))); |
| |
| registry.register(new ObjectSubscriber()); |
| assertEquals(3, Iterators.size(registry.getSubscribers(""))); |
| assertEquals(1, Iterators.size(registry.getSubscribers(new Object()))); |
| assertEquals(1, Iterators.size(registry.getSubscribers(1))); |
| |
| registry.register(new IntegerSubscriber()); |
| assertEquals(3, Iterators.size(registry.getSubscribers(""))); |
| assertEquals(1, Iterators.size(registry.getSubscribers(new Object()))); |
| assertEquals(2, Iterators.size(registry.getSubscribers(1))); |
| } |
| |
| public void testGetSubscribers_returnsImmutableSnapshot() { |
| StringSubscriber s1 = new StringSubscriber(); |
| StringSubscriber s2 = new StringSubscriber(); |
| ObjectSubscriber o1 = new ObjectSubscriber(); |
| |
| Iterator<Subscriber> empty = registry.getSubscribers(""); |
| assertFalse(empty.hasNext()); |
| |
| empty = registry.getSubscribers(""); |
| |
| registry.register(s1); |
| assertFalse(empty.hasNext()); |
| |
| Iterator<Subscriber> one = registry.getSubscribers(""); |
| assertEquals(s1, one.next().target); |
| assertFalse(one.hasNext()); |
| |
| one = registry.getSubscribers(""); |
| |
| registry.register(s2); |
| registry.register(o1); |
| |
| Iterator<Subscriber> three = registry.getSubscribers(""); |
| assertEquals(s1, one.next().target); |
| assertFalse(one.hasNext()); |
| |
| assertEquals(s1, three.next().target); |
| assertEquals(s2, three.next().target); |
| assertEquals(o1, three.next().target); |
| assertFalse(three.hasNext()); |
| |
| three = registry.getSubscribers(""); |
| |
| registry.unregister(s2); |
| |
| assertEquals(s1, three.next().target); |
| assertEquals(s2, three.next().target); |
| assertEquals(o1, three.next().target); |
| assertFalse(three.hasNext()); |
| |
| Iterator<Subscriber> two = registry.getSubscribers(""); |
| assertEquals(s1, two.next().target); |
| assertEquals(o1, two.next().target); |
| assertFalse(two.hasNext()); |
| } |
| |
| public static class StringSubscriber { |
| |
| @Subscribe |
| public void handle(String s) {} |
| } |
| |
| public static class IntegerSubscriber { |
| |
| @Subscribe |
| public void handle(Integer i) {} |
| } |
| |
| public static class ObjectSubscriber { |
| |
| @Subscribe |
| public void handle(Object o) {} |
| } |
| |
| public void testFlattenHierarchy() { |
| assertEquals( |
| ImmutableSet.of( |
| Object.class, |
| HierarchyFixtureInterface.class, |
| HierarchyFixtureSubinterface.class, |
| HierarchyFixtureParent.class, |
| HierarchyFixture.class), |
| SubscriberRegistry.flattenHierarchy(HierarchyFixture.class)); |
| } |
| |
| private interface HierarchyFixtureInterface { |
| // Exists only for hierarchy mapping; no members. |
| } |
| |
| private interface HierarchyFixtureSubinterface extends HierarchyFixtureInterface { |
| // Exists only for hierarchy mapping; no members. |
| } |
| |
| private static class HierarchyFixtureParent implements HierarchyFixtureSubinterface { |
| // Exists only for hierarchy mapping; no members. |
| } |
| |
| private static class HierarchyFixture extends HierarchyFixtureParent { |
| // Exists only for hierarchy mapping; no members. |
| } |
| } |