@Test
  public void changelog_can_be_in_wrong_order() {
    Issue issue =
        new DefaultIssue()
            .setKey("A")
            .setCreationDate(tenDaysAgo)
            .setDebt(fiveDays)
            .setChanges(
                newArrayList(
                    // 3rd
                    new FieldDiffs()
                        .setDiff("technicalDebt", null, oneDay)
                        .setCreationDate(nineDaysAgo),
                    // 1st
                    new FieldDiffs()
                        .setDiff("technicalDebt", twoDays, fiveDays)
                        .setCreationDate(rightNow),
                    // 2nd
                    new FieldDiffs()
                        .setDiff("technicalDebt", oneDay, twoDays)
                        .setCreationDate(fourDaysAgo)));

    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, fiveDaysAgo))
        .isEqualTo(4 * oneDay);
    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, elevenDaysAgo))
        .isEqualTo(5 * oneDay);
  }
  @Test
  public void calculate_new_technical_debt_with_many_diffs_in_changelog() throws Exception {
    Issue issue =
        new DefaultIssue()
            .setKey("A")
            .setCreationDate(tenDaysAgo)
            .setDebt(fiveDays)
            .setChanges(
                newArrayList(
                    new FieldDiffs()
                        .setDiff("technicalDebt", twoDays, fiveDays)
                        .setCreationDate(null),
                    new FieldDiffs()
                        .setDiff("technicalDebt", oneDay, twoDays)
                        .setCreationDate(fourDaysAgo)));

    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, rightNow))
        .isEqualTo(3 * oneDay);
    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, fiveDaysAgo))
        .isEqualTo(4 * oneDay);
    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, elevenDaysAgo))
        .isEqualTo(5 * oneDay);
  }
  @Test
  public void calculate_new_technical_debt_with_one_diff_in_changelog() throws Exception {
    Issue issue =
        new DefaultIssue()
            .setKey("A")
            .setCreationDate(tenDaysAgo)
            .setDebt(twoDays)
            .setChanges(
                newArrayList(
                    // changelog created at is null because it has just been created on the current
                    // analysis
                    new FieldDiffs()
                        .setDiff("technicalDebt", oneDay, twoDays)
                        .setCreationDate(null)));

    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, rightNow))
        .isEqualTo(oneDay);
    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, fiveDaysAgo))
        .isEqualTo(oneDay);

    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, elevenDaysAgo))
        .isEqualTo(twoDays);
  }
  @Test
  public void not_return_negative_debt() {
    Issue issue =
        new DefaultIssue()
            .setKey("A")
            .setCreationDate(tenDaysAgo)
            .setDebt(oneDay)
            .setChanges(
                newArrayList(
                    new FieldDiffs()
                        .setDiff("technicalDebt", twoDays, oneDay)
                        .setCreationDate(null)));

    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, rightNow)).isNull();
  }
  @Test
  public void calculate_new_technical_debt_when_new_debt_is_null() throws Exception {
    Issue issue =
        new DefaultIssue()
            .setKey("A")
            .setCreationDate(tenDaysAgo)
            .setDebt(null)
            .setChanges(
                newArrayList(
                    new FieldDiffs().setDiff("technicalDebt", oneDay, null).setCreationDate(null),
                    new FieldDiffs()
                        .setDiff("technicalDebt", null, oneDay)
                        .setCreationDate(nineDaysAgo)));

    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, rightNow)).isNull();
  }
  @Test
  public void calculate_new_technical_debt_with_null_date() throws Exception {
    Issue issue =
        new DefaultIssue()
            .setKey("A")
            .setCreationDate(tenDaysAgo)
            .setDebt(twoDays)
            .setChanges(
                newArrayList(
                    new FieldDiffs()
                        .setDiff("technicalDebt", oneDay, twoDays)
                        .setCreationDate(null)));

    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, null))
        .isEqualTo(2 * oneDay);
  }
  @Test
  public void calculate_new_technical_debt_on_issue_without_technical_debt_and_without_changelog() {
    Issue issue = new DefaultIssue().setKey("A").setCreationDate(tenDaysAgo);

    assertThat(issueChangelogDebtCalculator.calculateNewTechnicalDebt(issue, rightNow)).isNull();
  }