@Test
  public void excludeTest() {
    DateTime test = asDate(2011, 4, 12);
    ITimePeriod period = new TimeRange(asDate(2011, 4, 15), asDate(2011, 4, 20));

    CalendarDateAdd dateAdd = new CalendarDateAdd();
    dateAdd.getExcludePeriods().add(period);

    assertThat(dateAdd.add(test, Durations.Zero)).isEqualTo(test);
    assertThat(dateAdd.add(test, Durations.days(1))).isEqualTo(test.plusDays(1));
    assertThat(dateAdd.add(test, Durations.days(2))).isEqualTo(test.plusDays(2));
    assertThat(dateAdd.add(test, Durations.days(3))).isEqualTo(period.getEnd());
    assertThat(dateAdd.add(test, Durations.days(3, 0, 0, 0, 1)))
        .isEqualTo(period.getEnd().plusMillis(1));
    assertThat(dateAdd.add(test, Durations.days(5))).isEqualTo(period.getEnd().plusDays(2));
  }
  @Test
  public void excludeSplit() {
    DateTime test = asDate(2011, 4, 12);
    ITimePeriod period1 = new TimeRange(asDate(2011, 4, 15), asDate(2011, 4, 20));
    ITimePeriod period2 = new TimeRange(asDate(2011, 4, 22), asDate(2011, 4, 25));

    CalendarDateAdd dateAdd = new CalendarDateAdd();
    dateAdd.getExcludePeriods().add(period1);
    dateAdd.getExcludePeriods().add(period2);

    assertThat(dateAdd.add(test, Durations.Zero)).isEqualTo(test);
    assertThat(dateAdd.add(test, Durations.days(1))).isEqualTo(test.plusDays(1));
    assertThat(dateAdd.add(test, Durations.days(2))).isEqualTo(test.plusDays(2));
    assertThat(dateAdd.add(test, Durations.days(3))).isEqualTo(period1.getEnd());
    assertThat(dateAdd.add(test, Durations.days(4))).isEqualTo(period1.getEnd().plusDays(1));
    assertThat(dateAdd.add(test, Durations.days(5))).isEqualTo(period2.getEnd());
    assertThat(dateAdd.add(test, Durations.days(6))).isEqualTo(period2.getEnd().plusDays(1));
    assertThat(dateAdd.add(test, Durations.days(7))).isEqualTo(period2.getEnd().plusDays(2));
  }
  @Test
  public void periodLimitsAdd() {
    DateTime test = asDate(2011, 4, 12);
    ITimePeriod period1 = new TimeRange(asDate(2011, 4, 20), asDate(2011, 4, 25));
    ITimePeriod period2 = new TimeRange(asDate(2011, 4, 30), (DateTime) null); // 4월 30일 이후

    CalendarDateAdd dateAdd = new CalendarDateAdd();

    // 예외기간을 설정합니다. 4월 20일 ~ 4월25일, 4월 30일 이후
    dateAdd.getExcludePeriods().add(period1);
    dateAdd.getExcludePeriods().add(period2);

    assertThat(dateAdd.add(test, Durations.Day)).isEqualTo(test.plus(Durations.Day));

    // 4월 12일에 8일을 더하면 4월 20일이지만, 20~25일까지 제외되므로, 4월 25일이 된다.
    assertThat(dateAdd.add(test, Durations.days(8))).isEqualTo(period1.getEnd());

    // 4월 12에 20일을 더하면 4월 20~25일을 제외한 후 계산하면 4월 30 이후가 된다. (5월 3일).
    // 하지만 4월 30 이후는 모두 제외되므로 결과값은 null이다.
    assertThat(dateAdd.add(test, Durations.days(20))).isNull();

    assertThat(dateAdd.subtract(test, Durations.days(3))).isEqualTo(test.minus(Durations.days(3)));
  }