11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.eventbus; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Lists; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Test case for {@link EventBus}. 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Cliff Biffle 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class EventBusTest extends TestCase { 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final String EVENT = "Hello"; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final String BUS_IDENTIFIER = "test-bus"; 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private EventBus bus; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected void setUp() throws Exception { 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super.setUp(); 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus = new EventBus(BUS_IDENTIFIER); 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBasicCatcherDistribution() { 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringCatcher catcher = new StringCatcher(); 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(catcher); 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<EventHandler> wrappers = bus.getHandlersForEventType(String.class); 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNotNull("Should have at least one method registered.", wrappers); 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("One method should be registered.", 1, wrappers.size()); 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(EVENT); 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<String> events = catcher.getEvents(); 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Only one event should be delivered.", 1, events.size()); 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Correct string should be delivered.", EVENT, events.get(0)); 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests that events are distributed to any subscribers to their type or any 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * supertype, including interfaces and superclasses. 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Also checks delivery ordering in such cases. 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPolymorphicDistribution() { 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Three catchers for related types String, Object, and Comparable<?>. 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // String isa Object 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // String isa Comparable<?> 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Comparable<?> isa Object 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringCatcher stringCatcher = new StringCatcher(); 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final List<Object> objectEvents = Lists.newArrayList(); 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object objCatcher = new Object() { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unused") 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Subscribe public void eat(Object food) { 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert objectEvents.add(food); 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final List<Comparable<?>> compEvents = Lists.newArrayList(); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object compCatcher = new Object() { 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unused") 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Subscribe public void eat(Comparable<?> food) { 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert compEvents.add(food); 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(stringCatcher); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(objCatcher); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(compCatcher); 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Two additional event types: Object and Comparable<?> (played by Integer) 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Object OBJ_EVENT = new Object(); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Object COMP_EVENT = new Integer(6); 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(EVENT); 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(OBJ_EVENT); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(COMP_EVENT); 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Check the StringCatcher... 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<String> stringEvents = stringCatcher.getEvents(); 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Only one String should be delivered.", 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1, stringEvents.size()); 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Correct string should be delivered.", 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EVENT, stringEvents.get(0)); 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Check the Catcher<Object>... 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Three Objects should be delivered.", 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3, objectEvents.size()); 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("String fixture must be first object delivered.", 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EVENT, objectEvents.get(0)); 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Object fixture must be second object delivered.", 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert OBJ_EVENT, objectEvents.get(1)); 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Comparable fixture must be thirdobject delivered.", 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert COMP_EVENT, objectEvents.get(2)); 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Check the Catcher<Comparable<?>>... 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Two Comparable<?>s should be delivered.", 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2, compEvents.size()); 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("String fixture must be first comparable delivered.", 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EVENT, compEvents.get(0)); 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Comparable fixture must be second comparable delivered.", 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert COMP_EVENT, compEvents.get(1)); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testDeadEventForwarding() { 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert GhostCatcher catcher = new GhostCatcher(); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(catcher); 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // A String -- an event for which noone has registered. 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(EVENT); 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<DeadEvent> events = catcher.getEvents(); 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("One dead event should be delivered.", 1, events.size()); 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("The dead event should wrap the original event.", 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EVENT, events.get(0).getEvent()); 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testDeadEventPosting() { 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert GhostCatcher catcher = new GhostCatcher(); 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(catcher); 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(new DeadEvent(this, EVENT)); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<DeadEvent> events = catcher.getEvents(); 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("The explicit DeadEvent should be delivered.", 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1, events.size()); 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("The dead event must not be re-wrapped.", 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EVENT, events.get(0).getEvent()); 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFlattenHierarchy() { 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert HierarchyFixture fixture = new HierarchyFixture(); 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Class<?>> hierarchy = bus.flattenHierarchy(fixture.getClass()); 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(5, hierarchy.size()); 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertContains(Object.class, hierarchy); 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertContains(HierarchyFixtureInterface.class, hierarchy); 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertContains(HierarchyFixtureSubinterface.class, hierarchy); 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertContains(HierarchyFixtureParent.class, hierarchy); 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertContains(HierarchyFixture.class, hierarchy); 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testMissingSubscribe() { 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(new Object()); 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testUnregister() { 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringCatcher catcher1 = new StringCatcher(); 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringCatcher catcher2 = new StringCatcher(); 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.unregister(catcher1); 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Attempting to unregister an unregistered object succeeded"); 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) { 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // OK. 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(catcher1); 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(EVENT); 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.register(catcher2); 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(EVENT); 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<String> expectedEvents = Lists.newArrayList(); 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedEvents.add(EVENT); 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedEvents.add(EVENT); 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Two correct events should be delivered.", 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedEvents, catcher1.getEvents()); 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("One correct event should be delivered.", 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Lists.newArrayList(EVENT), catcher2.getEvents()); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.unregister(catcher1); 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(EVENT); 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Shouldn't catch any more events when unregistered.", 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedEvents, catcher1.getEvents()); 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Two correct events should be delivered.", 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedEvents, catcher2.getEvents()); 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.unregister(catcher1); 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Attempting to unregister an unregistered object succeeded"); 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) { 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // OK. 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.unregister(catcher2); 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bus.post(EVENT); 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Shouldn't catch any more events when unregistered.", 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedEvents, catcher1.getEvents()); 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Shouldn't catch any more events when unregistered.", 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedEvents, catcher2.getEvents()); 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private <T> void assertContains(T element, Collection<T> collection) { 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue("Collection must contain " + element, 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert collection.contains(element)); 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A collector for DeadEvents. 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author cbiffle 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class GhostCatcher { 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private List<DeadEvent> events = Lists.newArrayList(); 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Subscribe 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void ohNoesIHaveDied(DeadEvent event) { 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert events.add(event); 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public List<DeadEvent> getEvents() { 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return events; 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public interface HierarchyFixtureInterface { 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Exists only for hierarchy mapping; no members. 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public interface HierarchyFixtureSubinterface 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends HierarchyFixtureInterface { 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Exists only for hierarchy mapping; no members. 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class HierarchyFixtureParent 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements HierarchyFixtureSubinterface { 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Exists only for hierarchy mapping; no members. 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class HierarchyFixture extends HierarchyFixtureParent { 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Exists only for hierarchy mapping; no members. 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 255