Mi piace pensare in termini di casi di test. Quali valori per beginDate
e endDate
causeranno un tale metodo per restituire vero o falso?
Ad esempio, cosa succede se si trovano nello stesso anno? Forse entrambi i valori sono dalla stessa parte del 29 febbraio o lo comprendono.
E se fossero in anni diversi? Cosa succede se quegli anni sono adiacenti, o se ci sono altri anni in mezzo? Forse nessuno degli anni che intercorrono è nemmeno un anno bisestile.
Quello che puoi fare in questo tipo di scenario è mettere insieme esempi di questi casi e poi scrivere un metodo, regolandolo fino a che passino tutti gli asseriti.
Di seguito è riportato un approccio che è possibile adottare. È possibile aggiungere casi in cui lo beginDate
e/o lo maturity
atterrano in un giorno bisestile.
public class Q26403911 {
@Test
public void testContainsLeapYear() throws Exception {
Assert.assertTrue(isContainsLeapYear(LocalDate.of(1984, 2, 28), LocalDate.of(1984, 3, 1)));
Assert.assertFalse(isContainsLeapYear(LocalDate.of(1985, 2, 28), LocalDate.of(1985, 3, 1)));
Assert.assertFalse(isContainsLeapYear(LocalDate.of(1984, 2, 27), LocalDate.of(1984, 2, 28)));
Assert.assertFalse(isContainsLeapYear(LocalDate.of(1984, 3, 1), LocalDate.of(1984, 3, 2)));
Assert.assertTrue(isContainsLeapYear(LocalDate.of(1984, 2, 28), LocalDate.of(1985, 3, 1)));
Assert.assertTrue(isContainsLeapYear(LocalDate.of(1983, 3, 1), LocalDate.of(1984, 3, 1)));
Assert.assertFalse(isContainsLeapYear(LocalDate.of(1984, 3, 1), LocalDate.of(1985, 3, 1)));
Assert.assertFalse(isContainsLeapYear(LocalDate.of(1983, 2, 28), LocalDate.of(1984, 2, 28)));
Assert.assertTrue(isContainsLeapYear(LocalDate.of(1983, 3, 1), LocalDate.of(1985, 2, 28)));
Assert.assertFalse(isContainsLeapYear(LocalDate.of(1985, 3, 1), LocalDate.of(1987, 2, 28)));
}
public boolean isContainsLeapYear(LocalDate beginDate, LocalDate maturity) {
if (beginDate.getYear() == maturity.getYear())
{
if (!Year.isLeap(beginDate.getYear()))
{
return false;
}
if (maturity.isBefore(LocalDate.of(beginDate.getYear(), Month.FEBRUARY, 29)))
{
return false;
}
if (beginDate.isAfter(LocalDate.of(maturity.getYear(), Month.FEBRUARY, 29)))
{
return false;
}
return true;
}
else if (Year.isLeap(beginDate.getYear())
&& !beginDate.isAfter(LocalDate.of(beginDate.getYear(), Month.FEBRUARY, 29)))
{
return true;
}
else if (Year.isLeap(maturity.getYear())
&& !maturity.isBefore(LocalDate.of(maturity.getYear(), Month.FEBRUARY, 29)))
{
return true;
}
else
{
for (int year = beginDate.getYear() + 1; year < maturity.getYear(); year++)
{
if (Year.isLeap(year))
{
return true;
}
}
}
return false;
}
}
Basta controllare l'ultimo giorno del mese febbraio – Roshan
E 'un momento joda o Java 8 question time api? La risposta potrebbe essere diversa ... – assylias
@assylias Java 8. Grazie :-) – YvesHendseth