Place MidnightTimer under test

pull/1108/head
sgallese 4 years ago
parent 2ab6c396d0
commit b2951a3475

@ -39,11 +39,11 @@ open class MidnightTimer @Inject constructor() {
@Synchronized fun onPause(): MutableList<Runnable>? = executor.shutdownNow() @Synchronized fun onPause(): MutableList<Runnable>? = executor.shutdownNow()
@Synchronized fun onResume() { @Synchronized fun onResume(delayOffsetInMillis: Long = DateUtils.MINUTE_LENGTH, testExecutor: ScheduledExecutorService? = null) {
executor = Executors.newSingleThreadScheduledExecutor() executor = testExecutor ?: Executors.newSingleThreadScheduledExecutor()
executor.scheduleAtFixedRate( executor.scheduleAtFixedRate(
{ notifyListeners() }, { notifyListeners() },
DateUtils.millisecondsUntilTomorrowWithOffset() + 1000, DateUtils.millisecondsUntilTomorrowWithOffset() + delayOffsetInMillis,
DateUtils.DAY_LENGTH, DateUtils.DAY_LENGTH,
TimeUnit.MILLISECONDS TimeUnit.MILLISECONDS
) )

@ -95,15 +95,13 @@ open class BaseUnitTest {
} }
fun unixTime(year: Int, month: Int, day: Int): Long { fun unixTime(year: Int, month: Int, day: Int): Long {
val cal = getStartOfTodayCalendar() return unixTime(year, month, day, 0, 0)
cal.set(year, month, day, 0, 0, 0)
return cal.timeInMillis
} }
open fun unixTime(year: Int, month: Int, day: Int, hour: Int, minute: Int): Long { open fun unixTime(year: Int, month: Int, day: Int, hour: Int, minute: Int, milliseconds: Long = 0): Long {
val cal = getStartOfTodayCalendar() val cal = getStartOfTodayCalendar()
cal.set(year, month, day, hour, minute) cal.set(year, month, day, hour, minute)
return cal.timeInMillis return cal.timeInMillis + milliseconds
} }
fun timestamp(year: Int, month: Int, day: Int): Timestamp { fun timestamp(year: Int, month: Int, day: Int): Timestamp {

@ -138,7 +138,7 @@ class ReminderSchedulerTest : BaseUnitTest() {
reminderScheduler.schedule(habit) reminderScheduler.schedule(habit)
} }
override fun unixTime(year: Int, month: Int, day: Int, hour: Int, minute: Int): Long { override fun unixTime(year: Int, month: Int, day: Int, hour: Int, minute: Int, milliseconds: Long): Long {
val cal: Calendar = getStartOfTodayCalendar() val cal: Calendar = getStartOfTodayCalendar()
cal[year, month, day, hour] = minute cal[year, month, day, hour] = minute
return cal.timeInMillis return cal.timeInMillis

@ -0,0 +1,45 @@
package org.isoron.uhabits.core.utils
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import org.isoron.uhabits.core.BaseUnitTest
import org.junit.Test
import java.util.Calendar
import java.util.TimeZone
import java.util.concurrent.Executors
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
import kotlin.test.assertEquals
class MidnightTimerTest : BaseUnitTest() {
@Test
fun testMidnightTimer_notifyListener_atMidnight() = runBlocking {
// Given
val executor = Executors.newSingleThreadScheduledExecutor()
val dispatcher = executor.asCoroutineDispatcher()
withContext(dispatcher) {
DateUtils.setFixedTimeZone(TimeZone.getTimeZone("GMT"))
DateUtils.setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 1, 23, 59, DateUtils.MINUTE_LENGTH - 1))
val suspendedListener = suspendCoroutine<Boolean> { continuation ->
val listener = object : MidnightTimer.MidnightListener {
override fun atMidnight() {
continuation.resume(true)
}
}
MidnightTimer().apply {
addListener(listener)
// When
onResume(1, executor)
}
}
// Then
assertEquals(true, suspendedListener)
}
}
}
Loading…
Cancel
Save