mirror of https://github.com/tasks/tasks
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.0 KiB
Kotlin
141 lines
4.0 KiB
Kotlin
package org.tasks.repeats
|
|
|
|
import dagger.hilt.android.testing.HiltAndroidTest
|
|
import dagger.hilt.android.testing.UninstallModules
|
|
import org.junit.Assert.assertEquals
|
|
import org.junit.Test
|
|
import org.tasks.Freeze
|
|
import org.tasks.TestUtilities.withTZ
|
|
import org.tasks.analytics.Firebase
|
|
import org.tasks.injection.InjectingTestCase
|
|
import org.tasks.injection.ProductionModule
|
|
import org.tasks.time.DateTime
|
|
import java.text.ParseException
|
|
import java.util.Locale
|
|
import java.util.TimeZone
|
|
import javax.inject.Inject
|
|
|
|
@UninstallModules(ProductionModule::class)
|
|
@HiltAndroidTest
|
|
class RepeatRuleToStringTest : InjectingTestCase() {
|
|
@Inject lateinit var firebase: Firebase
|
|
|
|
@Test
|
|
fun daily() {
|
|
assertEquals("Repeats daily", toString("RRULE:FREQ=DAILY"))
|
|
}
|
|
|
|
@Test
|
|
fun weekly() {
|
|
assertEquals("Repeats weekly", toString("RRULE:FREQ=WEEKLY;INTERVAL=1"))
|
|
}
|
|
|
|
@Test
|
|
fun weeklyPlural() {
|
|
assertEquals("Repeats every 2 weeks", toString("RRULE:FREQ=WEEKLY;INTERVAL=2"))
|
|
}
|
|
|
|
@Test
|
|
fun weeklyByDay() {
|
|
assertEquals(
|
|
"Repeats weekly on Mon, Tue, Wed, Thu, Fri",
|
|
toString("RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR"))
|
|
}
|
|
|
|
@Test
|
|
fun printDaysInRepeatRuleOrder() {
|
|
assertEquals(
|
|
"Repeats weekly on Fri, Thu, Wed, Tue, Mon",
|
|
toString("RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=FR,TH,WE,TU,MO"))
|
|
}
|
|
|
|
@Test
|
|
fun useLocaleForDays() {
|
|
assertEquals(
|
|
"Wiederholt sich wöchentlich Sa., So.",
|
|
toString("de", "RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SA,SU"))
|
|
}
|
|
|
|
@Test
|
|
fun everyFifthTuesday() {
|
|
assertEquals(
|
|
"Repeats monthly on every fifth Tuesday",
|
|
toString("RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=5TU")
|
|
)
|
|
}
|
|
|
|
@Test
|
|
fun everyLastWednesday() {
|
|
assertEquals(
|
|
"Repeats monthly on every last Wednesday",
|
|
toString("RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=-1WE")
|
|
)
|
|
}
|
|
|
|
@Test
|
|
fun everyFirstThursday() {
|
|
assertEquals(
|
|
"Repeats every 2 months on every first Thursday",
|
|
toString("RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=1TH")
|
|
)
|
|
}
|
|
|
|
@Test
|
|
fun repeatUntilPositiveOffset() {
|
|
Freeze.freezeAt(DateTime(2021, 1, 4)) {
|
|
withTZ(BERLIN) {
|
|
assertEquals(
|
|
"Repeats daily, ends on February 23",
|
|
toString("RRULE:FREQ=DAILY;UNTIL=20210223;INTERVAL=1")
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun repeatUntilNoOffset() {
|
|
Freeze.freezeAt(DateTime(2021, 1, 4)) {
|
|
withTZ(LONDON) {
|
|
assertEquals(
|
|
"Repeats daily, ends on February 23",
|
|
toString("RRULE:FREQ=DAILY;UNTIL=20210223;INTERVAL=1")
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun repeatUntilNegativeOffset() {
|
|
Freeze.freezeAt(DateTime(2021, 1, 4)) {
|
|
withTZ(NEW_YORK) {
|
|
assertEquals(
|
|
"Repeats daily, ends on February 23",
|
|
toString("RRULE:FREQ=DAILY;UNTIL=20210223;INTERVAL=1")
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun toString(rrule: String): String? {
|
|
return toString(null, rrule)
|
|
}
|
|
|
|
private fun toString(language: String?, rrule: String): String? {
|
|
return try {
|
|
val locale = language?.let { Locale.forLanguageTag(it) } ?: Locale.getDefault()
|
|
val configuration = context.resources.configuration.apply {
|
|
setLocale(locale)
|
|
}
|
|
RepeatRuleToString(context.createConfigurationContext(configuration), locale, firebase)
|
|
.toString(rrule)
|
|
} catch (e: ParseException) {
|
|
throw RuntimeException(e)
|
|
}
|
|
}
|
|
|
|
companion object {
|
|
private val BERLIN = TimeZone.getTimeZone("Europe/Berlin")
|
|
private val LONDON = TimeZone.getTimeZone("Europe/London")
|
|
private val NEW_YORK = TimeZone.getTimeZone("America/New_York")
|
|
}
|
|
} |