Skip to content

Commit da6d337

Browse files
authored
Add test coverage for negative-day adjustment in DurationFormatUtils (#1596)
Adds unit tests covering month-boundary and leap-year cases that trigger the internal negative-days borrowing logic in DurationFormatUtils.formatPeriod. Removes obsolete TODO about missing JaCoCo coverage.
1 parent cfaaa23 commit da6d337

1 file changed

Lines changed: 48 additions & 2 deletions

File tree

src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,54 @@ void testFormatPeriod() {
473473
assertEquals("helloworld", DurationFormatUtils.formatPeriod(time1970, time, "'hello''world'"));
474474
}
475475

476+
@Test
477+
void testFormatPeriodISOAcrossMonths() {
478+
final TimeZone tz = TimeZones.getTimeZone("GMT-3");
479+
480+
// Verifies period formatting across a month boundary (Jan 31 to Feb 1)
481+
final Calendar start = Calendar.getInstance(tz);
482+
start.clear();
483+
start.set(2020, Calendar.JANUARY, 31);
484+
485+
final Calendar end = Calendar.getInstance(tz);
486+
end.clear();
487+
end.set(2020, Calendar.FEBRUARY, 1);
488+
489+
final String result = DurationFormatUtils.formatPeriod(
490+
start.getTimeInMillis(),
491+
end.getTimeInMillis(),
492+
DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN,
493+
false,
494+
tz
495+
);
496+
497+
assertEquals("P0Y0M1DT0H0M0.000S", result);
498+
}
499+
500+
@Test
501+
void testFormatPeriodISOLeapYearBoundary() {
502+
final TimeZone tz = TimeZones.getTimeZone("GMT-3");
503+
504+
// Verifies period formatting across a leap-year boundary (Feb 29 to Mar 1)
505+
final Calendar start = Calendar.getInstance(tz);
506+
start.clear();
507+
start.set(2020, Calendar.FEBRUARY, 29);
508+
509+
final Calendar end = Calendar.getInstance(tz);
510+
end.clear();
511+
end.set(2020, Calendar.MARCH, 1);
512+
513+
final String result = DurationFormatUtils.formatPeriod(
514+
start.getTimeInMillis(),
515+
end.getTimeInMillis(),
516+
DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN,
517+
false,
518+
tz
519+
);
520+
521+
assertEquals("P0Y0M1DT0H0M0.000S", result);
522+
}
523+
476524
@Test
477525
void testFormatPeriodeStartGreaterEnd() {
478526
assertIllegalArgumentException(() -> DurationFormatUtils.formatPeriod(5000, 2500, "yy/MM"));
@@ -505,8 +553,6 @@ void testFormatPeriodISO() {
505553
assertEquals("P1Y1M2DT10H30M0.000S", text);
506554
// want a way to say 'don't print the seconds in format()' or other fields for that matter:
507555
// assertEquals("P1Y2M3DT10H30M", text);
508-
//
509-
// TODO Jacoco shows missing coverage for internal negative days
510556
}
511557

512558
@Test

0 commit comments

Comments
 (0)