テストケースの観点から考えるのが好きです。そのようなメソッドが true または false を返す原因beginDate
となる値は何ですか?endDate
例えば、同い年だったら?おそらく、両方の値が 2 月 29 日の同じ側にあるか、2 月 29 日にまたがっています。
彼らが別の年にいる場合はどうなりますか?それらの年が隣接している場合、またはその間に他の年がある場合はどうなりますか? おそらく、その間の年はうるう年でさえありません。
この種のシナリオでできることは、これらのケースの例をまとめてメソッドを記述し、すべてのアサートがパスするまでメソッドを調整することです。
以下は、あなたが取ることができるアプローチです。beginDate
および/またはmaturity
うるう日に着陸するケースを追加することができます。
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;
}
}