//-------------------------------------------------------------------------
        public virtual void test_yearFraction()
        {
            SchedulePeriod test     = SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17);
            Schedule       schedule = Schedule.ofTerm(test);

            assertEquals(test.yearFraction(DayCounts.ACT_360, schedule), DayCounts.ACT_360.yearFraction(JUN_16, JUL_18, schedule), TOLERANCE);
        }
 //-------------------------------------------------------------------------
 public virtual void test_isRegular()
 {
     assertEquals(SchedulePeriod.of(JUN_18, JUL_18).isRegular(P1M, DAY_18), true);
     assertEquals(SchedulePeriod.of(JUN_18, JUL_05).isRegular(P1M, DAY_18), false);
     assertEquals(SchedulePeriod.of(JUL_05, JUL_18).isRegular(P1M, DAY_18), false);
     assertEquals(SchedulePeriod.of(JUN_18, JUL_05).isRegular(P2M, DAY_18), false);
 }
 //-------------------------------------------------------------------------
 public virtual void test_contains()
 {
     assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUN_15), false);
     assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUN_16), true);
     assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUL_05), true);
     assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUL_17), true);
     assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUL_18), false);
 }
        public virtual void test_isRegular_null()
        {
            SchedulePeriod test = SchedulePeriod.of(JUN_16, JUL_18);

            assertThrowsIllegalArg(() => test.isRegular(null, DAY_18));
            assertThrowsIllegalArg(() => test.isRegular(P1M, null));
            assertThrowsIllegalArg(() => test.isRegular(null, null));
        }
 //-------------------------------------------------------------------------
 public virtual void test_of_null()
 {
     assertThrowsIllegalArg(() => SchedulePeriod.of(null, JUL_18, JUL_04, JUL_17));
     assertThrowsIllegalArg(() => SchedulePeriod.of(JUL_05, null, JUL_04, JUL_17));
     assertThrowsIllegalArg(() => SchedulePeriod.of(JUL_05, JUL_18, null, JUL_17));
     assertThrowsIllegalArg(() => SchedulePeriod.of(JUL_05, JUL_18, JUL_04, null));
     assertThrowsIllegalArg(() => SchedulePeriod.of(null, null, null, null));
 }
        public virtual void test_subSchedule_3monthIn3Month()
        {
            SchedulePeriod test     = SchedulePeriod.of(JUN_17, SEP_17);
            Schedule       schedule = test.subSchedule(P3M, RollConventions.DAY_17, StubConvention.NONE, BusinessDayAdjustment.NONE).createSchedule(REF_DATA);

            assertEquals(schedule.size(), 1);
            assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, SEP_17));
        }
        public virtual void test_of_noUnadjusted()
        {
            SchedulePeriod test = SchedulePeriod.of(JUL_05, JUL_18);

            assertEquals(test.StartDate, JUL_05);
            assertEquals(test.EndDate, JUL_18);
            assertEquals(test.UnadjustedStartDate, JUL_05);
            assertEquals(test.UnadjustedEndDate, JUL_18);
        }
        public virtual void test_yearFraction_null()
        {
            SchedulePeriod test     = SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17);
            Schedule       schedule = Schedule.ofTerm(test);

            assertThrowsIllegalArg(() => test.yearFraction(null, schedule));
            assertThrowsIllegalArg(() => test.yearFraction(DayCounts.ACT_360, null));
            assertThrowsIllegalArg(() => test.yearFraction(null, null));
        }
        public virtual void test_builder_defaults()
        {
            SchedulePeriod test = SchedulePeriod.builder().startDate(JUL_05).endDate(JUL_18).build();

            assertEquals(test.StartDate, JUL_05);
            assertEquals(test.EndDate, JUL_18);
            assertEquals(test.UnadjustedStartDate, JUL_05);
            assertEquals(test.UnadjustedEndDate, JUL_18);
        }
Ejemplo n.º 10
0
        //-------------------------------------------------------------------------
        public virtual void test_toAdjusted()
        {
            SchedulePeriod period1 = SchedulePeriod.of(JUN_15, SEP_17);
            SchedulePeriod period2 = SchedulePeriod.of(SEP_17, SEP_30);
            Schedule       test    = Schedule.builder().periods(period1, period2).frequency(P3M).rollConvention(DAY_17).build();

            assertEquals(test.toAdjusted(date => date), test);
            assertEquals(test.toAdjusted(date => date.Equals(JUN_15) ? JUN_16 : date), Schedule.builder().periods(SchedulePeriod.of(JUN_16, SEP_17, JUN_15, SEP_17), period2).frequency(P3M).rollConvention(DAY_17).build());
        }
