From 024183f118c760e460c8e8911be6a94d456936fd Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 1 Dec 2021 16:13:31 -0600 Subject: [PATCH] Fix monthly recurrence at end of month --- .../astrid/repeats/RepeatTaskHelper.kt | 2 +- .../astrid/repeats/RepeatMonthlyTests.kt | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt b/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt index 752d66325..bc47b08e4 100644 --- a/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt +++ b/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt @@ -125,7 +125,7 @@ class RepeatTaskHelper @Inject constructor( private fun handleMonthlyRepeat( original: DateTime, startDateAsDV: Date, hasDueTime: Boolean, recur: Recur): Long { return if (original.isLastDayOfMonth) { - val interval = recur.interval + val interval = recur.interval.coerceAtLeast(1) val newDateTime = original.plusMonths(interval) val time = newDateTime.withDayOfMonth(newDateTime.numberOfDaysInMonth).millis if (hasDueTime) { diff --git a/app/src/test/java/com/todoroo/astrid/repeats/RepeatMonthlyTests.kt b/app/src/test/java/com/todoroo/astrid/repeats/RepeatMonthlyTests.kt index c05d5a7d5..941ea9b1a 100644 --- a/app/src/test/java/com/todoroo/astrid/repeats/RepeatMonthlyTests.kt +++ b/app/src/test/java/com/todoroo/astrid/repeats/RepeatMonthlyTests.kt @@ -56,6 +56,30 @@ class RepeatMonthlyTests : RepeatTests() { assertEquals(newDayTime(2017, 2, 28, 13, 30), next) } + @Test + fun repeatMonthlyNoInterval() { + val task = newFromDue( + "FREQ=MONTHLY", + newDayTime(2017, 11, 1, 13, 30) + ) + + val next = calculateNextDueDate(task) + + assertEquals(newDayTime(2017, 12, 1, 13, 30), next) + } + + @Test + fun repeatMonthlyEndOfMonthNoInterval() { + val task = newFromDue( + "FREQ=MONTHLY", + newDayTime(2017, 11, 30, 13, 30) + ) + + val next = calculateNextDueDate(task) + + assertEquals(newDayTime(2017, 12, 31, 13, 30), next) + } + /* https://tools.ietf.org/html/rfc5545#section-3.3.10 * Recurrence rules may generate recurrence instances with an invalid * date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM