17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2012 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.eventbus.outside;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport static com.google.common.truth.Truth.assertThat;
207dd252788645e940eada959bdde927426e2531c9Paul Duffin
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Lists;
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.eventbus.EventBus;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.eventbus.Subscribe;
247dd252788645e940eada959bdde927426e2531c9Paul Duffin
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestCase;
267dd252788645e940eada959bdde927426e2531c9Paul Duffin
270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.List;
287dd252788645e940eada959bdde927426e2531c9Paul Duffin
297dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
300888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Test that EventBus finds the correct subscribers.
317dd252788645e940eada959bdde927426e2531c9Paul Duffin *
327dd252788645e940eada959bdde927426e2531c9Paul Duffin * This test must be outside the c.g.c.eventbus package to test correctly.
337dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Louis Wasserman
347dd252788645e940eada959bdde927426e2531c9Paul Duffin */
350888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class AnnotatedSubscriberFinderTests {
367dd252788645e940eada959bdde927426e2531c9Paul Duffin
377dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final Object EVENT = new Object();
387dd252788645e940eada959bdde927426e2531c9Paul Duffin
397dd252788645e940eada959bdde927426e2531c9Paul Duffin  abstract static class AbstractEventBusTest<H> extends TestCase {
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    abstract H createSubscriber();
417dd252788645e940eada959bdde927426e2531c9Paul Duffin
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private H subscriber;
437dd252788645e940eada959bdde927426e2531c9Paul Duffin
440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    H getSubscriber() {
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return subscriber;
467dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
477dd252788645e940eada959bdde927426e2531c9Paul Duffin
487dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
497dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected void setUp() throws Exception {
500888a09821a98ac0680fad765217302858e70fa4Paul Duffin      subscriber = createSubscriber();
517dd252788645e940eada959bdde927426e2531c9Paul Duffin      EventBus bus = new EventBus();
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      bus.register(subscriber);
537dd252788645e940eada959bdde927426e2531c9Paul Duffin      bus.post(EVENT);
547dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
557dd252788645e940eada959bdde927426e2531c9Paul Duffin
567dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
577dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected void tearDown() throws Exception {
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      subscriber = null;
597dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
607dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
617dd252788645e940eada959bdde927426e2531c9Paul Duffin
627dd252788645e940eada959bdde927426e2531c9Paul Duffin  /*
637dd252788645e940eada959bdde927426e2531c9Paul Duffin   * We break the tests up based on whether they are annotated or abstract in the superclass.
647dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static class BaseSubscriberFinderTest extends
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin      AbstractEventBusTest<BaseSubscriberFinderTest.Subscriber> {
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    static class Subscriber {
687dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> nonSubscriberEvents = Lists.newArrayList();
697dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> subscriberEvents = Lists.newArrayList();
707dd252788645e940eada959bdde927426e2531c9Paul Duffin
717dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void notASubscriber(Object o) {
727dd252788645e940eada959bdde927426e2531c9Paul Duffin        nonSubscriberEvents.add(o);
737dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
747dd252788645e940eada959bdde927426e2531c9Paul Duffin
757dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
767dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void subscriber(Object o) {
777dd252788645e940eada959bdde927426e2531c9Paul Duffin        subscriberEvents.add(o);
787dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
797dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
807dd252788645e940eada959bdde927426e2531c9Paul Duffin
817dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testNonSubscriber() {
823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().nonSubscriberEvents).isEmpty();
837dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
847dd252788645e940eada959bdde927426e2531c9Paul Duffin
857dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testSubscriber() {
863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().subscriberEvents).has().item(EVENT);
877dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
887dd252788645e940eada959bdde927426e2531c9Paul Duffin
897dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Subscriber createSubscriber() {
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new Subscriber();
927dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
937dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
947dd252788645e940eada959bdde927426e2531c9Paul Duffin
957dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class AnnotatedAndAbstractInSuperclassTest extends
967dd252788645e940eada959bdde927426e2531c9Paul Duffin      AbstractEventBusTest<AnnotatedAndAbstractInSuperclassTest.SubClass> {
977dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract static class SuperClass {
987dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
997dd252788645e940eada959bdde927426e2531c9Paul Duffin      public abstract void overriddenAndAnnotatedInSubclass(Object o);
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin      public abstract void overriddenInSubclass(Object o);
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1047dd252788645e940eada959bdde927426e2531c9Paul Duffin
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin    static class SubClass extends SuperClass {
1067dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> overriddenInSubclassEvents = Lists.newArrayList();
1087dd252788645e940eada959bdde927426e2531c9Paul Duffin
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenAndAnnotatedInSubclass(Object o) {
1127dd252788645e940eada959bdde927426e2531c9Paul Duffin        overriddenAndAnnotatedInSubclassEvents.add(o);
1137dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenInSubclass(Object o) {
1177dd252788645e940eada959bdde927426e2531c9Paul Duffin        overriddenInSubclassEvents.add(o);
1187dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1197dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1207dd252788645e940eada959bdde927426e2531c9Paul Duffin
1217dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testOverriddenAndAnnotatedInSubclass() {
1223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testOverriddenNotAnnotatedInSubclass() {
1263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().overriddenInSubclassEvents).has().item(EVENT);
1277dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1287dd252788645e940eada959bdde927426e2531c9Paul Duffin
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SubClass createSubscriber() {
1317dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new SubClass();
1327dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1337dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class AnnotatedNotAbstractInSuperclassTest extends
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin      AbstractEventBusTest<AnnotatedNotAbstractInSuperclassTest.SubClass> {
1377dd252788645e940eada959bdde927426e2531c9Paul Duffin    static class SuperClass {
1387dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> notOverriddenInSubclassEvents = Lists.newArrayList();
1397dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> overriddenNotAnnotatedInSubclassEvents = Lists.newArrayList();
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
1417dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> differentlyOverriddenNotAnnotatedInSubclassBadEvents = Lists
1427dd252788645e940eada959bdde927426e2531c9Paul Duffin          .newArrayList();
1437dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> differentlyOverriddenAnnotatedInSubclassBadEvents = Lists.newArrayList();
1447dd252788645e940eada959bdde927426e2531c9Paul Duffin
1457dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void notOverriddenInSubclass(Object o) {
1477dd252788645e940eada959bdde927426e2531c9Paul Duffin        notOverriddenInSubclassEvents.add(o);
1487dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1497dd252788645e940eada959bdde927426e2531c9Paul Duffin
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1517dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenNotAnnotatedInSubclass(Object o) {
1527dd252788645e940eada959bdde927426e2531c9Paul Duffin        overriddenNotAnnotatedInSubclassEvents.add(o);
1537dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1547dd252788645e940eada959bdde927426e2531c9Paul Duffin
1557dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1567dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenAndAnnotatedInSubclass(Object o) {
1577dd252788645e940eada959bdde927426e2531c9Paul Duffin        overriddenAndAnnotatedInSubclassEvents.add(o);
1587dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin
1607dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
1627dd252788645e940eada959bdde927426e2531c9Paul Duffin        // the subclass overrides this and does *not* call super.dONAIS(o)
1637dd252788645e940eada959bdde927426e2531c9Paul Duffin        differentlyOverriddenNotAnnotatedInSubclassBadEvents.add(o);
1647dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin
1667dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1677dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void differentlyOverriddenAnnotatedInSubclass(Object o) {
1687dd252788645e940eada959bdde927426e2531c9Paul Duffin        // the subclass overrides this and does *not* call super.dOAIS(o)
1697dd252788645e940eada959bdde927426e2531c9Paul Duffin        differentlyOverriddenAnnotatedInSubclassBadEvents.add(o);
1707dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1717dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1727dd252788645e940eada959bdde927426e2531c9Paul Duffin
1737dd252788645e940eada959bdde927426e2531c9Paul Duffin    static class SubClass extends SuperClass {
1747dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> differentlyOverriddenNotAnnotatedInSubclassGoodEvents = Lists
1757dd252788645e940eada959bdde927426e2531c9Paul Duffin          .newArrayList();
1767dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> differentlyOverriddenAnnotatedInSubclassGoodEvents = Lists.newArrayList();
1777dd252788645e940eada959bdde927426e2531c9Paul Duffin
1787dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1797dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenNotAnnotatedInSubclass(Object o) {
1807dd252788645e940eada959bdde927426e2531c9Paul Duffin        super.overriddenNotAnnotatedInSubclass(o);
1817dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1827dd252788645e940eada959bdde927426e2531c9Paul Duffin
1837dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1847dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1857dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenAndAnnotatedInSubclass(Object o) {
1867dd252788645e940eada959bdde927426e2531c9Paul Duffin        super.overriddenAndAnnotatedInSubclass(o);
1877dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1887dd252788645e940eada959bdde927426e2531c9Paul Duffin
1897dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1907dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
1917dd252788645e940eada959bdde927426e2531c9Paul Duffin        differentlyOverriddenNotAnnotatedInSubclassGoodEvents.add(o);
1927dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1937dd252788645e940eada959bdde927426e2531c9Paul Duffin
1947dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
1957dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1967dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void differentlyOverriddenAnnotatedInSubclass(Object o) {
1977dd252788645e940eada959bdde927426e2531c9Paul Duffin        differentlyOverriddenAnnotatedInSubclassGoodEvents.add(o);
1987dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1997dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2007dd252788645e940eada959bdde927426e2531c9Paul Duffin
2017dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testNotOverriddenInSubclass() {
2023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().notOverriddenInSubclassEvents).has().item(EVENT);
2037dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2047dd252788645e940eada959bdde927426e2531c9Paul Duffin
2057dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testOverriddenNotAnnotatedInSubclass() {
2063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().overriddenNotAnnotatedInSubclassEvents).has().item(EVENT);
2077dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2087dd252788645e940eada959bdde927426e2531c9Paul Duffin
2097dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testDifferentlyOverriddenNotAnnotatedInSubclass() {
2103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassGoodEvents)
2117dd252788645e940eada959bdde927426e2531c9Paul Duffin          .has().item(EVENT);
2123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassBadEvents).isEmpty();
2137dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2147dd252788645e940eada959bdde927426e2531c9Paul Duffin
2157dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testOverriddenAndAnnotatedInSubclass() {
2163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
2177dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2187dd252788645e940eada959bdde927426e2531c9Paul Duffin
2197dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testDifferentlyOverriddenAndAnnotatedInSubclass() {
2203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassGoodEvents)
2217dd252788645e940eada959bdde927426e2531c9Paul Duffin          .has().item(EVENT);
2223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassBadEvents).isEmpty();
2237dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2247dd252788645e940eada959bdde927426e2531c9Paul Duffin
2257dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SubClass createSubscriber() {
2277dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new SubClass();
2287dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2297dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2307dd252788645e940eada959bdde927426e2531c9Paul Duffin
2317dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class AbstractNotAnnotatedInSuperclassTest extends
2327dd252788645e940eada959bdde927426e2531c9Paul Duffin      AbstractEventBusTest<AbstractNotAnnotatedInSuperclassTest.SubClass> {
2337dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract static class SuperClass {
2347dd252788645e940eada959bdde927426e2531c9Paul Duffin      public abstract void overriddenInSubclassNowhereAnnotated(Object o);
2357dd252788645e940eada959bdde927426e2531c9Paul Duffin
2367dd252788645e940eada959bdde927426e2531c9Paul Duffin      public abstract void overriddenAndAnnotatedInSubclass(Object o);
2377dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2387dd252788645e940eada959bdde927426e2531c9Paul Duffin
2397dd252788645e940eada959bdde927426e2531c9Paul Duffin    static class SubClass extends SuperClass {
2407dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
2417dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
2427dd252788645e940eada959bdde927426e2531c9Paul Duffin
2437dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2447dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenInSubclassNowhereAnnotated(Object o) {
2457dd252788645e940eada959bdde927426e2531c9Paul Duffin        overriddenInSubclassNowhereAnnotatedEvents.add(o);
2467dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2477dd252788645e940eada959bdde927426e2531c9Paul Duffin
2487dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
2497dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2507dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenAndAnnotatedInSubclass(Object o) {
2517dd252788645e940eada959bdde927426e2531c9Paul Duffin        overriddenAndAnnotatedInSubclassEvents.add(o);
2527dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2537dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2547dd252788645e940eada959bdde927426e2531c9Paul Duffin
2557dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testOverriddenAndAnnotatedInSubclass() {
2563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
2577dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2587dd252788645e940eada959bdde927426e2531c9Paul Duffin
2597dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testOverriddenInSubclassNowhereAnnotated() {
2603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
2617dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2627dd252788645e940eada959bdde927426e2531c9Paul Duffin
2637dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
2640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SubClass createSubscriber() {
2657dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new SubClass();
2667dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2677dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2687dd252788645e940eada959bdde927426e2531c9Paul Duffin
2697dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class NeitherAbstractNorAnnotatedInSuperclassTest extends
2707dd252788645e940eada959bdde927426e2531c9Paul Duffin      AbstractEventBusTest<NeitherAbstractNorAnnotatedInSuperclassTest.SubClass> {
2717dd252788645e940eada959bdde927426e2531c9Paul Duffin    static class SuperClass {
2727dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> neitherOverriddenNorAnnotatedEvents = Lists.newArrayList();
2737dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
2747dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
2757dd252788645e940eada959bdde927426e2531c9Paul Duffin
2767dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void neitherOverriddenNorAnnotated(Object o) {
2777dd252788645e940eada959bdde927426e2531c9Paul Duffin        neitherOverriddenNorAnnotatedEvents.add(o);
2787dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin
2807dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenInSubclassNowhereAnnotated(Object o) {
2817dd252788645e940eada959bdde927426e2531c9Paul Duffin        overriddenInSubclassNowhereAnnotatedEvents.add(o);
2827dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2837dd252788645e940eada959bdde927426e2531c9Paul Duffin
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenAndAnnotatedInSubclass(Object o) {
2857dd252788645e940eada959bdde927426e2531c9Paul Duffin        overriddenAndAnnotatedInSubclassEvents.add(o);
2867dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2877dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2887dd252788645e940eada959bdde927426e2531c9Paul Duffin
2897dd252788645e940eada959bdde927426e2531c9Paul Duffin    static class SubClass extends SuperClass {
2907dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2917dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenInSubclassNowhereAnnotated(Object o) {
2927dd252788645e940eada959bdde927426e2531c9Paul Duffin        super.overriddenInSubclassNowhereAnnotated(o);
2937dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2947dd252788645e940eada959bdde927426e2531c9Paul Duffin
2957dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
2967dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2977dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void overriddenAndAnnotatedInSubclass(Object o) {
2987dd252788645e940eada959bdde927426e2531c9Paul Duffin        super.overriddenAndAnnotatedInSubclass(o);
2997dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3007dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3017dd252788645e940eada959bdde927426e2531c9Paul Duffin
3027dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testNeitherOverriddenNorAnnotated() {
3033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().neitherOverriddenNorAnnotatedEvents).isEmpty();
3047dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3057dd252788645e940eada959bdde927426e2531c9Paul Duffin
3067dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testOverriddenInSubclassNowhereAnnotated() {
3073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
3087dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3097dd252788645e940eada959bdde927426e2531c9Paul Duffin
3107dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testOverriddenAndAnnotatedInSubclass() {
3113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
3127dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3137dd252788645e940eada959bdde927426e2531c9Paul Duffin
3147dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
3150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SubClass createSubscriber() {
3167dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new SubClass();
3177dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3187dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3197dd252788645e940eada959bdde927426e2531c9Paul Duffin
3207dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class DeepInterfaceTest extends
3210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      AbstractEventBusTest<DeepInterfaceTest.SubscriberClass> {
3227dd252788645e940eada959bdde927426e2531c9Paul Duffin    interface Interface1 {
3237dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3247dd252788645e940eada959bdde927426e2531c9Paul Duffin      void annotatedIn1(Object o);
3257dd252788645e940eada959bdde927426e2531c9Paul Duffin
3267dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3277dd252788645e940eada959bdde927426e2531c9Paul Duffin      void annotatedIn1And2(Object o);
3287dd252788645e940eada959bdde927426e2531c9Paul Duffin
3297dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3307dd252788645e940eada959bdde927426e2531c9Paul Duffin      void annotatedIn1And2AndClass(Object o);
3317dd252788645e940eada959bdde927426e2531c9Paul Duffin
3327dd252788645e940eada959bdde927426e2531c9Paul Duffin      void declaredIn1AnnotatedIn2(Object o);
3337dd252788645e940eada959bdde927426e2531c9Paul Duffin
3347dd252788645e940eada959bdde927426e2531c9Paul Duffin      void declaredIn1AnnotatedInClass(Object o);
3357dd252788645e940eada959bdde927426e2531c9Paul Duffin
3367dd252788645e940eada959bdde927426e2531c9Paul Duffin      void nowhereAnnotated(Object o);
3377dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3387dd252788645e940eada959bdde927426e2531c9Paul Duffin
3397dd252788645e940eada959bdde927426e2531c9Paul Duffin    interface Interface2 extends Interface1 {
3407dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3417dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3427dd252788645e940eada959bdde927426e2531c9Paul Duffin      void declaredIn1AnnotatedIn2(Object o);
3437dd252788645e940eada959bdde927426e2531c9Paul Duffin
3447dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3457dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3467dd252788645e940eada959bdde927426e2531c9Paul Duffin      void annotatedIn1And2(Object o);
3477dd252788645e940eada959bdde927426e2531c9Paul Duffin
3487dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3497dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3507dd252788645e940eada959bdde927426e2531c9Paul Duffin      void annotatedIn1And2AndClass(Object o);
3517dd252788645e940eada959bdde927426e2531c9Paul Duffin
3527dd252788645e940eada959bdde927426e2531c9Paul Duffin      void declaredIn2AnnotatedInClass(Object o);
3537dd252788645e940eada959bdde927426e2531c9Paul Duffin
3547dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3557dd252788645e940eada959bdde927426e2531c9Paul Duffin      void annotatedIn2(Object o);
3567dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3577dd252788645e940eada959bdde927426e2531c9Paul Duffin
3580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    static class SubscriberClass implements Interface2 {
3597dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> annotatedIn1Events = Lists.newArrayList();
3607dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> annotatedIn1And2Events = Lists.newArrayList();
3617dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> annotatedIn1And2AndClassEvents = Lists.newArrayList();
3627dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> declaredIn1AnnotatedIn2Events = Lists.newArrayList();
3637dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> declaredIn1AnnotatedInClassEvents = Lists.newArrayList();
3647dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> declaredIn2AnnotatedInClassEvents = Lists.newArrayList();
3657dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> annotatedIn2Events = Lists.newArrayList();
3667dd252788645e940eada959bdde927426e2531c9Paul Duffin      final List<Object> nowhereAnnotatedEvents = Lists.newArrayList();
3677dd252788645e940eada959bdde927426e2531c9Paul Duffin
3687dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3697dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void annotatedIn1(Object o) {
3707dd252788645e940eada959bdde927426e2531c9Paul Duffin        annotatedIn1Events.add(o);
3717dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3727dd252788645e940eada959bdde927426e2531c9Paul Duffin
3737dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3747dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3757dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void declaredIn1AnnotatedInClass(Object o) {
3767dd252788645e940eada959bdde927426e2531c9Paul Duffin        declaredIn1AnnotatedInClassEvents.add(o);
3777dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3787dd252788645e940eada959bdde927426e2531c9Paul Duffin
3797dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3807dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void declaredIn1AnnotatedIn2(Object o) {
3817dd252788645e940eada959bdde927426e2531c9Paul Duffin        declaredIn1AnnotatedIn2Events.add(o);
3827dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3837dd252788645e940eada959bdde927426e2531c9Paul Duffin
3847dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3857dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void annotatedIn1And2(Object o) {
3867dd252788645e940eada959bdde927426e2531c9Paul Duffin        annotatedIn1And2Events.add(o);
3877dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3887dd252788645e940eada959bdde927426e2531c9Paul Duffin
3897dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3907dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3917dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void annotatedIn1And2AndClass(Object o) {
3927dd252788645e940eada959bdde927426e2531c9Paul Duffin        annotatedIn1And2AndClassEvents.add(o);
3937dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3947dd252788645e940eada959bdde927426e2531c9Paul Duffin
3957dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Subscribe
3967dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3977dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void declaredIn2AnnotatedInClass(Object o) {
3987dd252788645e940eada959bdde927426e2531c9Paul Duffin        declaredIn2AnnotatedInClassEvents.add(o);
3997dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
4007dd252788645e940eada959bdde927426e2531c9Paul Duffin
4017dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
4027dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void annotatedIn2(Object o) {
4037dd252788645e940eada959bdde927426e2531c9Paul Duffin        annotatedIn2Events.add(o);
4047dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
4057dd252788645e940eada959bdde927426e2531c9Paul Duffin
4067dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
4077dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void nowhereAnnotated(Object o) {
4087dd252788645e940eada959bdde927426e2531c9Paul Duffin        nowhereAnnotatedEvents.add(o);
4097dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
4107dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4117dd252788645e940eada959bdde927426e2531c9Paul Duffin
4127dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testAnnotatedIn1() {
4133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().annotatedIn1Events).has().item(EVENT);
4147dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4157dd252788645e940eada959bdde927426e2531c9Paul Duffin
4167dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testAnnotatedIn2() {
4173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().annotatedIn2Events).has().item(EVENT);
4187dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4197dd252788645e940eada959bdde927426e2531c9Paul Duffin
4207dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testAnnotatedIn1And2() {
4213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().annotatedIn1And2Events).has().item(EVENT);
4227dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4237dd252788645e940eada959bdde927426e2531c9Paul Duffin
4247dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testAnnotatedIn1And2AndClass() {
4253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().annotatedIn1And2AndClassEvents).has().item(EVENT);
4267dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4277dd252788645e940eada959bdde927426e2531c9Paul Duffin
4287dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testDeclaredIn1AnnotatedIn2() {
4293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().declaredIn1AnnotatedIn2Events).has().item(EVENT);
4307dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4317dd252788645e940eada959bdde927426e2531c9Paul Duffin
4327dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testDeclaredIn1AnnotatedInClass() {
4333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().declaredIn1AnnotatedInClassEvents).has().item(EVENT);
4347dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4357dd252788645e940eada959bdde927426e2531c9Paul Duffin
4367dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testDeclaredIn2AnnotatedInClass() {
4373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().declaredIn2AnnotatedInClassEvents).has().item(EVENT);
4387dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4397dd252788645e940eada959bdde927426e2531c9Paul Duffin
4407dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testNowhereAnnotated() {
4413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      assertThat(getSubscriber().nowhereAnnotatedEvents).isEmpty();
4427dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4437dd252788645e940eada959bdde927426e2531c9Paul Duffin
4447dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
4450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SubscriberClass createSubscriber() {
4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new SubscriberClass();
4477dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4487dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
4497dd252788645e940eada959bdde927426e2531c9Paul Duffin}
450