Ejemplo n.º 11
0
        public virtual void test_toUnadjusted()
        {
            SchedulePeriod a        = SchedulePeriod.of(JUL_17, OCT_17, JUL_16, OCT_15);
            SchedulePeriod b        = SchedulePeriod.of(JUL_16, OCT_15, JUL_16, OCT_15);
            Schedule       test     = Schedule.builder().periods(ImmutableList.of(a)).frequency(P1M).rollConvention(DAY_17).build().toUnadjusted();
            Schedule       expected = Schedule.builder().periods(ImmutableList.of(b)).frequency(P1M).rollConvention(DAY_17).build();

            assertEquals(test, expected);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Merges this schedule to form a new schedule by combining the schedule periods.
        /// <para>
        /// This produces a schedule where some periods are merged together.
        /// For example, this could be used to convert a 3 monthly schedule into a 6 monthly schedule.
        /// </para>
        /// <para>
        /// The merging is controlled by the group size, which defines the number of periods
        /// to merge together in the result. For example, to convert a 3 monthly schedule into
        /// a 6 monthly schedule the group size would be 2 (6 divided by 3).
        /// </para>
        /// <para>
        /// A group size of zero or less will throw an exception.
        /// A group size of 1 will return this schedule providing that the specified start and end date match.
        /// A larger group size will return a schedule where each group of regular periods are merged.
        /// </para>
        /// <para>
        /// The specified dates must be one of the dates of this schedule (unadjusted or adjusted).
        /// All periods of this schedule before the first regular start date, if any, will form a single period in the result.
        /// All periods of this schedule after the last regular start date, if any, will form a single period in the result.
        /// If this schedule has an initial or final stub, it may be merged with a regular period as part of the process.
        /// </para>
        /// <para>
        /// For example, a schedule with an initial stub and 5 regular periods can be grouped by 2 if the
        /// specified {@code firstRegularStartDate} equals the end of the first regular period.
        ///
        /// </para>
        /// </summary>
        /// <param name="groupSize">  the group size </param>
        /// <param name="firstRegularStartDate">  the unadjusted start date of the first regular payment period </param>
        /// <param name="lastRegularEndDate">  the unadjusted end date of the last regular payment period </param>
        /// <returns> the merged schedule </returns>
        /// <exception cref="IllegalArgumentException"> if the group size is zero or less </exception>
        /// <exception cref="ScheduleException"> if the merged schedule cannot be created because the dates don't
        ///   match this schedule or the regular periods don't match the grouping size </exception>
        public Schedule merge(int groupSize, LocalDate firstRegularStartDate, LocalDate lastRegularEndDate)
        {
            ArgChecker.notNegativeOrZero(groupSize, "groupSize");
            ArgChecker.inOrderOrEqual(firstRegularStartDate, lastRegularEndDate, "firstRegularStartDate", "lastRegularEndDate");
            if (SinglePeriod || groupSize == 1)
            {
                return(this);
            }
            // determine stubs and regular
            int startRegularIndex = -1;
            int endRegularIndex   = -1;

            for (int i = 0; i < size(); i++)
            {
                SchedulePeriod period = periods.get(i);
                if (period.UnadjustedStartDate.Equals(firstRegularStartDate) || period.StartDate.Equals(firstRegularStartDate))
                {
                    startRegularIndex = i;
                }
                if (period.UnadjustedEndDate.Equals(lastRegularEndDate) || period.EndDate.Equals(lastRegularEndDate))
                {
                    endRegularIndex = i + 1;
                }
            }
            if (startRegularIndex < 0)
            {
                throw new ScheduleException("Unable to merge schedule, firstRegularStartDate {} does not match any date in the underlying schedule {}", firstRegularStartDate, UnadjustedDates);
            }
            if (endRegularIndex < 0)
            {
                throw new ScheduleException("Unable to merge schedule, lastRegularEndDate {} does not match any date in the underlying schedule {}", lastRegularEndDate, UnadjustedDates);
            }
            int numberRegular = endRegularIndex - startRegularIndex;

            if ((numberRegular % groupSize) != 0)
            {
                Period newFrequency = frequency.Period.multipliedBy(groupSize);
                throw new ScheduleException("Unable to merge schedule, firstRegularStartDate {} and lastRegularEndDate {} cannot be used to " + "create regular periods of frequency '{}'", firstRegularStartDate, lastRegularEndDate, newFrequency);
            }
            IList <SchedulePeriod> newSchedule = new List <SchedulePeriod>();

            if (startRegularIndex > 0)
            {
                newSchedule.Add(createSchedulePeriod(periods.subList(0, startRegularIndex)));
            }
            for (int i = startRegularIndex; i < endRegularIndex; i += groupSize)
            {
                newSchedule.Add(createSchedulePeriod(periods.subList(i, i + groupSize)));
            }
            if (endRegularIndex < periods.size())
            {
                newSchedule.Add(createSchedulePeriod(periods.subList(endRegularIndex, periods.size())));
            }
            // build schedule
            return(Schedule.builder().periods(newSchedule).frequency(Frequency.of(frequency.Period.multipliedBy(groupSize))).rollConvention(rollConvention).build());
        }
        //-------------------------------------------------------------------------
        public virtual void test_toAdjusted()
        {
            SchedulePeriod test1 = SchedulePeriod.of(JUN_15, SEP_17);

            assertEquals(test1.toAdjusted(date => date), test1);
            assertEquals(test1.toAdjusted(date => date.Equals(JUN_15) ? JUN_16 : date), SchedulePeriod.of(JUN_16, SEP_17, JUN_15, SEP_17));
            SchedulePeriod test2 = SchedulePeriod.of(JUN_16, AUG_17);

            assertEquals(test2.toAdjusted(date => date.Equals(AUG_17) ? AUG_18 : date), SchedulePeriod.of(JUN_16, AUG_18, JUN_16, AUG_17));
        }
        public virtual void test_subSchedule_2monthIn3Month_shortFinal()
        {
            SchedulePeriod test     = SchedulePeriod.of(JUN_17, SEP_17);
            Schedule       schedule = test.subSchedule(P2M, RollConventions.DAY_17, StubConvention.SHORT_FINAL, BusinessDayAdjustment.NONE).createSchedule(REF_DATA);

            assertEquals(schedule.size(), 2);
            assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, AUG_17));
            assertEquals(schedule.getPeriod(1), SchedulePeriod.of(AUG_17, SEP_17));
            assertEquals(schedule.Frequency, P2M);
            assertEquals(schedule.RollConvention, RollConventions.DAY_17);
        }
