Use ical4j in recurrence tests

pull/1348/head
Alex Baker 5 years ago
parent d695c8e9e6
commit 5e128fd6de

@ -1,6 +1,5 @@
package com.todoroo.astrid.repeats package com.todoroo.astrid.repeats
import com.google.ical.values.RRule
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
@ -12,7 +11,7 @@ import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule import org.tasks.injection.ProductionModule
import org.tasks.makers.TaskMaker.COMPLETION_TIME import org.tasks.makers.TaskMaker.COMPLETION_TIME
import org.tasks.makers.TaskMaker.PARENT import org.tasks.makers.TaskMaker.PARENT
import org.tasks.makers.TaskMaker.RRULE import org.tasks.makers.TaskMaker.RECUR
import org.tasks.makers.TaskMaker.newTask import org.tasks.makers.TaskMaker.newTask
import org.tasks.time.DateTime import org.tasks.time.DateTime
import javax.inject.Inject import javax.inject.Inject
@ -25,7 +24,7 @@ class RepeatWithSubtasksTests : InjectingTestCase() {
@Test @Test
fun uncompleteGrandchildren() = runBlocking { fun uncompleteGrandchildren() = runBlocking {
val grandparent = taskDao.createNew(newTask(with(RRULE, RRule("RRULE:FREQ=DAILY")))) val grandparent = taskDao.createNew(newTask(with(RECUR, "RRULE:FREQ=DAILY")))
val parent = taskDao.createNew(newTask(with(PARENT, grandparent))) val parent = taskDao.createNew(newTask(with(PARENT, grandparent)))
val child = taskDao.createNew(newTask( val child = taskDao.createNew(newTask(
with(PARENT, parent), with(PARENT, parent),
@ -39,7 +38,7 @@ class RepeatWithSubtasksTests : InjectingTestCase() {
@Test @Test
fun uncompleteGoogleTaskChildren() = runBlocking { fun uncompleteGoogleTaskChildren() = runBlocking {
val parent = taskDao.createNew(newTask(with(RRULE, RRule("RRULE:FREQ=DAILY")))) val parent = taskDao.createNew(newTask(with(RECUR, "RRULE:FREQ=DAILY")))
val child = taskDao.createNew(newTask( val child = taskDao.createNew(newTask(
with(PARENT, parent), with(PARENT, parent),
with(COMPLETION_TIME, DateTime()) with(COMPLETION_TIME, DateTime())

@ -1,6 +1,5 @@
package com.todoroo.astrid.service package com.todoroo.astrid.service
import com.google.ical.values.RRule
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import com.todoroo.astrid.core.BuiltInFilterExposer.Companion.getMyTasksFilter import com.todoroo.astrid.core.BuiltInFilterExposer.Companion.getMyTasksFilter
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
@ -18,7 +17,7 @@ import org.tasks.makers.GoogleTaskMaker.TASK
import org.tasks.makers.GoogleTaskMaker.newGoogleTask import org.tasks.makers.GoogleTaskMaker.newGoogleTask
import org.tasks.makers.TaskMaker.COMPLETION_TIME import org.tasks.makers.TaskMaker.COMPLETION_TIME
import org.tasks.makers.TaskMaker.PARENT import org.tasks.makers.TaskMaker.PARENT
import org.tasks.makers.TaskMaker.RRULE import org.tasks.makers.TaskMaker.RECUR
import org.tasks.makers.TaskMaker.newTask import org.tasks.makers.TaskMaker.newTask
import org.tasks.time.DateTime import org.tasks.time.DateTime
import javax.inject.Inject import javax.inject.Inject
@ -41,7 +40,7 @@ class TaskDeleterTest : InjectingTestCase() {
@Test @Test
fun dontDeleteTaskWithRecurringParent() = runBlocking { fun dontDeleteTaskWithRecurringParent() = runBlocking {
val parent = taskDao.createNew(newTask(with(RRULE, RRule("RRULE:FREQ=DAILY;INTERVAL=1")))) val parent = taskDao.createNew(newTask(with(RECUR, "RRULE:FREQ=DAILY;INTERVAL=1")))
val child = taskDao.createNew(newTask( val child = taskDao.createNew(newTask(
with(PARENT, parent), with(PARENT, parent),
with(COMPLETION_TIME, DateTime()) with(COMPLETION_TIME, DateTime())
@ -54,7 +53,7 @@ class TaskDeleterTest : InjectingTestCase() {
@Test @Test
fun dontDeleteTaskWithRecurringGrandparent() = runBlocking { fun dontDeleteTaskWithRecurringGrandparent() = runBlocking {
val grandparent = taskDao.createNew(newTask(with(RRULE, RRule("RRULE:FREQ=DAILY;INTERVAL=1")))) val grandparent = taskDao.createNew(newTask(with(RECUR, "RRULE:FREQ=DAILY;INTERVAL=1")))
val parent = taskDao.createNew(newTask(with(PARENT, grandparent))) val parent = taskDao.createNew(newTask(with(PARENT, grandparent)))
val child = taskDao.createNew(newTask( val child = taskDao.createNew(newTask(
with(PARENT, parent), with(PARENT, parent),
@ -83,7 +82,7 @@ class TaskDeleterTest : InjectingTestCase() {
@Test @Test
fun clearGrandchildWithCompletedRecurringAncestor() = runBlocking { fun clearGrandchildWithCompletedRecurringAncestor() = runBlocking {
val grandparent = taskDao.createNew(newTask( val grandparent = taskDao.createNew(newTask(
with(RRULE, RRule("RRULE:FREQ=DAILY;INTERVAL=1")), with(RECUR, "RRULE:FREQ=DAILY;INTERVAL=1"),
with(COMPLETION_TIME, DateTime()) with(COMPLETION_TIME, DateTime())
)) ))
val parent = taskDao.createNew(newTask(with(PARENT, grandparent))) val parent = taskDao.createNew(newTask(with(PARENT, grandparent)))
@ -99,7 +98,7 @@ class TaskDeleterTest : InjectingTestCase() {
@Test @Test
fun dontClearCompletedGoogleTaskWithRecurringParent() = runBlocking { fun dontClearCompletedGoogleTaskWithRecurringParent() = runBlocking {
val parent = taskDao.createNew(newTask(with(RRULE, RRule("RRULE:FREQ=DAILY;INTERVAL=1")))) val parent = taskDao.createNew(newTask(with(RECUR, "RRULE:FREQ=DAILY;INTERVAL=1")))
val child = taskDao.createNew(newTask(with(COMPLETION_TIME, DateTime()))) val child = taskDao.createNew(newTask(with(COMPLETION_TIME, DateTime())))
googleTaskDao.insert(newGoogleTask(with(TASK, child), with(GoogleTaskMaker.PARENT, parent))) googleTaskDao.insert(newGoogleTask(with(TASK, child), with(GoogleTaskMaker.PARENT, parent)))
@ -122,7 +121,7 @@ class TaskDeleterTest : InjectingTestCase() {
@Test @Test
fun clearCompletedGoogleTaskWithCompletedRecurringParent() = runBlocking { fun clearCompletedGoogleTaskWithCompletedRecurringParent() = runBlocking {
val parent = taskDao.createNew(newTask( val parent = taskDao.createNew(newTask(
with(RRULE, RRule("RRULE:FREQ=DAILY;INTERVAL=1")), with(RECUR, "RRULE:FREQ=DAILY;INTERVAL=1"),
with(COMPLETION_TIME, DateTime()) with(COMPLETION_TIME, DateTime())
)) ))
val child = taskDao.createNew(newTask(with(COMPLETION_TIME, DateTime()))) val child = taskDao.createNew(newTask(with(COMPLETION_TIME, DateTime())))

@ -5,13 +5,12 @@
*/ */
package com.todoroo.astrid.service package com.todoroo.astrid.service
import com.google.ical.values.Frequency
import com.google.ical.values.RRule
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import com.todoroo.astrid.utility.TitleParser import com.todoroo.astrid.utility.TitleParser
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import net.fortuna.ical4j.model.Recur.Frequency.*
import org.junit.Assert.* import org.junit.Assert.*
import org.junit.Before import org.junit.Before
import org.junit.Ignore import org.junit.Ignore
@ -22,6 +21,7 @@ import org.tasks.date.DateTimeUtils
import org.tasks.injection.InjectingTestCase import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule import org.tasks.injection.ProductionModule
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.repeats.RecurrenceUtils.newRecur
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@ -280,22 +280,22 @@ class TitleParserTest : InjectingTestCase() {
fun testDailyWithNoDueDate() = runBlocking { fun testDailyWithNoDueDate() = runBlocking {
var title = "Jog daily" var title = "Jog daily"
var task = taskCreator.createWithValues(title) var task = taskCreator.createWithValues(title)
val rrule = RRule() val recur = newRecur()
rrule.freq = Frequency.DAILY recur.setFrequency(DAILY.name)
rrule.interval = 1 recur.interval = 1
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
title = "Jog every day" title = "Jog every day"
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
for (i in 1..12) { for (i in 1..12) {
title = "Jog every $i days." title = "Jog every $i days."
rrule.interval = i recur.interval = i
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
} }
@ -306,22 +306,22 @@ class TitleParserTest : InjectingTestCase() {
fun testWeeklyWithNoDueDate() = runBlocking { fun testWeeklyWithNoDueDate() = runBlocking {
var title = "Jog weekly" var title = "Jog weekly"
var task = taskCreator.createWithValues(title) var task = taskCreator.createWithValues(title)
val rrule = RRule() val recur = newRecur()
rrule.freq = Frequency.WEEKLY recur.setFrequency(WEEKLY.name)
rrule.interval = 1 recur.interval = 1
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
title = "Jog every week" title = "Jog every week"
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
for (i in 1..12) { for (i in 1..12) {
title = "Jog every $i weeks" title = "Jog every $i weeks"
rrule.interval = i recur.interval = i
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
} }
@ -332,22 +332,22 @@ class TitleParserTest : InjectingTestCase() {
fun testMonthlyFromNoDueDate() = runBlocking { fun testMonthlyFromNoDueDate() = runBlocking {
var title = "Jog monthly" var title = "Jog monthly"
var task = taskCreator.createWithValues(title) var task = taskCreator.createWithValues(title)
val rrule = RRule() val recur = newRecur()
rrule.freq = Frequency.MONTHLY recur.setFrequency(MONTHLY.name)
rrule.interval = 1 recur.interval = 1
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
title = "Jog every month" title = "Jog every month"
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
for (i in 1..12) { for (i in 1..12) {
title = "Jog every $i months" title = "Jog every $i months"
rrule.interval = i recur.interval = i
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertFalse(task.hasDueTime()) assertFalse(task.hasDueTime())
assertFalse(task.hasDueDate()) assertFalse(task.hasDueDate())
} }
@ -357,20 +357,20 @@ class TitleParserTest : InjectingTestCase() {
fun testDailyFromDueDate() = runBlocking { fun testDailyFromDueDate() = runBlocking {
var title = "Jog daily starting from today" var title = "Jog daily starting from today"
var task = taskCreator.createWithValues(title) var task = taskCreator.createWithValues(title)
val rrule = RRule() val recur = newRecur()
rrule.freq = Frequency.DAILY recur.setFrequency(DAILY.name)
rrule.interval = 1 recur.interval = 1
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertTrue(task.hasDueDate()) assertTrue(task.hasDueDate())
title = "Jog every day starting from today" title = "Jog every day starting from today"
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertTrue(task.hasDueDate()) assertTrue(task.hasDueDate())
for (i in 1..12) { for (i in 1..12) {
title = "Jog every $i days starting from today" title = "Jog every $i days starting from today"
rrule.interval = i recur.interval = i
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertTrue(task.hasDueDate()) assertTrue(task.hasDueDate())
} }
} }
@ -379,20 +379,20 @@ class TitleParserTest : InjectingTestCase() {
fun testWeeklyFromDueDate() = runBlocking { fun testWeeklyFromDueDate() = runBlocking {
var title = "Jog weekly starting from today" var title = "Jog weekly starting from today"
var task = taskCreator.createWithValues(title) var task = taskCreator.createWithValues(title)
val rrule = RRule() val recur = newRecur()
rrule.freq = Frequency.WEEKLY recur.setFrequency(WEEKLY.name)
rrule.interval = 1 recur.interval = 1
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertTrue(task.hasDueDate()) assertTrue(task.hasDueDate())
title = "Jog every week starting from today" title = "Jog every week starting from today"
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertTrue(task.hasDueDate()) assertTrue(task.hasDueDate())
for (i in 1..12) { for (i in 1..12) {
title = "Jog every $i weeks starting from today" title = "Jog every $i weeks starting from today"
rrule.interval = i recur.interval = i
task = taskCreator.createWithValues(title) task = taskCreator.createWithValues(title)
assertEquals(task.recurrence, rrule.toIcal()) assertEquals(task.recurrence, "RRULE:$recur")
assertTrue(task.hasDueDate()) assertTrue(task.hasDueDate())
} }
} }

@ -1,6 +1,5 @@
package org.tasks.opentasks package org.tasks.opentasks
import com.google.ical.values.RRule
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
@ -16,7 +15,7 @@ import org.tasks.makers.CaldavTaskMaker.CALENDAR
import org.tasks.makers.CaldavTaskMaker.REMOTE_ID import org.tasks.makers.CaldavTaskMaker.REMOTE_ID
import org.tasks.makers.CaldavTaskMaker.TASK import org.tasks.makers.CaldavTaskMaker.TASK
import org.tasks.makers.CaldavTaskMaker.newCaldavTask import org.tasks.makers.CaldavTaskMaker.newCaldavTask
import org.tasks.makers.TaskMaker.RRULE import org.tasks.makers.TaskMaker.RECUR
import org.tasks.makers.TaskMaker.newTask import org.tasks.makers.TaskMaker.newTask
@UninstallModules(ProductionModule::class) @UninstallModules(ProductionModule::class)
@ -107,7 +106,7 @@ class OpenTasksSynchronizerTest : OpenTasksTest() {
@Test @Test
fun sanitizeRecurrenceRule() = runBlocking { fun sanitizeRecurrenceRule() = runBlocking {
val (_, list) = openTaskDao.insertList() val (_, list) = openTaskDao.insertList()
val taskId = taskDao.insert(newTask(with(RRULE, RRule("RRULE:FREQ=WEEKLY;COUNT=-1")))) val taskId = taskDao.insert(newTask(with(RECUR, "RRULE:FREQ=WEEKLY;COUNT=-1")))
caldavDao.insert(newCaldavTask( caldavDao.insert(newCaldavTask(
with(CALENDAR, list.uuid), with(CALENDAR, list.uuid),
with(TASK, taskId) with(TASK, taskId)

@ -1,9 +1,7 @@
package org.tasks.repeats package org.tasks.repeats
import com.todoroo.astrid.data.Task.Companion.withoutRRULE
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
import net.fortuna.ical4j.model.property.RRule
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import org.tasks.TestUtilities.withTZ import org.tasks.TestUtilities.withTZ
@ -110,15 +108,15 @@ class RepeatRuleToStringTest : InjectingTestCase() {
} }
} }
private fun toString(rrule: String): String { private fun toString(rrule: String): String? {
return toString(null, rrule) return toString(null, rrule)
} }
private fun toString(language: String?, rrule: String): String { private fun toString(language: String?, rrule: String): String? {
return try { return try {
val locale = Locale(java.util.Locale.getDefault(), language) val locale = Locale(java.util.Locale.getDefault(), language)
RepeatRuleToString(locale.createConfigurationContext(context), locale, firebase) RepeatRuleToString(locale.createConfigurationContext(context), locale, firebase)
.toString(RRule(rrule.withoutRRULE())) .toString(rrule)
} catch (e: ParseException) { } catch (e: ParseException) {
throw RuntimeException(e) throw RuntimeException(e)
} }

@ -1,6 +1,5 @@
package org.tasks.ui.editviewmodel package org.tasks.ui.editviewmodel
import com.google.ical.values.RRule
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
@ -16,7 +15,7 @@ import org.tasks.makers.TaskMaker.newTask
class RepeatTests : BaseTaskEditViewModelTest() { class RepeatTests : BaseTaskEditViewModelTest() {
@Test @Test
fun changeRepeatAfterCompletion() = runBlocking { fun changeRepeatAfterCompletion() = runBlocking {
val task = newTask(with(TaskMaker.RRULE, RRule("RRULE:FREQ=DAILY;INTERVAL=1"))) val task = newTask(with(TaskMaker.RECUR, "RRULE:FREQ=DAILY;INTERVAL=1"))
setup(task) setup(task)
viewModel.repeatAfterCompletion = true viewModel.repeatAfterCompletion = true

@ -26,7 +26,7 @@ object TaskMaker {
val COMPLETION_TIME: Property<Task, DateTime> = newProperty() val COMPLETION_TIME: Property<Task, DateTime> = newProperty()
val DELETION_TIME: Property<Task, DateTime?> = newProperty() val DELETION_TIME: Property<Task, DateTime?> = newProperty()
val SNOOZE_TIME: Property<Task, DateTime?> = newProperty() val SNOOZE_TIME: Property<Task, DateTime?> = newProperty()
val RRULE: Property<Task, RRule?> = newProperty() val RECUR: Property<Task, String?> = newProperty()
val AFTER_COMPLETE: Property<Task, Boolean> = newProperty() val AFTER_COMPLETE: Property<Task, Boolean> = newProperty()
val TITLE: Property<Task, String?> = newProperty() val TITLE: Property<Task, String?> = newProperty()
val PRIORITY: Property<Task, Int> = newProperty() val PRIORITY: Property<Task, Int> = newProperty()
@ -83,9 +83,9 @@ object TaskMaker {
if (randomReminderPeriod > 0) { if (randomReminderPeriod > 0) {
task.reminderPeriod = randomReminderPeriod task.reminderPeriod = randomReminderPeriod
} }
val rrule = lookup.valueOf(RRULE, null as RRule?) lookup.valueOf(RECUR, null as String?)?.let {
if (rrule != null) { val rrule = if (it.startsWith("RRULE:")) it else "RRULE:$it"
task.setRecurrence(rrule, lookup.valueOf(AFTER_COMPLETE, false)) task.setRecurrence(RRule(rrule), lookup.valueOf(AFTER_COMPLETE, false))
} }
task.uuid = lookup.valueOf(UUID, NO_UUID) task.uuid = lookup.valueOf(UUID, NO_UUID)
val creationTime = lookup.valueOf(CREATION_TIME, DateTimeUtils.newDateTime()) val creationTime = lookup.valueOf(CREATION_TIME, DateTimeUtils.newDateTime())

@ -12,6 +12,7 @@ import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.createDueDate import com.todoroo.astrid.data.Task.Companion.createDueDate
import com.todoroo.astrid.data.Task.Companion.withoutFrom
import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.gcal.GCalHelper
import com.todoroo.astrid.service.TaskCompleter import com.todoroo.astrid.service.TaskCompleter
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
@ -38,7 +39,7 @@ class RepeatTaskHelper @Inject constructor(
val newDueDate: Long val newDueDate: Long
val rrule: RRule val rrule: RRule
try { try {
rrule = initRRule(task.getRecurrenceWithoutFrom()) rrule = initRRule(task.recurrence)
newDueDate = computeNextDueDate(task, recurrence, repeatAfterCompletion) newDueDate = computeNextDueDate(task, recurrence, repeatAfterCompletion)
if (newDueDate == -1L) { if (newDueDate == -1L) {
return return
@ -196,7 +197,9 @@ class RepeatTaskHelper @Inject constructor(
/** Initialize RRule instance */ /** Initialize RRule instance */
@Throws(ParseException::class) @Throws(ParseException::class)
private fun initRRule(recurrence: String?): RRule { private fun initRRule(recurrence: String?): RRule {
val rrule = RRule(recurrence) val rrule = RRule(recurrence
?.let { if (it.startsWith("RRULE:")) it else "RRULE:$it" }
?.withoutFrom())
if (rrule.count < 0) { if (rrule.count < 0) {
rrule.count = 0 rrule.count = 0

@ -0,0 +1,19 @@
package org.tasks.repeats
import com.todoroo.astrid.data.Task.Companion.withoutFrom
import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.property.RRule
object RecurrenceUtils {
private val LEGACY_RRULE_PREFIX = "^RRULE:".toRegex()
@JvmStatic
fun newRecur(): Recur = Recur.Builder().frequency(Recur.Frequency.DAILY).build()
@JvmStatic
fun newRecur(rrule: String): Recur = newRRule(rrule).recur
fun newRRule(rrule: String): RRule =
RRule(rrule.replace(LEGACY_RRULE_PREFIX, "").withoutFrom())
}

@ -5,16 +5,17 @@
*/ */
package com.todoroo.astrid.repeats package com.todoroo.astrid.repeats
import com.google.ical.values.Frequency
import com.google.ical.values.RRule
import com.google.ical.values.Weekday
import com.google.ical.values.WeekdayNum
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.Recur.Frequency
import net.fortuna.ical4j.model.WeekDay
import net.fortuna.ical4j.model.WeekDay.*
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.tasks.date.DateTimeUtils import org.tasks.date.DateTimeUtils
import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.printTimestamp import org.tasks.time.DateTimeUtils.printTimestamp
import java.text.ParseException import java.text.ParseException
@ -25,27 +26,27 @@ import kotlin.math.min
class AdvancedRepeatTest { class AdvancedRepeatTest {
private var task: Task? = null private var task: Task? = null
private var nextDueDate: Long = 0 private var nextDueDate: Long = 0
private var rrule: RRule? = null private var recur: Recur? = null
// --- date with time tests // --- date with time tests
@Before @Before
fun setUp() { fun setUp() {
task = Task() task = Task()
task!!.completionDate = DateUtilities.now() task!!.completionDate = DateUtilities.now()
rrule = RRule() recur = newRecur()
} }
@Test @Test
@Throws(ParseException::class) @Throws(ParseException::class)
fun testDueDateSpecificTime() { fun testDueDateSpecificTime() {
buildRRule(1, Frequency.DAILY) buildRecur(1, Frequency.DAILY)
// test specific day & time // test specific day & time
val dayWithTime = Task.createDueDate( val dayWithTime = Task.createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME, DateTime(2010, 8, 1, 10, 4, 0).millis) Task.URGENCY_SPECIFIC_DAY_TIME, DateTime(2010, 8, 1, 10, 4, 0).millis)
task!!.dueDate = dayWithTime task!!.dueDate = dayWithTime
val nextDayWithTime = dayWithTime + DateUtilities.ONE_DAY val nextDayWithTime = dayWithTime + DateUtilities.ONE_DAY
nextDueDate = RepeatTaskHelper.computeNextDueDate(task!!, rrule!!.toIcal(), false) nextDueDate = RepeatTaskHelper.computeNextDueDate(task!!, recur!!.toString(), false)
assertDateTimeEquals(nextDayWithTime, nextDueDate) assertDateTimeEquals(nextDayWithTime, nextDueDate)
} }
@ -53,7 +54,7 @@ class AdvancedRepeatTest {
@Test @Test
@Throws(ParseException::class) @Throws(ParseException::class)
fun testCompletionDateSpecificTime() { fun testCompletionDateSpecificTime() {
buildRRule(1, Frequency.DAILY) buildRecur(1, Frequency.DAILY)
// test specific day & time // test specific day & time
val dayWithTime = Task.createDueDate( val dayWithTime = Task.createDueDate(
@ -63,7 +64,7 @@ class AdvancedRepeatTest {
var nextDayWithTimeLong = todayWithTime.millis var nextDayWithTimeLong = todayWithTime.millis
nextDayWithTimeLong += DateUtilities.ONE_DAY nextDayWithTimeLong += DateUtilities.ONE_DAY
nextDayWithTimeLong = nextDayWithTimeLong / 1000L * 1000 nextDayWithTimeLong = nextDayWithTimeLong / 1000L * 1000
nextDueDate = RepeatTaskHelper.computeNextDueDate(task!!, rrule!!.toIcal(), true) nextDueDate = RepeatTaskHelper.computeNextDueDate(task!!, recur!!.toString(), true)
assertDateTimeEquals(nextDayWithTimeLong, nextDueDate) assertDateTimeEquals(nextDayWithTimeLong, nextDueDate)
} }
@ -71,7 +72,7 @@ class AdvancedRepeatTest {
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testDueDateInPastSingleWeekMultiDay() { fun testDueDateInPastSingleWeekMultiDay() {
buildRRule(1, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR) buildRecur(1, Frequency.WEEKLY, MO, WE, FR)
setTaskDueDate(THIS, Calendar.SUNDAY) setTaskDueDate(THIS, Calendar.SUNDAY)
computeNextDueDate(false) computeNextDueDate(false)
assertDueDate(nextDueDate, THIS, Calendar.MONDAY) assertDueDate(nextDueDate, THIS, Calendar.MONDAY)
@ -87,7 +88,7 @@ class AdvancedRepeatTest {
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testDueDateSingleDay() { fun testDueDateSingleDay() {
buildRRule(1, Frequency.WEEKLY, Weekday.MO) buildRecur(1, Frequency.WEEKLY, MO)
setTaskDueDate(PREV_PREV, Calendar.MONDAY) setTaskDueDate(PREV_PREV, Calendar.MONDAY)
computeNextDueDate(false) computeNextDueDate(false)
assertDueDate(nextDueDate, NEXT, Calendar.MONDAY) assertDueDate(nextDueDate, NEXT, Calendar.MONDAY)
@ -112,7 +113,7 @@ class AdvancedRepeatTest {
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testDueDateSingleWeekMultiDay() { fun testDueDateSingleWeekMultiDay() {
buildRRule(1, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR) buildRecur(1, Frequency.WEEKLY, MO, WE, FR)
setTaskDueDate(THIS, Calendar.SUNDAY) setTaskDueDate(THIS, Calendar.SUNDAY)
computeNextDueDate(false) computeNextDueDate(false)
assertDueDate(nextDueDate, THIS, Calendar.MONDAY) assertDueDate(nextDueDate, THIS, Calendar.MONDAY)
@ -128,7 +129,7 @@ class AdvancedRepeatTest {
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testDueDateMultiWeekMultiDay() { fun testDueDateMultiWeekMultiDay() {
buildRRule(2, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR) buildRecur(2, Frequency.WEEKLY, MO, WE, FR)
setTaskDueDate(THIS, Calendar.SUNDAY) setTaskDueDate(THIS, Calendar.SUNDAY)
computeNextDueDate(false) computeNextDueDate(false)
assertDueDate(nextDueDate, NEXT, Calendar.MONDAY) assertDueDate(nextDueDate, NEXT, Calendar.MONDAY)
@ -144,21 +145,21 @@ class AdvancedRepeatTest {
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testCompleteDateSingleWeek() { fun testCompleteDateSingleWeek() {
for (wday in Weekday.values()) { for (wday in weekdays) {
buildRRule(1, Frequency.WEEKLY, wday) buildRecur(1, Frequency.WEEKLY, wday)
computeNextDueDate(true) computeNextDueDate(true)
val expected = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday.javaDayNum) val expected = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, getCalendarDay(wday))
nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate) nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate)
assertEquals(expected, nextDueDate) assertEquals(expected, nextDueDate)
} }
for (wday1 in Weekday.values()) { for (wday1 in weekdays) {
for (wday2 in Weekday.values()) { for (wday2 in weekdays) {
if (wday1 == wday2) { if (wday1 == wday2) {
continue continue
} }
buildRRule(1, Frequency.WEEKLY, wday1, wday2) buildRecur(1, Frequency.WEEKLY, wday1, wday2)
val nextOne = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday1.javaDayNum) val nextOne = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, getCalendarDay(wday1))
val nextTwo = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday2.javaDayNum) val nextTwo = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, getCalendarDay(wday2))
computeNextDueDate(true) computeNextDueDate(true)
nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate) nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate)
assertEquals(min(nextOne, nextTwo), nextDueDate) assertEquals(min(nextOne, nextTwo), nextDueDate)
@ -170,21 +171,21 @@ class AdvancedRepeatTest {
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testCompleteDateMultiWeek() { fun testCompleteDateMultiWeek() {
for (wday in Weekday.values()) { for (wday in weekdays) {
buildRRule(2, Frequency.WEEKLY, wday) buildRecur(2, Frequency.WEEKLY, wday)
computeNextDueDate(true) computeNextDueDate(true)
val expected = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday.javaDayNum) val expected = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, getCalendarDay(wday))
nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate) nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate)
assertEquals(expected, nextDueDate) assertEquals(expected, nextDueDate)
} }
for (wday1 in Weekday.values()) { for (wday1 in weekdays) {
for (wday2 in Weekday.values()) { for (wday2 in weekdays) {
if (wday1 == wday2) { if (wday1 == wday2) {
continue continue
} }
buildRRule(2, Frequency.WEEKLY, wday1, wday2) buildRecur(2, Frequency.WEEKLY, wday1, wday2)
val nextOne = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday1.javaDayNum) val nextOne = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, getCalendarDay(wday1))
val nextTwo = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday2.javaDayNum) val nextTwo = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, getCalendarDay(wday2))
computeNextDueDate(true) computeNextDueDate(true)
nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate) nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate)
assertEquals(min(nextOne, nextTwo), nextDueDate) assertEquals(min(nextOne, nextTwo), nextDueDate)
@ -194,13 +195,14 @@ class AdvancedRepeatTest {
@Throws(ParseException::class) @Throws(ParseException::class)
private fun computeNextDueDate(fromComplete: Boolean) { private fun computeNextDueDate(fromComplete: Boolean) {
nextDueDate = RepeatTaskHelper.computeNextDueDate(task!!, rrule!!.toIcal(), fromComplete) nextDueDate = RepeatTaskHelper.computeNextDueDate(task!!, recur!!.toString(), fromComplete)
} }
private fun buildRRule(interval: Int, freq: Frequency, vararg weekdays: Weekday) { private fun buildRecur(interval: Int, freq: Frequency, vararg weekdays: WeekDay) {
rrule!!.interval = interval recur!!.interval = interval
rrule!!.freq = freq recur!!.setFrequency(freq.name)
setRRuleDays(rrule, *weekdays) recur!!.dayList.clear()
recur!!.dayList.addAll(weekdays)
} }
private fun assertDueDate(actual: Long, expectedWhich: Int, expectedDayOfWeek: Int) { private fun assertDueDate(actual: Long, expectedWhich: Int, expectedDayOfWeek: Int) {
@ -208,14 +210,6 @@ class AdvancedRepeatTest {
assertEquals(expected, actual) assertEquals(expected, actual)
} }
private fun setRRuleDays(rrule: RRule?, vararg weekdays: Weekday) {
val days = ArrayList<WeekdayNum>()
for (wd in weekdays) {
days.add(WeekdayNum(0, wd))
}
rrule!!.byDay = days
}
private fun setTaskDueDate(which: Int, day: Int) { private fun setTaskDueDate(which: Int, day: Int) {
val time = getDate(DateUtilities.now(), which, day) val time = getDate(DateUtilities.now(), which, day)
task!!.dueDate = time task!!.dueDate = time
@ -238,6 +232,8 @@ class AdvancedRepeatTest {
private const val THIS = 1 private const val THIS = 1
private const val NEXT = 2 private const val NEXT = 2
private val weekdays = listOf(SU, MO, TU, WE, TH, FR, SA)
fun assertDateTimeEquals(date: Long, other: Long) { fun assertDateTimeEquals(date: Long, other: Long) {
assertEquals("Expected: ${printTimestamp(date)}, Actual: ${printTimestamp(other)}", date, other) assertEquals("Expected: ${printTimestamp(date)}, Actual: ${printTimestamp(other)}", date, other)
} }

@ -1,18 +1,17 @@
package com.todoroo.astrid.repeats package com.todoroo.astrid.repeats
import com.google.ical.values.Frequency
import com.google.ical.values.RRule
import com.google.ical.values.Weekday
import com.google.ical.values.WeekdayNum
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import net.fortuna.ical4j.model.Recur.Frequency
import net.fortuna.ical4j.model.WeekDay
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import org.tasks.makers.TaskMaker.AFTER_COMPLETE import org.tasks.makers.TaskMaker.AFTER_COMPLETE
import org.tasks.makers.TaskMaker.COMPLETION_TIME import org.tasks.makers.TaskMaker.COMPLETION_TIME
import org.tasks.makers.TaskMaker.DUE_TIME import org.tasks.makers.TaskMaker.DUE_TIME
import org.tasks.makers.TaskMaker.RRULE import org.tasks.makers.TaskMaker.RECUR
import org.tasks.makers.TaskMaker.newTask import org.tasks.makers.TaskMaker.newTask
import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.time.DateTime import org.tasks.time.DateTime
import java.text.ParseException import java.text.ParseException
@ -179,7 +178,7 @@ class NewRepeatTests {
fun testAdvancedRepeatWeeklyFromDueDate() { fun testAdvancedRepeatWeeklyFromDueDate() {
val dueDateTime = newDayTime(2016, 8, 29, 0, 25) val dueDateTime = newDayTime(2016, 8, 29, 0, 25)
val task = newWeeklyFromDue( val task = newWeeklyFromDue(
1, dueDateTime, WeekdayNum(0, Weekday.MO), WeekdayNum(0, Weekday.WE)) 1, dueDateTime, WeekDay(WeekDay.MO, 0), WeekDay(WeekDay.WE, 0))
assertEquals(newDayTime(2016, 8, 31, 0, 25), calculateNextDueDate(task)) assertEquals(newDayTime(2016, 8, 31, 0, 25), calculateNextDueDate(task))
} }
@ -192,8 +191,8 @@ class NewRepeatTests {
1, 1,
dueDateTime, dueDateTime,
completionDateTime, completionDateTime,
WeekdayNum(0, Weekday.MO), WeekDay(WeekDay.MO, 0),
WeekdayNum(0, Weekday.WE)) WeekDay(WeekDay.WE, 0))
assertEquals(newDayTime(2016, 8, 29, 0, 25), calculateNextDueDate(task)) assertEquals(newDayTime(2016, 8, 29, 0, 25), calculateNextDueDate(task))
} }
@ -206,8 +205,8 @@ class NewRepeatTests {
1, 1,
dueDateTime, dueDateTime,
completionDateTime, completionDateTime,
WeekdayNum(0, Weekday.MO), WeekDay(WeekDay.MO, 0),
WeekdayNum(0, Weekday.WE)) WeekDay(WeekDay.WE, 0))
assertEquals(newDayTime(2016, 9, 5, 0, 25), calculateNextDueDate(task)) assertEquals(newDayTime(2016, 9, 5, 0, 25), calculateNextDueDate(task))
} }
@ -221,19 +220,19 @@ class NewRepeatTests {
@Throws(ParseException::class) @Throws(ParseException::class)
private fun calculateNextDueDate(task: Task): DateTime { private fun calculateNextDueDate(task: Task): DateTime {
return DateTime( return DateTime(
RepeatTaskHelper.computeNextDueDate(task, task.sanitizedRecurrence(), task.repeatAfterCompletion())) RepeatTaskHelper.computeNextDueDate(task, task.recurrence!!, task.repeatAfterCompletion()))
} }
private fun newFromDue(frequency: Frequency, interval: Int, dueDateTime: DateTime): Task { private fun newFromDue(frequency: Frequency, interval: Int, dueDateTime: DateTime): Task {
return newTask( return newTask(
with(RRULE, getRecurrenceRule(frequency, interval)), with(RECUR, getRecurrenceRule(frequency, interval)),
with(AFTER_COMPLETE, false), with(AFTER_COMPLETE, false),
with(DUE_TIME, dueDateTime)) with(DUE_TIME, dueDateTime))
} }
private fun newWeeklyFromDue(interval: Int, dueDateTime: DateTime, vararg weekdays: WeekdayNum): Task { private fun newWeeklyFromDue(interval: Int, dueDateTime: DateTime, vararg weekdays: WeekDay): Task {
return newTask( return newTask(
with(RRULE, getRecurrenceRule(Frequency.WEEKLY, interval, *weekdays)), with(RECUR, getRecurrenceRule(Frequency.WEEKLY, interval, *weekdays)),
with(AFTER_COMPLETE, false), with(AFTER_COMPLETE, false),
with(DUE_TIME, dueDateTime)) with(DUE_TIME, dueDateTime))
} }
@ -241,29 +240,29 @@ class NewRepeatTests {
private fun newFromCompleted( private fun newFromCompleted(
frequency: Frequency, interval: Int, dueDateTime: DateTime, completionDate: DateTime): Task { frequency: Frequency, interval: Int, dueDateTime: DateTime, completionDate: DateTime): Task {
return newTask( return newTask(
with(RRULE, getRecurrenceRule(frequency, interval)), with(RECUR, getRecurrenceRule(frequency, interval)),
with(AFTER_COMPLETE, true), with(AFTER_COMPLETE, true),
with(DUE_TIME, dueDateTime), with(DUE_TIME, dueDateTime),
with(COMPLETION_TIME, completionDate)) with(COMPLETION_TIME, completionDate))
} }
private fun newWeeklyFromCompleted( private fun newWeeklyFromCompleted(
interval: Int, dueDateTime: DateTime, completionDate: DateTime, vararg weekdays: WeekdayNum): Task { interval: Int, dueDateTime: DateTime, completionDate: DateTime, vararg weekdays: WeekDay): Task {
return newTask( return newTask(
with(RRULE, getRecurrenceRule(Frequency.WEEKLY, interval, *weekdays)), with(RECUR, getRecurrenceRule(Frequency.WEEKLY, interval, *weekdays)),
with(AFTER_COMPLETE, true), with(AFTER_COMPLETE, true),
with(DUE_TIME, dueDateTime), with(DUE_TIME, dueDateTime),
with(COMPLETION_TIME, completionDate)) with(COMPLETION_TIME, completionDate))
} }
private fun getRecurrenceRule( private fun getRecurrenceRule(
frequency: Frequency, interval: Int, vararg weekdays: WeekdayNum): RRule { frequency: Frequency, interval: Int, vararg weekdays: WeekDay): String {
val rrule = RRule() val rrule = newRecur()
rrule.freq = frequency rrule.setFrequency(frequency.name)
rrule.interval = interval rrule.interval = interval
if (weekdays.isNotEmpty()) { if (weekdays.isNotEmpty()) {
rrule.byDay = listOf(*weekdays) rrule.dayList.addAll(weekdays)
} }
return rrule return rrule.toString()
} }
} }

@ -1,7 +1,6 @@
package com.todoroo.astrid.repeats package com.todoroo.astrid.repeats
import android.annotation.SuppressLint import android.annotation.SuppressLint
import com.google.ical.values.RRule
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
@ -22,8 +21,9 @@ import org.tasks.makers.TaskMaker.AFTER_COMPLETE
import org.tasks.makers.TaskMaker.COMPLETION_TIME import org.tasks.makers.TaskMaker.COMPLETION_TIME
import org.tasks.makers.TaskMaker.DUE_TIME import org.tasks.makers.TaskMaker.DUE_TIME
import org.tasks.makers.TaskMaker.ID import org.tasks.makers.TaskMaker.ID
import org.tasks.makers.TaskMaker.RRULE import org.tasks.makers.TaskMaker.RECUR
import org.tasks.makers.TaskMaker.newTask import org.tasks.makers.TaskMaker.newTask
import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.time.DateTime import org.tasks.time.DateTime
import java.text.ParseException import java.text.ParseException
@ -65,7 +65,7 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=MINUTELY;INTERVAL=30"))) with(RECUR, "RRULE:FREQ=MINUTELY;INTERVAL=30"))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 14, 0, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 14, 0, 1))
} }
@ -77,7 +77,7 @@ class RepeatTaskHelperTest {
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(COMPLETION_TIME, DateTime(2017, 10, 4, 13, 17, 45, 340)), with(COMPLETION_TIME, DateTime(2017, 10, 4, 13, 17, 45, 340)),
with(RRULE, RRule("RRULE:FREQ=MINUTELY;INTERVAL=30")), with(RECUR, "RRULE:FREQ=MINUTELY;INTERVAL=30"),
with(AFTER_COMPLETE, true)) with(AFTER_COMPLETE, true))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 13, 47, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 13, 47, 1))
@ -89,10 +89,10 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=MINUTELY;COUNT=2;INTERVAL=30"))) with(RECUR, "RRULE:FREQ=MINUTELY;COUNT=2;INTERVAL=30"))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 14, 0, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 14, 0, 1))
assertEquals(1, RRule(task.getRecurrenceWithoutFrom()).count) assertEquals(1, newRecur(task.recurrence!!).count)
} }
@Test @Test
@ -101,7 +101,7 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=MINUTELY;COUNT=1;INTERVAL=30"))) with(RECUR, "RRULE:FREQ=MINUTELY;COUNT=1;INTERVAL=30"))
helper.handleRepeat(task) helper.handleRepeat(task)
} }
@ -111,7 +111,7 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=HOURLY;INTERVAL=6"))) with(RECUR, "RRULE:FREQ=HOURLY;INTERVAL=6"))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 19, 30, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 19, 30, 1))
} }
@ -123,7 +123,7 @@ class RepeatTaskHelperTest {
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(COMPLETION_TIME, DateTime(2017, 10, 4, 13, 17, 45, 340)), with(COMPLETION_TIME, DateTime(2017, 10, 4, 13, 17, 45, 340)),
with(RRULE, RRule("RRULE:FREQ=HOURLY;INTERVAL=6")), with(RECUR, "RRULE:FREQ=HOURLY;INTERVAL=6"),
with(AFTER_COMPLETE, true)) with(AFTER_COMPLETE, true))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 19, 17, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 4, 19, 17, 1))
@ -135,7 +135,7 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=DAILY;INTERVAL=6"))) with(RECUR, "RRULE:FREQ=DAILY;INTERVAL=6"))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 10, 13, 30, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 10, 13, 30, 1))
} }
@ -146,7 +146,7 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=WEEKLY;INTERVAL=2"))) with(RECUR, "RRULE:FREQ=WEEKLY;INTERVAL=2"))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 18, 13, 30, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2017, 10, 18, 13, 30, 1))
} }
@ -157,7 +157,7 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=YEARLY;INTERVAL=3"))) with(RECUR, "RRULE:FREQ=YEARLY;INTERVAL=3"))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2020, 10, 4, 13, 30, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2020, 10, 4, 13, 30, 1))
} }
@ -168,7 +168,7 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)), with(DUE_TIME, DateTime(2017, 10, 4, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=MONTHLY;INTERVAL=3"))) with(RECUR, "RRULE:FREQ=MONTHLY;INTERVAL=3"))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2018, 1, 4, 13, 30, 1)) task, DateTime(2017, 10, 4, 13, 30, 1), DateTime(2018, 1, 4, 13, 30, 1))
} }
@ -179,7 +179,7 @@ class RepeatTaskHelperTest {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(DUE_TIME, DateTime(2017, 1, 31, 13, 30)), with(DUE_TIME, DateTime(2017, 1, 31, 13, 30)),
with(RRULE, RRule("RRULE:FREQ=MONTHLY;INTERVAL=1"))) with(RECUR, "RRULE:FREQ=MONTHLY;INTERVAL=1"))
repeatAndVerify( repeatAndVerify(
task, DateTime(2017, 1, 31, 13, 30, 1), DateTime(2017, 2, 28, 13, 30, 1)) task, DateTime(2017, 1, 31, 13, 30, 1), DateTime(2017, 2, 28, 13, 30, 1))
} }
@ -188,7 +188,7 @@ class RepeatTaskHelperTest {
fun testAlarmShiftWithNoDueDate() { fun testAlarmShiftWithNoDueDate() {
val task = newTask( val task = newTask(
with(ID, 1L), with(ID, 1L),
with(RRULE, RRule("RRULE:FREQ=DAILY")) with(RECUR, "RRULE:FREQ=DAILY")
) )
freezeClock { freezeClock {
repeatAndVerify( repeatAndVerify(

Loading…
Cancel
Save