blob: c9e5c9a5b4924b8ec224924a0060d0fe3a7ef591 [file] [log] [blame]
/*
* 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.
}
}