Ejemplo n.º 15
0
        //-------------------------------------------------------------------------
        /// <summary>
        /// Merges this schedule to form a new schedule with a single 'Term' period.
        /// <para>
        /// The result will have one period of type 'Term', with dates matching this schedule.
        ///
        /// </para>
        /// </summary>
        /// <returns> the merged 'Term' schedule </returns>
        public Schedule mergeToTerm()
        {
            if (Term)
            {
                return(this);
            }
            SchedulePeriod first = FirstPeriod;
            SchedulePeriod last  = LastPeriod;

            return(Schedule.ofTerm(SchedulePeriod.of(first.StartDate, last.EndDate, first.UnadjustedStartDate, last.UnadjustedEndDate)));
        }
        //-------------------------------------------------------------------------
        public virtual void test_subSchedule_1monthIn3Month()
        {
            SchedulePeriod test     = SchedulePeriod.of(JUN_17, SEP_17);
            Schedule       schedule = test.subSchedule(P1M, RollConventions.DAY_17, StubConvention.NONE, BusinessDayAdjustment.NONE).createSchedule(REF_DATA);

            assertEquals(schedule.size(), 3);
            assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, JUL_17));
            assertEquals(schedule.getPeriod(1), SchedulePeriod.of(JUL_17, AUG_17));
            assertEquals(schedule.getPeriod(2), SchedulePeriod.of(AUG_17, SEP_17));
            assertEquals(schedule.Frequency, P1M);
            assertEquals(schedule.RollConvention, RollConventions.DAY_17);
        }
Ejemplo n.º 17
0
        // creates a schedule period
        private SchedulePeriod createSchedulePeriod(IList <SchedulePeriod> accruals)
        {
            SchedulePeriod first = accruals[0];

            if (accruals.Count == 1)
            {
                return(first);
            }
            SchedulePeriod last = accruals[accruals.Count - 1];

            return(SchedulePeriod.of(first.StartDate, last.EndDate, first.UnadjustedStartDate, last.UnadjustedEndDate));
        }
