Home | History | Annotate | Download | only in outside
      1 /*
      2  * Copyright (C) 2012 The Guava Authors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.common.eventbus.outside;
     18 
     19 import static com.google.common.truth.Truth.assertThat;
     20 
     21 import com.google.common.collect.Lists;
     22 import com.google.common.eventbus.EventBus;
     23 import com.google.common.eventbus.Subscribe;
     24 
     25 import junit.framework.TestCase;
     26 
     27 import java.util.List;
     28 
     29 /**
     30  * Test that EventBus finds the correct subscribers.
     31  *
     32  * This test must be outside the c.g.c.eventbus package to test correctly.
     33  * @author Louis Wasserman
     34  */
     35 public class AnnotatedSubscriberFinderTests {
     36 
     37   private static final Object EVENT = new Object();
     38 
     39   abstract static class AbstractEventBusTest<H> extends TestCase {
     40     abstract H createSubscriber();
     41 
     42     private H subscriber;
     43 
     44     H getSubscriber() {
     45       return subscriber;
     46     }
     47 
     48     @Override
     49     protected void setUp() throws Exception {
     50       subscriber = createSubscriber();
     51       EventBus bus = new EventBus();
     52       bus.register(subscriber);
     53       bus.post(EVENT);
     54     }
     55 
     56     @Override
     57     protected void tearDown() throws Exception {
     58       subscriber = null;
     59     }
     60   }
     61 
     62   /*
     63    * We break the tests up based on whether they are annotated or abstract in the superclass.
     64    */
     65   public static class BaseSubscriberFinderTest extends
     66       AbstractEventBusTest<BaseSubscriberFinderTest.Subscriber> {
     67     static class Subscriber {
     68       final List<Object> nonSubscriberEvents = Lists.newArrayList();
     69       final List<Object> subscriberEvents = Lists.newArrayList();
     70 
     71       public void notASubscriber(Object o) {
     72         nonSubscriberEvents.add(o);
     73       }
     74 
     75       @Subscribe
     76       public void subscriber(Object o) {
     77         subscriberEvents.add(o);
     78       }
     79     }
     80 
     81     public void testNonSubscriber() {
     82       assertThat(getSubscriber().nonSubscriberEvents).isEmpty();
     83     }
     84 
     85     public void testSubscriber() {
     86       assertThat(getSubscriber().subscriberEvents).has().item(EVENT);
     87     }
     88 
     89     @Override
     90     Subscriber createSubscriber() {
     91       return new Subscriber();
     92     }
     93   }
     94 
     95   public static class AnnotatedAndAbstractInSuperclassTest extends
     96       AbstractEventBusTest<AnnotatedAndAbstractInSuperclassTest.SubClass> {
     97     abstract static class SuperClass {
     98       @Subscribe
     99       public abstract void overriddenAndAnnotatedInSubclass(Object o);
    100 
    101       @Subscribe
    102       public abstract void overriddenInSubclass(Object o);
    103     }
    104 
    105     static class SubClass extends SuperClass {
    106       final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
    107       final List<Object> overriddenInSubclassEvents = Lists.newArrayList();
    108 
    109       @Subscribe
    110       @Override
    111       public void overriddenAndAnnotatedInSubclass(Object o) {
    112         overriddenAndAnnotatedInSubclassEvents.add(o);
    113       }
    114 
    115       @Override
    116       public void overriddenInSubclass(Object o) {
    117         overriddenInSubclassEvents.add(o);
    118       }
    119     }
    120 
    121     public void testOverriddenAndAnnotatedInSubclass() {
    122       assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
    123     }
    124 
    125     public void testOverriddenNotAnnotatedInSubclass() {
    126       assertThat(getSubscriber().overriddenInSubclassEvents).has().item(EVENT);
    127     }
    128 
    129     @Override
    130     SubClass createSubscriber() {
    131       return new SubClass();
    132     }
    133   }
    134 
    135   public static class AnnotatedNotAbstractInSuperclassTest extends
    136       AbstractEventBusTest<AnnotatedNotAbstractInSuperclassTest.SubClass> {
    137     static class SuperClass {
    138       final List<Object> notOverriddenInSubclassEvents = Lists.newArrayList();
    139       final List<Object> overriddenNotAnnotatedInSubclassEvents = Lists.newArrayList();
    140       final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
    141       final List<Object> differentlyOverriddenNotAnnotatedInSubclassBadEvents = Lists
    142           .newArrayList();
    143       final List<Object> differentlyOverriddenAnnotatedInSubclassBadEvents = Lists.newArrayList();
    144 
    145       @Subscribe
    146       public void notOverriddenInSubclass(Object o) {
    147         notOverriddenInSubclassEvents.add(o);
    148       }
    149 
    150       @Subscribe
    151       public void overriddenNotAnnotatedInSubclass(Object o) {
    152         overriddenNotAnnotatedInSubclassEvents.add(o);
    153       }
    154 
    155       @Subscribe
    156       public void overriddenAndAnnotatedInSubclass(Object o) {
    157         overriddenAndAnnotatedInSubclassEvents.add(o);
    158       }
    159 
    160       @Subscribe
    161       public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
    162         // the subclass overrides this and does *not* call super.dONAIS(o)
    163         differentlyOverriddenNotAnnotatedInSubclassBadEvents.add(o);
    164       }
    165 
    166       @Subscribe
    167       public void differentlyOverriddenAnnotatedInSubclass(Object o) {
    168         // the subclass overrides this and does *not* call super.dOAIS(o)
    169         differentlyOverriddenAnnotatedInSubclassBadEvents.add(o);
    170       }
    171     }
    172 
    173     static class SubClass extends SuperClass {
    174       final List<Object> differentlyOverriddenNotAnnotatedInSubclassGoodEvents = Lists
    175           .newArrayList();
    176       final List<Object> differentlyOverriddenAnnotatedInSubclassGoodEvents = Lists.newArrayList();
    177 
    178       @Override
    179       public void overriddenNotAnnotatedInSubclass(Object o) {
    180         super.overriddenNotAnnotatedInSubclass(o);
    181       }
    182 
    183       @Subscribe
    184       @Override
    185       public void overriddenAndAnnotatedInSubclass(Object o) {
    186         super.overriddenAndAnnotatedInSubclass(o);
    187       }
    188 
    189       @Override
    190       public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
    191         differentlyOverriddenNotAnnotatedInSubclassGoodEvents.add(o);
    192       }
    193 
    194       @Subscribe
    195       @Override
    196       public void differentlyOverriddenAnnotatedInSubclass(Object o) {
    197         differentlyOverriddenAnnotatedInSubclassGoodEvents.add(o);
    198       }
    199     }
    200 
    201     public void testNotOverriddenInSubclass() {
    202       assertThat(getSubscriber().notOverriddenInSubclassEvents).has().item(EVENT);
    203     }
    204 
    205     public void testOverriddenNotAnnotatedInSubclass() {
    206       assertThat(getSubscriber().overriddenNotAnnotatedInSubclassEvents).has().item(EVENT);
    207     }
    208 
    209     public void testDifferentlyOverriddenNotAnnotatedInSubclass() {
    210       assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassGoodEvents)
    211           .has().item(EVENT);
    212       assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassBadEvents).isEmpty();
    213     }
    214 
    215     public void testOverriddenAndAnnotatedInSubclass() {
    216       assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
    217     }
    218 
    219     public void testDifferentlyOverriddenAndAnnotatedInSubclass() {
    220       assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassGoodEvents)
    221           .has().item(EVENT);
    222       assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassBadEvents).isEmpty();
    223     }
    224 
    225     @Override
    226     SubClass createSubscriber() {
    227       return new SubClass();
    228     }
    229   }
    230 
    231   public static class AbstractNotAnnotatedInSuperclassTest extends
    232       AbstractEventBusTest<AbstractNotAnnotatedInSuperclassTest.SubClass> {
    233     abstract static class SuperClass {
    234       public abstract void overriddenInSubclassNowhereAnnotated(Object o);
    235 
    236       public abstract void overriddenAndAnnotatedInSubclass(Object o);
    237     }
    238 
    239     static class SubClass extends SuperClass {
    240       final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
    241       final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
    242 
    243       @Override
    244       public void overriddenInSubclassNowhereAnnotated(Object o) {
    245         overriddenInSubclassNowhereAnnotatedEvents.add(o);
    246       }
    247 
    248       @Subscribe
    249       @Override
    250       public void overriddenAndAnnotatedInSubclass(Object o) {
    251         overriddenAndAnnotatedInSubclassEvents.add(o);
    252       }
    253     }
    254 
    255     public void testOverriddenAndAnnotatedInSubclass() {
    256       assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
    257     }
    258 
    259     public void testOverriddenInSubclassNowhereAnnotated() {
    260       assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
    261     }
    262 
    263     @Override
    264     SubClass createSubscriber() {
    265       return new SubClass();
    266     }
    267   }
    268 
    269   public static class NeitherAbstractNorAnnotatedInSuperclassTest extends
    270       AbstractEventBusTest<NeitherAbstractNorAnnotatedInSuperclassTest.SubClass> {
    271     static class SuperClass {
    272       final List<Object> neitherOverriddenNorAnnotatedEvents = Lists.newArrayList();
    273       final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
    274       final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
    275 
    276       public void neitherOverriddenNorAnnotated(Object o) {
    277         neitherOverriddenNorAnnotatedEvents.add(o);
    278       }
    279 
    280       public void overriddenInSubclassNowhereAnnotated(Object o) {
    281         overriddenInSubclassNowhereAnnotatedEvents.add(o);
    282       }
    283 
    284       public void overriddenAndAnnotatedInSubclass(Object o) {
    285         overriddenAndAnnotatedInSubclassEvents.add(o);
    286       }
    287     }
    288 
    289     static class SubClass extends SuperClass {
    290       @Override
    291       public void overriddenInSubclassNowhereAnnotated(Object o) {
    292         super.overriddenInSubclassNowhereAnnotated(o);
    293       }
    294 
    295       @Subscribe
    296       @Override
    297       public void overriddenAndAnnotatedInSubclass(Object o) {
    298         super.overriddenAndAnnotatedInSubclass(o);
    299       }
    300     }
    301 
    302     public void testNeitherOverriddenNorAnnotated() {
    303       assertThat(getSubscriber().neitherOverriddenNorAnnotatedEvents).isEmpty();
    304     }
    305 
    306     public void testOverriddenInSubclassNowhereAnnotated() {
    307       assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
    308     }
    309 
    310     public void testOverriddenAndAnnotatedInSubclass() {
    311       assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
    312     }
    313 
    314     @Override
    315     SubClass createSubscriber() {
    316       return new SubClass();
    317     }
    318   }
    319 
    320   public static class DeepInterfaceTest extends
    321       AbstractEventBusTest<DeepInterfaceTest.SubscriberClass> {
    322     interface Interface1 {
    323       @Subscribe
    324       void annotatedIn1(Object o);
    325 
    326       @Subscribe
    327       void annotatedIn1And2(Object o);
    328 
    329       @Subscribe
    330       void annotatedIn1And2AndClass(Object o);
    331 
    332       void declaredIn1AnnotatedIn2(Object o);
    333 
    334       void declaredIn1AnnotatedInClass(Object o);
    335 
    336       void nowhereAnnotated(Object o);
    337     }
    338 
    339     interface Interface2 extends Interface1 {
    340       @Override
    341       @Subscribe
    342       void declaredIn1AnnotatedIn2(Object o);
    343 
    344       @Override
    345       @Subscribe
    346       void annotatedIn1And2(Object o);
    347 
    348       @Override
    349       @Subscribe
    350       void annotatedIn1And2AndClass(Object o);
    351 
    352       void declaredIn2AnnotatedInClass(Object o);
    353 
    354       @Subscribe
    355       void annotatedIn2(Object o);
    356     }
    357 
    358     static class SubscriberClass implements Interface2 {
    359       final List<Object> annotatedIn1Events = Lists.newArrayList();
    360       final List<Object> annotatedIn1And2Events = Lists.newArrayList();
    361       final List<Object> annotatedIn1And2AndClassEvents = Lists.newArrayList();
    362       final List<Object> declaredIn1AnnotatedIn2Events = Lists.newArrayList();
    363       final List<Object> declaredIn1AnnotatedInClassEvents = Lists.newArrayList();
    364       final List<Object> declaredIn2AnnotatedInClassEvents = Lists.newArrayList();
    365       final List<Object> annotatedIn2Events = Lists.newArrayList();
    366       final List<Object> nowhereAnnotatedEvents = Lists.newArrayList();
    367 
    368       @Override
    369       public void annotatedIn1(Object o) {
    370         annotatedIn1Events.add(o);
    371       }
    372 
    373       @Subscribe
    374       @Override
    375       public void declaredIn1AnnotatedInClass(Object o) {
    376         declaredIn1AnnotatedInClassEvents.add(o);
    377       }
    378 
    379       @Override
    380       public void declaredIn1AnnotatedIn2(Object o) {
    381         declaredIn1AnnotatedIn2Events.add(o);
    382       }
    383 
    384       @Override
    385       public void annotatedIn1And2(Object o) {
    386         annotatedIn1And2Events.add(o);
    387       }
    388 
    389       @Subscribe
    390       @Override
    391       public void annotatedIn1And2AndClass(Object o) {
    392         annotatedIn1And2AndClassEvents.add(o);
    393       }
    394 
    395       @Subscribe
    396       @Override
    397       public void declaredIn2AnnotatedInClass(Object o) {
    398         declaredIn2AnnotatedInClassEvents.add(o);
    399       }
    400 
    401       @Override
    402       public void annotatedIn2(Object o) {
    403         annotatedIn2Events.add(o);
    404       }
    405 
    406       @Override
    407       public void nowhereAnnotated(Object o) {
    408         nowhereAnnotatedEvents.add(o);
    409       }
    410     }
    411 
    412     public void testAnnotatedIn1() {
    413       assertThat(getSubscriber().annotatedIn1Events).has().item(EVENT);
    414     }
    415 
    416     public void testAnnotatedIn2() {
    417       assertThat(getSubscriber().annotatedIn2Events).has().item(EVENT);
    418     }
    419 
    420     public void testAnnotatedIn1And2() {
    421       assertThat(getSubscriber().annotatedIn1And2Events).has().item(EVENT);
    422     }
    423 
    424     public void testAnnotatedIn1And2AndClass() {
    425       assertThat(getSubscriber().annotatedIn1And2AndClassEvents).has().item(EVENT);
    426     }
    427 
    428     public void testDeclaredIn1AnnotatedIn2() {
    429       assertThat(getSubscriber().declaredIn1AnnotatedIn2Events).has().item(EVENT);
    430     }
    431 
    432     public void testDeclaredIn1AnnotatedInClass() {
    433       assertThat(getSubscriber().declaredIn1AnnotatedInClassEvents).has().item(EVENT);
    434     }
    435 
    436     public void testDeclaredIn2AnnotatedInClass() {
    437       assertThat(getSubscriber().declaredIn2AnnotatedInClassEvents).has().item(EVENT);
    438     }
    439 
    440     public void testNowhereAnnotated() {
    441       assertThat(getSubscriber().nowhereAnnotatedEvents).isEmpty();
    442     }
    443 
    444     @Override
    445     SubscriberClass createSubscriber() {
    446       return new SubscriberClass();
    447     }
    448   }
    449 }
    450