From 795ba243956099c5a2a38dc7adc19fbc4e7e27d4 Mon Sep 17 00:00:00 2001 From: sgallese Date: Sat, 25 Sep 2021 00:08:10 -0700 Subject: [PATCH] Migrate getLocalTime and getTimeZone to common module --- .../org/isoron/uhabits/BaseAndroidTest.kt | 4 +- .../isoron/uhabits/database/AutoBackupTest.kt | 3 +- .../org/isoron/uhabits/database/AutoBackup.kt | 3 +- .../org/isoron/uhabits/utils/DatabaseUtils.kt | 2 +- uhabits-core/build.gradle.kts | 1 + .../kotlin/org/isoron/platform/time/Dates.kt | 21 +++++++ .../org/isoron/platform/time/DatesTest.kt | 49 ++++++++++++++++ .../core/reminders/ReminderScheduler.kt | 2 +- .../isoron/uhabits/core/utils/DateUtils.kt | 58 ++++++++----------- .../java/org/isoron/platform/gui/DatesTest.kt | 34 ----------- .../org/isoron/uhabits/core/BaseUnitTest.kt | 6 +- .../org/isoron/uhabits/core/io/ImportTest.kt | 4 +- .../core/reminders/ReminderSchedulerTest.kt | 13 ++--- .../uhabits/core/utils/DateUtilsTest.kt | 53 +++++++++-------- .../uhabits/core/utils/MidnightTimerTest.kt | 6 +- 15 files changed, 144 insertions(+), 115 deletions(-) create mode 100644 uhabits-core/src/commonTest/kotlin/org/isoron/platform/time/DatesTest.kt delete mode 100644 uhabits-core/src/jvmTest/java/org/isoron/platform/gui/DatesTest.kt diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt index ee7a1a332..debc7e26e 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt @@ -29,13 +29,13 @@ import androidx.test.uiautomator.UiDevice import junit.framework.TestCase import org.hamcrest.CoreMatchers.hasItems import org.hamcrest.MatcherAssert.assertThat +import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.ModelFactory import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.tasks.TaskRunner import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday -import org.isoron.uhabits.core.utils.DateUtils.Companion.setFixedLocalTime import org.isoron.uhabits.core.utils.DateUtils.Companion.setStartDayOffset import org.isoron.uhabits.inject.ActivityContextModule import org.isoron.uhabits.inject.AppContextModule @@ -75,7 +75,7 @@ abstract class BaseAndroidTest : TestCase() { public override fun setUp() { if (Looper.myLooper() == null) Looper.prepare() device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) - setFixedLocalTime(FIXED_LOCAL_TIME) + LocalDate.Companion.fixedLocalTime = FIXED_LOCAL_TIME setStartDayOffset(0, 0) setResolution(2.0f) setTheme(R.style.AppBaseTheme) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AutoBackupTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AutoBackupTest.kt index a8fb535af..d0c518f07 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AutoBackupTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AutoBackupTest.kt @@ -19,6 +19,7 @@ package org.isoron.uhabits.database +import org.isoron.platform.time.LocalDate import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.BaseAndroidTest import org.isoron.uhabits.core.utils.DateUtils @@ -29,7 +30,7 @@ import java.io.FileOutputStream class AutoBackupTest : BaseAndroidTest() { @Test fun testRun() { - DateUtils.setFixedLocalTime(40 * DateUtils.DAY_LENGTH) + LocalDate.fixedLocalTime = 40 * DateUtils.DAY_LENGTH val basedir = AndroidDirFinder(targetContext).getFilesDir("Backups")!! createTestFiles(basedir, 30) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt index 03480e910..9c431591a 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.database import android.content.Context import android.util.Log +import org.isoron.platform.time.LocalDate import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.utils.DatabaseUtils @@ -37,7 +38,7 @@ class AutoBackup(private val context: Context) { if (files.isNotEmpty()) { newestTimestamp = files.last().lastModified() } - val now = DateUtils.getLocalTime() + val now = LocalDate.getLocalTime() removeOldest(files, keep) if (now - newestTimestamp > DateUtils.DAY_LENGTH) { DatabaseUtils.saveDatabaseCopy(context, basedir) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.kt index db25f279d..275e90983 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.kt @@ -21,12 +21,12 @@ package org.isoron.uhabits.utils import android.content.Context import android.database.sqlite.SQLiteDatabase import android.util.Log +import org.isoron.platform.time.LocalDate.Companion.getLocalTime import org.isoron.uhabits.HabitsApplication.Companion.isTestMode import org.isoron.uhabits.HabitsDatabaseOpener import org.isoron.uhabits.core.DATABASE_FILENAME import org.isoron.uhabits.core.DATABASE_VERSION import org.isoron.uhabits.core.utils.DateFormats.Companion.getBackupDateFormat -import org.isoron.uhabits.core.utils.DateUtils.Companion.getLocalTime import java.io.File import java.io.IOException import java.text.SimpleDateFormat diff --git a/uhabits-core/build.gradle.kts b/uhabits-core/build.gradle.kts index 58424882f..05f33414f 100644 --- a/uhabits-core/build.gradle.kts +++ b/uhabits-core/build.gradle.kts @@ -30,6 +30,7 @@ kotlin { dependencies { implementation(kotlin("stdlib-common")) implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.8") + implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.2.1") } } diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt index 8a528d08b..c0e8cbe02 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/time/Dates.kt @@ -19,6 +19,10 @@ package org.isoron.platform.time +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant +import kotlinx.datetime.TimeZone +import kotlinx.datetime.offsetAt import kotlin.math.abs import kotlin.math.ceil @@ -133,6 +137,23 @@ data class LocalDate(val daysSince2000: Int) { override fun toString(): String { return "LocalDate($year-$month-$day)" } + + companion object { + var fixedLocalTime: Long? = null + var fixedTimeZone: TimeZone? = null + + fun getLocalTime(testTimeInMillis: Long? = null): Long { + if (fixedLocalTime != null) return fixedLocalTime as Long + + val tz = getTimeZone() + val now = testTimeInMillis ?: Clock.System.now().toEpochMilliseconds() + return now + (tz.offsetAt(Instant.fromEpochMilliseconds(now)).totalSeconds * 1000) + } + + fun getTimeZone(): TimeZone { + return fixedTimeZone ?: TimeZone.currentSystemDefault() + } + } } interface LocalDateFormatter { diff --git a/uhabits-core/src/commonTest/kotlin/org/isoron/platform/time/DatesTest.kt b/uhabits-core/src/commonTest/kotlin/org/isoron/platform/time/DatesTest.kt new file mode 100644 index 000000000..53f328c4e --- /dev/null +++ b/uhabits-core/src/commonTest/kotlin/org/isoron/platform/time/DatesTest.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2016-2021 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.platform.time + +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.TimeZone +import kotlinx.datetime.toInstant +import kotlin.test.Test +import kotlin.test.assertEquals + +class DatesTest { + @Test + fun testDatesBefore2000() { + val date = LocalDate(-1) + assertEquals(31, date.day) + assertEquals(12, date.month) + assertEquals(1999, date.year) + } + + @Test + fun testGetLocalTime() { + LocalDate.fixedLocalTime = null + LocalDate.fixedTimeZone = TimeZone.of("Australia/Sydney") + val utcTestTimeInMillis = LocalDateTime( + 2015, 1, 11, 0, 0, 0, 0 + ).toInstant(TimeZone.UTC).toEpochMilliseconds() + val localTimeInMillis = LocalDate.getLocalTime(utcTestTimeInMillis) + val expectedUnixTimeOffsetForSydney = 11 * 60 * 60 * 1000 + val expectedUnixTimeForSydney = utcTestTimeInMillis + expectedUnixTimeOffsetForSydney + assertEquals(expectedUnixTimeForSydney, localTimeInMillis) + } +} diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt index 8318429f6..986f2d195 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.reminders +import org.isoron.platform.time.LocalDate.Companion.getLocalTime import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.commands.ChangeHabitColorCommand import org.isoron.uhabits.core.commands.Command @@ -28,7 +29,6 @@ import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.HabitMatcher import org.isoron.uhabits.core.preferences.WidgetPreferences import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone -import org.isoron.uhabits.core.utils.DateUtils.Companion.getLocalTime import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfDayWithOffset import org.isoron.uhabits.core.utils.DateUtils.Companion.removeTimezone import java.util.Locale diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt index 8fe65ce9d..e30a4d6d0 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt @@ -18,20 +18,22 @@ */ package org.isoron.uhabits.core.utils +import kotlinx.datetime.Instant +import kotlinx.datetime.offsetAt +import org.isoron.platform.time.LocalDate.Companion.getLocalTime +import org.isoron.platform.time.LocalDate.Companion.getTimeZone import org.isoron.uhabits.core.models.Timestamp import java.util.Calendar import java.util.Calendar.DAY_OF_MONTH import java.util.Calendar.DAY_OF_WEEK import java.util.Calendar.SHORT -import java.util.Date import java.util.GregorianCalendar import java.util.Locale import java.util.TimeZone +import kotlin.collections.ArrayList abstract class DateUtils { companion object { - private var fixedLocalTime: Long? = null - private var fixedTimeZone: TimeZone? = null private var fixedLocale: Locale? = null private var startDayHourOffset: Int = 0 private var startDayMinuteOffset: Int = 0 @@ -58,8 +60,15 @@ abstract class DateUtils { @JvmStatic fun applyTimezone(localTimestamp: Long): Long { - val tz: TimeZone = getTimeZone() - return localTimestamp - tz.getOffset(localTimestamp - tz.getOffset(localTimestamp)) + val tz = getTimeZone() + val offset = tz.offsetAt( + Instant.fromEpochMilliseconds(localTimestamp) + ).totalSeconds * 1000 + val difference = localTimestamp - offset + val offsetDifference = tz.offsetAt( + Instant.fromEpochMilliseconds(difference) + ).totalSeconds * 1000 + return localTimestamp - offsetDifference } @JvmStatic @@ -76,15 +85,6 @@ abstract class DateUtils { return day } - @JvmStatic - fun getLocalTime(testTimeInMillis: Long? = null): Long { - if (fixedLocalTime != null) return fixedLocalTime as Long - - val tz = getTimeZone() - val now = testTimeInMillis ?: Date().time - return now + tz.getOffset(now) - } - /** * Returns an array of strings with the names for each day of the week, * in either SHORT or LONG format. The first entry corresponds to the @@ -206,22 +206,20 @@ abstract class DateUtils { fun getStartOfTodayWithOffset(): Long = getStartOfDayWithOffset(getLocalTime()) @JvmStatic - fun millisecondsUntilTomorrowWithOffset(): Long = getStartOfTomorrowWithOffset() - getLocalTime() + fun millisecondsUntilTomorrowWithOffset(): Long = + getStartOfTomorrowWithOffset() - getLocalTime() @JvmStatic fun getStartOfTodayCalendar(): GregorianCalendar = getCalendar(getStartOfToday()) @JvmStatic - fun getStartOfTodayCalendarWithOffset(): GregorianCalendar = getCalendar(getStartOfTodayWithOffset()) - - private fun getTimeZone(): TimeZone { - return fixedTimeZone ?: TimeZone.getDefault() - } + fun getStartOfTodayCalendarWithOffset(): GregorianCalendar = + getCalendar(getStartOfTodayWithOffset()) @JvmStatic fun removeTimezone(timestamp: Long): Long { val tz = getTimeZone() - return timestamp + tz.getOffset(timestamp) + return timestamp + (tz.offsetAt(Instant.fromEpochMilliseconds(timestamp)).totalSeconds * 1000) } @JvmStatic @@ -259,7 +257,9 @@ abstract class DateUtils { return when (field) { - TruncateField.DAY -> { cal.timeInMillis } + TruncateField.DAY -> { + cal.timeInMillis + } TruncateField.MONTH -> { cal.set(DAY_OF_MONTH, 1) @@ -269,7 +269,9 @@ abstract class DateUtils { TruncateField.WEEK_NUMBER -> { val weekDay = cal.get(DAY_OF_WEEK) var delta = weekDay - firstWeekday - if (delta < 0) { delta += 7 } + if (delta < 0) { + delta += 7 + } cal.add(Calendar.DAY_OF_YEAR, -delta) cal.timeInMillis } @@ -307,16 +309,6 @@ abstract class DateUtils { return applyTimezone(time) } - @JvmStatic - fun setFixedLocalTime(newFixedLocalTime: Long?) { - this.fixedLocalTime = newFixedLocalTime - } - - @JvmStatic - fun setFixedTimeZone(newTimeZone: TimeZone?) { - this.fixedTimeZone = newTimeZone - } - @JvmStatic fun setFixedLocale(newLocale: Locale?) { this.fixedLocale = newLocale diff --git a/uhabits-core/src/jvmTest/java/org/isoron/platform/gui/DatesTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/platform/gui/DatesTest.kt deleted file mode 100644 index 47329ebc2..000000000 --- a/uhabits-core/src/jvmTest/java/org/isoron/platform/gui/DatesTest.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2016-2021 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -package org.isoron.platform.gui - -import org.isoron.platform.time.LocalDate -import org.junit.Assert.assertEquals -import org.junit.Test - -class DatesTest { - @Test - fun testDatesBefore2000() { - val date = LocalDate(-1) - assertEquals(date.day, 31) - assertEquals(date.month, 12) - assertEquals(date.year, 1999) - } -} diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.kt index 4079600ab..9720248d7 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/BaseUnitTest.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.core import com.nhaarman.mockitokotlin2.spy import com.nhaarman.mockitokotlin2.validateMockitoUsage import org.apache.commons.io.IOUtils +import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.database.Database import org.isoron.uhabits.core.database.DatabaseOpener @@ -33,7 +34,6 @@ import org.isoron.uhabits.core.models.memory.MemoryModelFactory import org.isoron.uhabits.core.tasks.SingleThreadTaskRunner import org.isoron.uhabits.core.test.HabitFixtures import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendar -import org.isoron.uhabits.core.utils.DateUtils.Companion.setFixedLocalTime import org.isoron.uhabits.core.utils.DateUtils.Companion.setStartDayOffset import org.junit.After import org.junit.Before @@ -76,7 +76,7 @@ open class BaseUnitTest { @Before @Throws(Exception::class) open fun setUp() { - setFixedLocalTime(FIXED_LOCAL_TIME) + LocalDate.fixedLocalTime = FIXED_LOCAL_TIME setStartDayOffset(0, 0) val memoryModelFactory = MemoryModelFactory() habitList = spy(memoryModelFactory.buildHabitList()) @@ -90,7 +90,7 @@ open class BaseUnitTest { @Throws(Exception::class) open fun tearDown() { validateMockitoUsage() - setFixedLocalTime(null) + LocalDate.fixedLocalTime = null setStartDayOffset(0, 0) } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/ImportTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/ImportTest.kt index 6a8bd0c4f..cd2f5885d 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/ImportTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/ImportTest.kt @@ -22,13 +22,13 @@ import junit.framework.Assert.assertFalse import junit.framework.Assert.assertTrue import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.core.IsEqual.equalTo +import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.Frequency import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendar -import org.isoron.uhabits.core.utils.DateUtils.Companion.setFixedLocalTime import org.junit.Before import org.junit.Test import java.io.File @@ -39,7 +39,7 @@ class ImportTest : BaseUnitTest() { @Throws(Exception::class) override fun setUp() { super.setUp() - setFixedLocalTime(null) + LocalDate.fixedLocalTime = null } @Test diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.kt index cf81fbe9a..c0c83682c 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/reminders/ReminderSchedulerTest.kt @@ -22,6 +22,7 @@ import com.nhaarman.mockitokotlin2.eq import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.whenever +import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.Reminder @@ -30,8 +31,6 @@ import org.isoron.uhabits.core.preferences.WidgetPreferences import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendar import org.isoron.uhabits.core.utils.DateUtils.Companion.removeTimezone -import org.isoron.uhabits.core.utils.DateUtils.Companion.setFixedLocalTime -import org.isoron.uhabits.core.utils.DateUtils.Companion.setFixedTimeZone import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -57,13 +56,13 @@ class ReminderSchedulerTest : BaseUnitTest() { habit.id = habitId reminderScheduler = ReminderScheduler(commandRunner, habitList, sys, widgetPreferences) - setFixedTimeZone(TimeZone.getTimeZone("GMT-4")) + LocalDate.Companion.fixedTimeZone = kotlinx.datetime.TimeZone.of("GMT-4") } @Test fun testScheduleAll() { val now = unixTime(2015, 1, 26, 13, 0) - setFixedLocalTime(now) + LocalDate.Companion.fixedLocalTime = now val h1 = fixtures.createEmptyHabit() val h2 = fixtures.createEmptyHabit() val h3 = fixtures.createEmptyHabit() @@ -97,7 +96,7 @@ class ReminderSchedulerTest : BaseUnitTest() { @Test fun testSchedule_withSnooze() { val now = removeTimezone(unixTime(2015, 1, 1, 15, 0)) - setFixedLocalTime(now) + LocalDate.fixedLocalTime = now val snoozeTimeInFuture = unixTime(2015, 1, 1, 21, 0) val snoozeTimeInPast = unixTime(2015, 1, 1, 7, 0) val regularReminderTime = applyTimezone(unixTime(2015, 1, 2, 8, 30)) @@ -116,7 +115,7 @@ class ReminderSchedulerTest : BaseUnitTest() { @Test fun testSchedule_laterToday() { val now = unixTime(2015, 1, 26, 6, 30) - setFixedLocalTime(now) + LocalDate.fixedLocalTime = now val expectedCheckmarkTime = unixTime(2015, 1, 26, 0, 0) val expectedReminderTime = unixTime(2015, 1, 26, 12, 30) habit.reminder = Reminder(8, 30, WeekdayList.EVERY_DAY) @@ -126,7 +125,7 @@ class ReminderSchedulerTest : BaseUnitTest() { @Test fun testSchedule_tomorrow() { val now = unixTime(2015, 1, 26, 13, 0) - setFixedLocalTime(now) + LocalDate.fixedLocalTime = now val expectedCheckmarkTime = unixTime(2015, 1, 27, 0, 0) val expectedReminderTime = unixTime(2015, 1, 27, 12, 30) habit.reminder = Reminder(8, 30, WeekdayList.EVERY_DAY) diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt index 9076c27d4..71ea53f42 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.core.utils import junit.framework.Assert.assertEquals import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.core.IsEqual.equalTo +import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.utils.DateUtils.Companion.applyTimezone @@ -29,9 +30,7 @@ import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfDayWithOffset import org.isoron.uhabits.core.utils.DateUtils.Companion.getTodayWithOffset import org.isoron.uhabits.core.utils.DateUtils.Companion.millisecondsUntilTomorrowWithOffset import org.isoron.uhabits.core.utils.DateUtils.Companion.removeTimezone -import org.isoron.uhabits.core.utils.DateUtils.Companion.setFixedLocalTime import org.isoron.uhabits.core.utils.DateUtils.Companion.setFixedLocale -import org.isoron.uhabits.core.utils.DateUtils.Companion.setFixedTimeZone import org.isoron.uhabits.core.utils.DateUtils.Companion.setStartDayOffset import org.isoron.uhabits.core.utils.DateUtils.Companion.truncate import org.junit.Before @@ -61,10 +60,10 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetLocalTime() { - setFixedLocalTime(null) - setFixedTimeZone(TimeZone.getTimeZone("Australia/Sydney")) + LocalDate.fixedLocalTime = null + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.of("Australia/Sydney") val utcTestTimeInMillis = unixTime(2015, Calendar.JANUARY, 11) - val localTimeInMillis = DateUtils.getLocalTime(utcTestTimeInMillis) + val localTimeInMillis = LocalDate.getLocalTime(utcTestTimeInMillis) val expectedUnixTimeOffsetForSydney = 11 * 60 * 60 * 1000 val expectedUnixTimeForSydney = utcTestTimeInMillis + expectedUnixTimeOffsetForSydney assertThat(expectedUnixTimeForSydney, equalTo(localTimeInMillis)) @@ -120,7 +119,7 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetToday() { - setFixedLocalTime(FIXED_LOCAL_TIME) + LocalDate.fixedLocalTime = FIXED_LOCAL_TIME val today = DateUtils.getToday() assertThat(Timestamp(FIXED_LOCAL_TIME), equalTo(today)) } @@ -137,7 +136,7 @@ class DateUtilsTest : BaseUnitTest() { fun testGetStartOfToday() { val expectedStartOfDayUtc = unixTime(2017, Calendar.JANUARY, 1, 0, 0) val laterInTheDayUtc = unixTime(2017, Calendar.JANUARY, 1, 20, 0) - setFixedLocalTime(laterInTheDayUtc) + LocalDate.fixedLocalTime = laterInTheDayUtc val startOfToday = DateUtils.getStartOfToday() assertThat(expectedStartOfDayUtc, equalTo(startOfToday)) } @@ -146,10 +145,10 @@ class DateUtilsTest : BaseUnitTest() { fun testGetStartOfTomorrowWithOffset_priorToOffset() { val hourOffset = 3 setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC val startOfTomorrowWithOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset, 0) val priorToOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset - 1, 0) - setFixedLocalTime(priorToOffset) + LocalDate.fixedLocalTime = priorToOffset val startOfTomorrow = DateUtils.getStartOfTomorrowWithOffset() assertThat(startOfTomorrowWithOffset, equalTo(startOfTomorrow)) } @@ -158,10 +157,10 @@ class DateUtilsTest : BaseUnitTest() { fun testGetStartOfTomorrowWithOffset_afterOffset() { val hourOffset = 3 setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC val startOfTomorrowWithOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset, 0) val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) - setFixedLocalTime(afterOffset) + LocalDate.fixedLocalTime = afterOffset val startOfTomorrow = DateUtils.getStartOfTomorrowWithOffset() assertThat(startOfTomorrowWithOffset, equalTo(startOfTomorrow)) } @@ -170,10 +169,10 @@ class DateUtilsTest : BaseUnitTest() { fun testGetStartOfTodayWithOffset_priorToOffset() { val hourOffset = 3 setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC val startOfYesterday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) val priorToOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset - 1, 0) - setFixedLocalTime(priorToOffset) + LocalDate.fixedLocalTime = priorToOffset val startOfTodayWithOffset = DateUtils.getStartOfTodayWithOffset() assertThat(startOfYesterday, equalTo(startOfTodayWithOffset)) } @@ -182,10 +181,10 @@ class DateUtilsTest : BaseUnitTest() { fun testGetStartOfTodayWithOffset_afterOffset() { val hourOffset = 3 setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC val startOfToday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) - setFixedLocalTime(afterOffset) + LocalDate.fixedLocalTime = afterOffset val startOfTodayWithOffset = DateUtils.getStartOfTodayWithOffset() assertThat(startOfToday, equalTo(startOfTodayWithOffset)) } @@ -284,8 +283,8 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetUpcomingTimeInMillis() { - setFixedLocalTime(FIXED_LOCAL_TIME) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + LocalDate.fixedLocalTime = FIXED_LOCAL_TIME + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC val expected = unixTime(2015, Calendar.JANUARY, 25, 10, 1) val upcomingTimeMillis = DateUtils.getUpcomingTimeInMillis(10, 1) assertThat(expected, equalTo(upcomingTimeMillis)) @@ -294,21 +293,21 @@ class DateUtilsTest : BaseUnitTest() { @Test @Throws(Exception::class) fun testMillisecondsUntilTomorrow() { - setFixedTimeZone(TimeZone.getTimeZone("GMT")) - setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 1, 23, 59)) + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC + LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 23, 59) assertThat(millisecondsUntilTomorrowWithOffset(), equalTo(DateUtils.MINUTE_LENGTH)) - setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 1, 20, 0)) + LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 20, 0) assertThat( millisecondsUntilTomorrowWithOffset(), equalTo(4 * DateUtils.HOUR_LENGTH) ) setStartDayOffset(3, 30) - setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 1, 23, 59)) + LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 1, 23, 59) assertThat( millisecondsUntilTomorrowWithOffset(), equalTo(3 * DateUtils.HOUR_LENGTH + 31 * DateUtils.MINUTE_LENGTH) ) - setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 2, 1, 0)) + LocalDate.fixedLocalTime = unixTime(2017, Calendar.JANUARY, 2, 1, 0) assertThat( millisecondsUntilTomorrowWithOffset(), equalTo(2 * DateUtils.HOUR_LENGTH + 30 * DateUtils.MINUTE_LENGTH) @@ -317,7 +316,7 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetStartOfTodayCalendar() { - setFixedLocalTime(FIXED_LOCAL_TIME) + LocalDate.fixedLocalTime = FIXED_LOCAL_TIME setFixedLocale(Locale.GERMANY) val expectedStartOfDay = unixTime(2015, Calendar.JANUARY, 25, 0, 0) val expectedCalendar = GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.GERMANY) @@ -331,7 +330,7 @@ class DateUtilsTest : BaseUnitTest() { val hourOffset = 3 setStartDayOffset(hourOffset, 0) val priorToOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset - 1, 0) - setFixedLocalTime(priorToOffset) + LocalDate.fixedLocalTime = priorToOffset setFixedLocale(Locale.GERMANY) val startOfYesterday = unixTime(2017, Calendar.JANUARY, 2, 0, 0) val expectedCalendar = GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.GERMANY) @@ -345,7 +344,7 @@ class DateUtilsTest : BaseUnitTest() { val hourOffset = 3 setStartDayOffset(hourOffset, 0) val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) - setFixedLocalTime(afterOffset) + LocalDate.fixedLocalTime = afterOffset setFixedLocale(Locale.GERMANY) val startOfToday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) val expectedCalendar = GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.GERMANY) @@ -382,7 +381,7 @@ class DateUtilsTest : BaseUnitTest() { @Test fun test_applyTimezone() { - setFixedTimeZone(TimeZone.getTimeZone("Australia/Sydney")) + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.of("Australia/Sydney") assertEquals( applyTimezone(unixTime(2017, Calendar.JULY, 30, 18, 0)), unixTime(2017, Calendar.JULY, 30, 8, 0) @@ -521,7 +520,7 @@ class DateUtilsTest : BaseUnitTest() { @Test fun test_removeTimezone() { - setFixedTimeZone(TimeZone.getTimeZone("Australia/Sydney")) + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.of("Australia/Sydney") assertEquals( removeTimezone(unixTime(2017, Calendar.JULY, 30, 8, 0)), unixTime(2017, Calendar.JULY, 30, 18, 0) diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/MidnightTimerTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/MidnightTimerTest.kt index b92507da0..d0474d4be 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/MidnightTimerTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/MidnightTimerTest.kt @@ -3,6 +3,7 @@ package org.isoron.uhabits.core.utils import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext +import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.BaseUnitTest import org.junit.Test import java.util.Calendar @@ -21,8 +22,8 @@ class MidnightTimerTest : BaseUnitTest() { val dispatcher = executor.asCoroutineDispatcher() withContext(dispatcher) { - DateUtils.setFixedTimeZone(TimeZone.getTimeZone("GMT")) - DateUtils.setFixedLocalTime( + LocalDate.fixedTimeZone = kotlinx.datetime.TimeZone.UTC + LocalDate.fixedLocalTime = unixTime( 2017, Calendar.JANUARY, @@ -31,7 +32,6 @@ class MidnightTimerTest : BaseUnitTest() { 59, DateUtils.MINUTE_LENGTH - 1 ) - ) val suspendedListener = suspendCoroutine { continuation -> MidnightTimer().apply {