@Test
  public void testSubscribeAndPublishWithListenerMethodsWithTopic() {
    MultipleListeners listener = new MultipleListeners();

    sessionEventBus.subscribe(listener);
    sessionEventBus.publish("shouldSucceed", this, "Hello World");
    sessionEventBus.publish("shouldSucceed.int", this, 10);

    // null because not called with topic
    assertNull(listener.theStringPayload);
    assertNull(listener.theStringEvent);
    assertNull(listener.theIntegerPayload);
    assertNull(listener.theIntegerEvent);

    // null because topic must fail
    assertNull(listener.theStringPayloadWithTopicFail);
    assertNull(listener.theIntegerPayloadWithTopicFail);
    assertNull(listener.theIntegerEventWithTopic);

    assertNotNull(listener.theStringPayloadWithTopic);
    assertNotNull(listener.theStringEventWithTopic);

    assertEquals("Hello World", listener.theStringPayloadWithTopic);
    assertEquals("Hello World", listener.theStringEventWithTopic.getPayload());
    assertEquals(10, listener.theIntegerPayloadWithTopic.intValue());
  }
  @Test
  @SuppressWarnings({"unchecked", "rawtypes"})
  public void testSubscribeAndPublish() {
    StringListener stringListener = mock(StringListener.class);

    sessionEventBus.subscribe(stringListener);
    sessionEventBus.publish(this, "Hello World");

    ArgumentCaptor<Event> event = ArgumentCaptor.forClass(Event.class);
    verify(stringListener).onEvent(event.capture());
    assertEquals("Hello World", event.getValue().getPayload());
  }
  @Test
  public void testSubscribeAndPublishWithListenerMethods() {
    MultipleListeners listener = new MultipleListeners();

    sessionEventBus.subscribe(listener);
    sessionEventBus.publish(this, "Hello World");

    assertNull(listener.theIntegerEvent);
    assertNull(listener.theIntegerPayload);
    assertNotNull(listener.theStringEvent);
    assertEquals("Hello World", listener.theStringEvent.getPayload());
    assertEquals("Hello World", listener.theStringPayload);
  }
  @Test
  public void testNoPropagationToChildWithListenerMethods() {
    MultipleListeners listener = new MultipleListeners();

    sessionEventBus.subscribe(listener, false);
    sessionEventBus.publish(this, "Hello World Session");
    applicationEventBus.publish(this, "Hello World Application");

    assertNull(listener.theIntegerEvent);
    assertNull(listener.theIntegerPayload);
    assertNotNull(listener.theStringEvent);
    assertEquals("Hello World Session", listener.theStringEvent.getPayload());
    assertEquals("Hello World Session", listener.theStringPayload);
  }
  @Test
  @SuppressWarnings({"unchecked", "rawtypes"})
  public void testNoPropagationToChild() {
    StringListener stringListener = mock(StringListener.class);

    sessionEventBus.subscribe(stringListener, false);
    applicationEventBus.publish(this, "Hello World");
    sessionEventBus.publish(this, "Hello World");

    ArgumentCaptor<Event> event = ArgumentCaptor.forClass(Event.class);
    verify(stringListener, only()).onEvent(event.capture());
    verifyNoMoreInteractions(stringListener);
    assertEquals("Hello World", event.getValue().getPayload());
  }
  @Test
  public void testPublishToParentScopeWithListenerMethods() {
    MultipleListeners listener = new MultipleListeners();

    applicationEventBus.subscribe(listener);
    sessionEventBus.publish(EventScope.APPLICATION, this, "Hello World");

    assertNull(listener.theIntegerEvent);
    assertNull(listener.theIntegerPayload);
    assertNotNull(listener.theStringEvent);
    assertEquals("Hello World", listener.theStringEvent.getPayload());
    assertEquals("Hello World", listener.theStringPayload);
  }
 @Test(expected = IllegalArgumentException.class)
 public void testSubscribeAndPublishWithListenerMethodsAndTooManyParameters() {
   sessionEventBus.subscribe(new InvalidListener2());
 }
 @After
 public void tearDown() {
   sessionEventBus.destroy();
   applicationEventBus.destroy();
 }