/**
   * Verifies that we find the correct results for the following constellation.
   *
   * <ol>
   *   <li>Build with result, build result = SUCCESS
   *   <li>Build with no result
   *   <li>Build with result, build result = FAILURE
   *   <li>Build with no result
   *   <li>Baseline
   * </ol>
   *
   * @throws Exception the exception
   */
  @SuppressWarnings("rawtypes")
  @Test
  public void testHasReferenceResult() throws Exception {
    AbstractBuild withSuccessResult = mock(AbstractBuild.class);
    AbstractBuild noResult2 = mock(AbstractBuild.class);
    AbstractBuild withFailureResult = mock(AbstractBuild.class);
    AbstractBuild noResult1 = mock(AbstractBuild.class);
    AbstractBuild baseline = mock(AbstractBuild.class);
    when(baseline.getPreviousBuild()).thenReturn(noResult1);
    when(noResult1.getPreviousBuild()).thenReturn(withFailureResult);
    when(withFailureResult.getPreviousBuild()).thenReturn(noResult2);
    when(noResult2.getPreviousBuild()).thenReturn(withSuccessResult);

    TestResultAction failureAction = mock(TestResultAction.class);
    when(withFailureResult.getAction(TestResultAction.class)).thenReturn(failureAction);
    when(failureAction.isSuccessful()).thenReturn(false);
    BuildResult failureResult = mock(BuildResult.class);
    when(failureAction.getResult()).thenReturn(failureResult);

    TestResultAction successAction = mock(TestResultAction.class);
    when(withSuccessResult.getAction(TestResultAction.class)).thenReturn(successAction);
    when(successAction.isSuccessful()).thenReturn(true);
    BuildResult successResult = mock(BuildResult.class);
    AnnotationContainer container = mock(AnnotationContainer.class);
    when(successResult.getContainer()).thenReturn(container);
    when(successAction.getResult()).thenReturn(successResult);

    BuildHistory history = createHistory(baseline);

    assertTrue("Build has no previous result", history.hasPreviousResult());
    assertSame("Build has wrong previous result", failureResult, history.getPreviousResult());
    assertSame("Build has wrong reference result", container, history.getReferenceAnnotations());
  }
  /**
   * Verifies that we have no results for the first build.
   *
   * @throws Exception the exception
   */
  @Test(expected = NoSuchElementException.class)
  public void testNoPreviousResult() throws Exception {
    BuildHistory history = createHistory(mock(AbstractBuild.class));

    assertFalse("Build has a previous result", history.hasPreviousResult());
    assertEquals(
        "Build has wrong reference annotations",
        0,
        history.getReferenceAnnotations().getNumberOfAnnotations());

    history.getPreviousResult();
  }
  /**
   * Verifies that we find the correct results for the following constellation.
   *
   * <ol>
   *   <li>Build with result
   *   <li>Build with no result
   *   <li>Baseline
   * </ol>
   *
   * @throws Exception the exception
   */
  @Test
  @SuppressWarnings("rawtypes")
  public void testHasPreviousResult() throws Exception {
    AbstractBuild withResult = mock(AbstractBuild.class);
    AbstractBuild noResult = mock(AbstractBuild.class);
    AbstractBuild baseline = mock(AbstractBuild.class);
    when(baseline.getPreviousBuild()).thenReturn(noResult);
    when(noResult.getPreviousBuild()).thenReturn(withResult);

    TestResultAction action = mock(TestResultAction.class);
    when(withResult.getAction(TestResultAction.class)).thenReturn(action);
    BuildResult result = mock(BuildResult.class);
    when(action.getResult()).thenReturn(result);
    AnnotationContainer container = mock(AnnotationContainer.class);
    when(result.getContainer()).thenReturn(container);
    BuildHistory history = createHistory(baseline);

    assertTrue("Build has no previous result", history.hasPreviousResult());
    assertSame("Build has wrong previous result", result, history.getPreviousResult());
    assertSame("Build has wrong reference result", container, history.getReferenceAnnotations());
  }