Ejemplo n.º 18
0
        //-------------------------------------------------------------------------
        /// <summary>
        /// Converts this schedule to a schedule where all the start and end dates are
        /// adjusted using the specified adjuster.
        /// <para>
        /// The result will have the same number of periods, but each start date and
        /// end date is replaced by the adjusted date as returned by the adjuster.
        /// The unadjusted start date and unadjusted end date of each period will not be changed.
        ///
        /// </para>
        /// </summary>
        /// <param name="adjuster">  the adjuster to use </param>
        /// <returns> the adjusted schedule </returns>
        public Schedule toAdjusted(DateAdjuster adjuster)
        {
            // implementation needs to return 'this' if unchanged to optimize downstream code
            bool adjusted = false;

            ImmutableList.Builder <SchedulePeriod> builder = ImmutableList.builder();
            foreach (SchedulePeriod period in periods)
            {
                SchedulePeriod adjPeriod = period.toAdjusted(adjuster);
                builder.add(adjPeriod);
                adjusted |= (adjPeriod != period);
            }
            return(adjusted ? new Schedule(builder.build(), frequency, rollConvention) : this);
        }
        //-------------------------------------------------------------------------
        public virtual void coverage_equals()
        {
            SchedulePeriod a1 = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17);
            SchedulePeriod a2 = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17);
            SchedulePeriod b  = SchedulePeriod.of(JUL_04, JUL_18, JUL_04, JUL_17);
            SchedulePeriod c  = SchedulePeriod.of(JUL_05, JUL_17, JUL_04, JUL_17);
            SchedulePeriod d  = SchedulePeriod.of(JUL_05, JUL_18, JUL_05, JUL_17);
            SchedulePeriod e  = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_18);

            assertEquals(a1.Equals(a1), true);
            assertEquals(a1.Equals(a2), true);
            assertEquals(a1.Equals(b), false);
            assertEquals(a1.Equals(c), false);
            assertEquals(a1.Equals(d), false);
            assertEquals(a1.Equals(e), false);
        }
        //-------------------------------------------------------------------------
        public virtual void test_compareTo()
        {
            SchedulePeriod a = SchedulePeriod.of(JUL_05, JUL_18);
            SchedulePeriod b = SchedulePeriod.of(JUL_04, JUL_18);
            SchedulePeriod c = SchedulePeriod.of(JUL_05, JUL_17);

            assertEquals(a.CompareTo(a) == 0, true);
            assertEquals(a.CompareTo(b) > 0, true);
            assertEquals(a.CompareTo(c) > 0, true);

            assertEquals(b.CompareTo(a) < 0, true);
            assertEquals(b.CompareTo(b) == 0, true);
            assertEquals(b.CompareTo(c) < 0, true);

            assertEquals(c.CompareTo(a) < 0, true);
            assertEquals(c.CompareTo(b) > 0, true);
            assertEquals(c.CompareTo(c) == 0, true);
        }
Ejemplo n.º 21
0
 //-------------------------------------------------------------------------
 /// <summary>
 /// Obtains a 'Term' instance based on a single period.
 /// <para>
 /// A 'Term' schedule has one period with a frequency of 'Term'.
 ///
 /// </para>
 /// </summary>
 /// <param name="period">  the single period </param>
 /// <returns> the merged 'Term' schedule </returns>
 public static Schedule ofTerm(SchedulePeriod period)
 {
     ArgChecker.notNull(period, "period");
     return(Schedule.builder().periods(ImmutableList.of(period)).frequency(Frequency.TERM).rollConvention(RollConventions.NONE).build());
 }
 //-------------------------------------------------------------------------
 public virtual void test_length()
 {
     assertEquals(SchedulePeriod.of(JUN_16, JUN_18, JUN_16, JUN_18).length(), Period.between(JUN_16, JUN_18));
     assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).length(), Period.between(JUN_16, JUL_18));
 }
 //-------------------------------------------------------------------------
 public virtual void test_lengthInDays()
 {
     assertEquals(SchedulePeriod.of(JUN_16, JUN_18, JUN_16, JUN_18).lengthInDays(), 2);
     assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).lengthInDays(), 32);
 }
        public virtual void test_serialization()
        {
            SchedulePeriod test = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17);

            assertSerialization(test);
        }
        //-------------------------------------------------------------------------
        public virtual void coverage()
        {
            SchedulePeriod test = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17);

            coverImmutableBean(test);
        }
 //-------------------------------------------------------------------------
 public virtual void coverage_builder()
 {
     SchedulePeriod.Builder builder = SchedulePeriod.builder();
     builder.startDate(JUL_05).endDate(JUL_18).unadjustedStartDate(JUL_04).unadjustedEndDate(JUL_17).build();
 }
 public virtual void test_toUnadjusted()
 {
     assertEquals(SchedulePeriod.of(JUN_15, SEP_17).toUnadjusted(), SchedulePeriod.of(JUN_15, SEP_17));
     assertEquals(SchedulePeriod.of(JUN_16, SEP_17, JUN_15, SEP_17).toUnadjusted(), SchedulePeriod.of(JUN_15, SEP_17));
     assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).toUnadjusted(), SchedulePeriod.of(JUN_16, JUL_17));
 }
        public virtual void test_contains_null()
        {
            SchedulePeriod test = SchedulePeriod.of(JUN_16, JUL_18);

            assertThrowsIllegalArg(() => test.contains(null));
        }