197 lines
5.8 KiB
Java
197 lines
5.8 KiB
Java
/*
|
|
* 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.
|
|
}
|
|
}
|