@Test
  public void
      testThatPresenterInstructsPromptViewToDismissWhenUserDeclinesToGiveCriticalFeedback() {
    // Act
    promptPresenter.reportUserOpinion(IPromptPresenter.UserOpinion.CRITICAL);
    promptPresenter.reportUserFeedbackAction(IPromptPresenter.UserFeedbackAction.DECLINED);

    // Assert
    final InOrder inOrder = inOrder(mockPromptView);
    inOrder.verify(mockPromptView).dismiss(anyBoolean());
    inOrder.verifyNoMoreInteractions();
  }
  @Test
  public void testThatPromptPresenterPassesReceivedEventsToExtraEventListeners() {
    // Arrange
    final IEventListener extraMockEventListener = mock(IEventListener.class);
    promptPresenter.addPromptEventListener(extraMockEventListener);

    final IEvent mockEvent = mock(IEvent.class);

    // Act
    promptPresenter.notifyEventTriggered(mockEvent);

    // Assert
    verify(extraMockEventListener).notifyEventTriggered(mockEvent);
  }
  @Test
  public void
      testThatPresenterInstructsPromptViewToShowProvidedThanksViewWhenUserAgreesToGivePositiveFeedback() {
    // Arrange
    when(mockPromptView.providesThanksView()).thenReturn(true);

    // Act
    promptPresenter.reportUserOpinion(IPromptPresenter.UserOpinion.POSITIVE);
    promptPresenter.reportUserFeedbackAction(IPromptPresenter.UserFeedbackAction.AGREED);

    // Assert
    final InOrder inOrder = inOrder(mockPromptView);
    inOrder.verify(mockPromptView).thankUser(anyBoolean());
    inOrder.verifyNoMoreInteractions();
  }
  @Test
  public void
      testThatPresenterInstructsPromptViewToDismissWhenUserAgreesToGiveCriticalFeedbackAndNoThanksViewProvided() {
    // Arrange
    when(mockPromptView.providesThanksView()).thenReturn(false);

    // Act
    promptPresenter.reportUserOpinion(IPromptPresenter.UserOpinion.CRITICAL);
    promptPresenter.reportUserFeedbackAction(IPromptPresenter.UserFeedbackAction.AGREED);

    // Assert
    final InOrder inOrder = inOrder(mockPromptView);
    inOrder.verify(mockPromptView).dismiss(anyBoolean());
    inOrder.verifyNoMoreInteractions();
  }
  @Test
  public void testThatPresenterInstructsPromptViewToQueryUserOpinionWhenStarted() {
    // Act
    promptPresenter.start();

    // Assert
    final InOrder inOrder = inOrder(mockPromptView);
    inOrder.verify(mockPromptView).queryUserOpinion(anyBoolean());
    inOrder.verifyNoMoreInteractions();
  }
  @Test
  public void
      testThatPresenterInstructsPromptViewToRequestCriticalFeedbackWhenUserReportsCriticalOpinion() {
    // Act
    promptPresenter.reportUserOpinion(IPromptPresenter.UserOpinion.CRITICAL);

    // Assert
    final InOrder inOrder = inOrder(mockPromptView);
    inOrder.verify(mockPromptView).requestCriticalFeedback();
    inOrder.verifyNoMoreInteractions();
  }
  @Test
  public void testThatPromptPresenterPassesReceivedEventsToInjectedEventListener() {
    // Arrange
    final IEvent mockEvent = mock(IEvent.class);

    // Act
    promptPresenter.notifyEventTriggered(mockEvent);

    // Assert
    verify(mockEventListener).notifyEventTriggered(mockEvent);
  }
  @Test
  public void
      testThatPresenterThrowsCorrectExceptionIfUserFeedbackActionIsSuppliedBeforeUserOpinion() {
    // Arrange
    final IPromptPresenter.UserFeedbackAction anyValidUserFeedbackAction =
        IPromptPresenter.UserFeedbackAction.AGREED;

    exception.expect(IllegalStateException.class);
    exception.expectMessage("User opinion must be set before this method is called.");

    // Act
    promptPresenter.reportUserFeedbackAction(anyValidUserFeedbackAction);
  }