/** * Finds the nth date in the sequence after the input date, * always returning a date later than the input date. * <p> * Given an input date, this method returns a date from the sequence. * If the sequence number is 1, then the first date in the sequence after the input date is returned. * <p> * If the sequence number is 2 or larger, then the date referred to by sequence number 1 * is calculated, and the nth matching sequence date after that date returned. * * @param date the input date * @param sequenceNumber the 1-based index of the date to find * @return the nth sequence date after the input date * @throws IllegalArgumentException if the sequence number is zero or negative or if there are no more sequence dates */ public default LocalDate nth(LocalDate date, int sequenceNumber) { ArgChecker.notNegativeOrZero(sequenceNumber, "sequenceNumber"); if (sequenceNumber == 1) { return next(date); } else { return nth(next(date), sequenceNumber - 1); } }
@Test(dataProvider = "monthlyImm") public void test_nextMonthlyImm(LocalDate base, LocalDate immDate1, LocalDate immDate2, LocalDate immDate3) { LocalDate date = base; while (!date.isAfter(immDate1)) { if (date.equals(immDate1)) { assertEquals(DateSequences.MONTHLY_IMM.next(date), immDate2); assertEquals(DateSequences.MONTHLY_IMM.nth(date, 1), immDate2); assertEquals(DateSequences.MONTHLY_IMM.nth(date, 2), immDate3); } else { assertEquals(DateSequences.MONTHLY_IMM.next(date), immDate1); assertEquals(DateSequences.MONTHLY_IMM.nth(date, 1), immDate1); assertEquals(DateSequences.MONTHLY_IMM.nth(date, 2), immDate2); assertEquals(DateSequences.MONTHLY_IMM.nth(date, 3), immDate3); } date = date.plusDays(1); } }
@Test(dataProvider = "quarterlyImm") public void test_nextQuarterlyImm(LocalDate base, LocalDate immDate1, LocalDate immDate2, LocalDate immDate3) { LocalDate date = base; while (!date.isAfter(immDate1)) { if (date.equals(immDate1)) { assertEquals(DateSequences.QUARTERLY_IMM.next(date), immDate2); assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 1), immDate2); assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 2), immDate3); } else { assertEquals(DateSequences.QUARTERLY_IMM.next(date), immDate1); assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 1), immDate1); assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 2), immDate2); assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 3), immDate3); } date = date.plusDays(1); } }
@Test(dataProvider = "quarterly10th") public void test_nextQuarterly10th(LocalDate base, LocalDate expect1, LocalDate expect2, LocalDate expect3) { LocalDate date = base; while (!date.isAfter(expect1)) { if (date.equals(expect1)) { assertEquals(DateSequences.QUARTERLY_10TH.next(date), expect2); assertEquals(DateSequences.QUARTERLY_10TH.nth(date, 1), expect2); assertEquals(DateSequences.QUARTERLY_10TH.nth(date, 2), expect3); } else { assertEquals(DateSequences.QUARTERLY_10TH.next(date), expect1); assertEquals(DateSequences.QUARTERLY_10TH.nth(date, 1), expect1); assertEquals(DateSequences.QUARTERLY_10TH.nth(date, 2), expect2); assertEquals(DateSequences.QUARTERLY_10TH.nth(date, 3), expect3); } date = date.plusDays(1); } }