From 7bddfbe5a7a23bf3ba94b42ed3f7c379a7f4f7ac Mon Sep 17 00:00:00 2001 From: sgallese Date: Sun, 19 Sep 2021 21:55:00 -0700 Subject: [PATCH 01/18] Tests for DateUtils and FileExtensions --- .../isoron/uhabits/core/utils/DateUtils.kt | 8 +-- .../uhabits/core/utils/DateUtilsTest.kt | 59 +++++++++++++++++++ .../uhabits/core/utils/FileExtensionsTest.kt | 17 ++++++ 3 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/FileExtensionsTest.kt 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 8af545504..e812bc2ca 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 @@ -77,11 +77,11 @@ abstract class DateUtils { } @JvmStatic - fun getLocalTime(): Long { + fun getLocalTime(testTimeInMillis: Long? = null): Long { if (fixedLocalTime != null) return fixedLocalTime as Long val tz = getTimeZone() - val now = Date().time + val now = testTimeInMillis ?: Date().time return now + tz.getOffset(now) } @@ -100,7 +100,7 @@ abstract class DateUtils { format: Int, firstWeekDay: Int ): Array { - val calendar = GregorianCalendar() + val calendar = GregorianCalendar(getLocale()) calendar.set(DAY_OF_WEEK, firstWeekDay) val daysNullable = ArrayList() @@ -149,7 +149,7 @@ abstract class DateUtils { */ @JvmStatic fun getFirstWeekdayNumberAccordingToLocale(): Int { - return GregorianCalendar().firstDayOfWeek + return GregorianCalendar(getLocale()).firstDayOfWeek } /** 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 1b440279e..5519ff1ed 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 @@ -58,6 +58,65 @@ class DateUtilsTest : BaseUnitTest() { assertThat(formatted, equalTo("Thu\n31")) } + @Test + fun testGetLocalTime() { + setFixedLocalTime(null) + setFixedTimeZone(TimeZone.getTimeZone("Australia/Sydney")) + val utcTestTimeInMillis = unixTime(2015, Calendar.JANUARY, 11) + val localTimeInMillis = DateUtils.getLocalTime(utcTestTimeInMillis) + val expectedUnixTimeOffsetForSydney = 11 * 60 * 60 * 1000 + val expectedUnixTimeForSydney = utcTestTimeInMillis + expectedUnixTimeOffsetForSydney + assertThat(expectedUnixTimeForSydney, equalTo(localTimeInMillis)) + } + + @Test + fun testGetWeekdaySequence() { + val weekdaySequence = DateUtils.getWeekdaySequence(3) + assertThat(arrayOf(3, 4, 5, 6, 7, 1, 2), equalTo(weekdaySequence)) + } + + @Test + fun testGetFirstWeekdayNumberAccordingToLocale_germany() { + setFixedLocale(Locale.GERMANY) + val firstWeekdayNumber = DateUtils.getFirstWeekdayNumberAccordingToLocale() + assertThat(2, equalTo(firstWeekdayNumber)) + } + + @Test + fun testGetFirstWeekdayNumberAccordingToLocale_us() { + setFixedLocale(Locale.US) + val firstWeekdayNumber = DateUtils.getFirstWeekdayNumberAccordingToLocale() + assertThat(1, equalTo(firstWeekdayNumber)) + } + + @Test + fun testGetLongWeekdayNames_germany() { + setFixedLocale(Locale.GERMANY) + val longWeekdayNames = DateUtils.getLongWeekdayNames(Calendar.SATURDAY) + assertThat(arrayOf("Samstag", "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"), equalTo(longWeekdayNames)) + } + + @Test + fun testGetLongWeekdayNames_us() { + setFixedLocale(Locale.US) + val longWeekdayNames = DateUtils.getLongWeekdayNames(Calendar.SATURDAY) + assertThat(arrayOf("Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"), equalTo(longWeekdayNames)) + } + + @Test + fun testGetShortWeekdayNames_germany() { + setFixedLocale(Locale.GERMANY) + val longWeekdayNames = DateUtils.getShortWeekdayNames(Calendar.SATURDAY) + assertThat(arrayOf("Sa.", "So.", "Mo.", "Di.", "Mi.", "Do.", "Fr."), equalTo(longWeekdayNames)) + } + + @Test + fun testGetShortWeekdayNames_us() { + setFixedLocale(Locale.US) + val longWeekdayNames = DateUtils.getShortWeekdayNames(Calendar.SATURDAY) + assertThat(arrayOf("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"), equalTo(longWeekdayNames)) + } + @Test fun testTruncate_dayOfWeek() { val field = DateUtils.TruncateField.WEEK_NUMBER diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/FileExtensionsTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/FileExtensionsTest.kt new file mode 100644 index 000000000..627422608 --- /dev/null +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/FileExtensionsTest.kt @@ -0,0 +1,17 @@ +package org.isoron.uhabits.core.utils + +import org.isoron.uhabits.core.BaseUnitTest +import org.junit.Test +import java.io.File +import kotlin.test.assertTrue + +class FileExtensionsTest : BaseUnitTest() { + + @Test + fun testIsSQLite3File() { + val file = File.createTempFile("asset", "") + copyAssetToFile("loop.db", file) + val isSqlite3File = file.isSQLite3File() + assertTrue(isSqlite3File) + } +} From 66c61e2e6cabe2d6f6dd614b2846386e87cd20aa Mon Sep 17 00:00:00 2001 From: sgallese Date: Mon, 20 Sep 2021 22:10:07 -0700 Subject: [PATCH 02/18] More DateUtils tests --- .../uhabits/core/utils/DateUtilsTest.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) 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 5519ff1ed..212b50508 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 @@ -117,6 +117,54 @@ class DateUtilsTest : BaseUnitTest() { assertThat(arrayOf("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"), equalTo(longWeekdayNames)) } + @Test + fun testGetToday() { + setFixedLocalTime(FIXED_LOCAL_TIME) + val today = DateUtils.getToday() + assertThat(Timestamp(FIXED_LOCAL_TIME), equalTo(today)) + } + + @Test + fun testGetStartOfDay() { + val expectedStartOfDayUtc = unixTime(2017, Calendar.JANUARY, 1, 0, 0) + val laterInTheDayUtc = unixTime(2017, Calendar.JANUARY, 1, 20, 0) + val startOfDay = DateUtils.getStartOfDay(laterInTheDayUtc) + assertThat(expectedStartOfDayUtc, equalTo(startOfDay)) + } + + @Test + fun testGetStartOfToday() { + val expectedStartOfDayUtc = unixTime(2017, Calendar.JANUARY, 1, 0, 0) + val laterInTheDayUtc = unixTime(2017, Calendar.JANUARY, 1, 20, 0) + setFixedLocalTime(laterInTheDayUtc) + val startOfToday = DateUtils.getStartOfToday() + assertThat(expectedStartOfDayUtc, equalTo(startOfToday)) + } + + @Test + fun testGetStartOfTomorrowWithOffset_priorToOffset() { + val hourOffset = 3 + setStartDayOffset(hourOffset, 0) + setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val startOfTomorrowWithOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset, 0) + val priorToOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset - 1, 0) + setFixedLocalTime(priorToOffset) + val startOfTomorrow = DateUtils.getStartOfTomorrowWithOffset() + assertThat(startOfTomorrowWithOffset, equalTo(startOfTomorrow)) + } + + @Test + fun testGetStartOfTomorrowWithOffset_afterOffset() { + val hourOffset = 3 + setStartDayOffset(hourOffset, 0) + setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val startOfTomorrowWithOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset, 0) + val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) + setFixedLocalTime(afterOffset) + val startOfTomorrow = DateUtils.getStartOfTomorrowWithOffset() + assertThat(startOfTomorrowWithOffset, equalTo(startOfTomorrow)) + } + @Test fun testTruncate_dayOfWeek() { val field = DateUtils.TruncateField.WEEK_NUMBER From 9e241286751139dd8884692942620d98881d893e Mon Sep 17 00:00:00 2001 From: sgallese Date: Tue, 21 Sep 2021 21:02:49 -0700 Subject: [PATCH 03/18] DateUtils today offset tests --- .../uhabits/core/utils/DateUtilsTest.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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 212b50508..1e79e335c 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 @@ -165,6 +165,30 @@ class DateUtilsTest : BaseUnitTest() { assertThat(startOfTomorrowWithOffset, equalTo(startOfTomorrow)) } + @Test + fun testGetStartOfTodayWithOffset_priorToOffset() { + val hourOffset = 3 + setStartDayOffset(hourOffset, 0) + setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val startOfYesterday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) + val priorToOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset - 1, 0) + setFixedLocalTime(priorToOffset) + val startOfTodayWithOffset = DateUtils.getStartOfTodayWithOffset() + assertThat(startOfYesterday, equalTo(startOfTodayWithOffset)) + } + + @Test + fun testGetStartOfTodayWithOffset_afterOffset() { + val hourOffset = 3 + setStartDayOffset(hourOffset, 0) + setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val startOfToday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) + val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) + setFixedLocalTime(afterOffset) + val startOfTodayWithOffset = DateUtils.getStartOfTodayWithOffset() + assertThat(startOfToday, equalTo(startOfTodayWithOffset)) + } + @Test fun testTruncate_dayOfWeek() { val field = DateUtils.TruncateField.WEEK_NUMBER From b15c02adbf57b1ce24290d9623e2b49da8649a79 Mon Sep 17 00:00:00 2001 From: sgallese Date: Tue, 21 Sep 2021 21:31:37 -0700 Subject: [PATCH 04/18] Calendar tests for DateUtils --- .../uhabits/core/utils/DateUtilsTest.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) 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 1e79e335c..a3388b4f7 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 @@ -37,6 +37,7 @@ import org.isoron.uhabits.core.utils.DateUtils.Companion.truncate import org.junit.Before import org.junit.Test import java.util.Calendar +import java.util.GregorianCalendar import java.util.Locale import java.util.TimeZone @@ -297,6 +298,45 @@ class DateUtilsTest : BaseUnitTest() { ) } + @Test + fun testGetStartOfTodayCalendar() { + setFixedLocalTime(FIXED_LOCAL_TIME) + setFixedLocale(Locale.GERMANY) + val expectedStartOfDay = unixTime(2015, Calendar.JANUARY, 25, 0, 0) + val expectedCalendar = GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.GERMANY) + expectedCalendar.timeInMillis = expectedStartOfDay + val startOfTodayCalendar = DateUtils.getStartOfTodayCalendar() + assertThat(expectedCalendar, equalTo(startOfTodayCalendar)) + } + + @Test + fun testGetStartOfTodayCalendarWithOffset_priorToOffset() { + val hourOffset = 3 + setStartDayOffset(hourOffset, 0) + val priorToOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset - 1, 0) + setFixedLocalTime(priorToOffset) + setFixedLocale(Locale.GERMANY) + val startOfYesterday = unixTime(2017, Calendar.JANUARY, 2, 0, 0) + val expectedCalendar = GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.GERMANY) + expectedCalendar.timeInMillis = startOfYesterday + val startOfTodayCalendar = DateUtils.getStartOfTodayCalendar() + assertThat(expectedCalendar, equalTo(startOfTodayCalendar)) + } + + @Test + fun testGetStartOfTodayCalendarWithOffset_afterOffset() { + val hourOffset = 3 + setStartDayOffset(hourOffset, 0) + val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) + setFixedLocalTime(afterOffset) + setFixedLocale(Locale.GERMANY) + val startOfToday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) + val expectedCalendar = GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.GERMANY) + expectedCalendar.timeInMillis = startOfToday + val startOfTodayCalendar = DateUtils.getStartOfTodayCalendar() + assertThat(expectedCalendar, equalTo(startOfTodayCalendar)) + } + @Test @Throws(Exception::class) fun testGetTodayWithOffset() { From c12a6c6a4d3d398d73b6889dc29f23e74d05c14b Mon Sep 17 00:00:00 2001 From: sgallese Date: Wed, 22 Sep 2021 19:48:30 -0700 Subject: [PATCH 05/18] Complete tests for DateUtils, move internal functions to private --- .../org/isoron/uhabits/core/utils/DateUtils.kt | 11 ++--------- .../isoron/uhabits/core/utils/DateUtilsTest.kt | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 9 deletions(-) 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 e812bc2ca..8fe65ce9d 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 @@ -214,13 +214,7 @@ abstract class DateUtils { @JvmStatic fun getStartOfTodayCalendarWithOffset(): GregorianCalendar = getCalendar(getStartOfTodayWithOffset()) - @JvmStatic - fun getTimeZone(): TimeZone { - return fixedTimeZone ?: TimeZone.getDefault() - } - - @JvmStatic - fun getTimezone(): TimeZone { + private fun getTimeZone(): TimeZone { return fixedTimeZone ?: TimeZone.getDefault() } @@ -236,8 +230,7 @@ abstract class DateUtils { startDayMinuteOffset = minuteOffset } - @JvmStatic - fun getLocale(): Locale { + private fun getLocale(): Locale { return fixedLocale ?: Locale.getDefault() } 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 a3388b4f7..9076c27d4 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 @@ -274,6 +274,23 @@ class DateUtilsTest : BaseUnitTest() { assertThat(truncate(field, t2, firstWeekday), equalTo(expected)) } + @Test + fun testTruncate_timestamp() { + val field = DateUtils.TruncateField.YEAR + val nonTruncatedDate = unixTime(2016, Calendar.MAY, 30) + val expected = Timestamp(unixTime(2016, Calendar.JANUARY, 1)) + assertThat(expected, equalTo(truncate(field, Timestamp(nonTruncatedDate), firstWeekday))) + } + + @Test + fun testGetUpcomingTimeInMillis() { + setFixedLocalTime(FIXED_LOCAL_TIME) + setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val expected = unixTime(2015, Calendar.JANUARY, 25, 10, 1) + val upcomingTimeMillis = DateUtils.getUpcomingTimeInMillis(10, 1) + assertThat(expected, equalTo(upcomingTimeMillis)) + } + @Test @Throws(Exception::class) fun testMillisecondsUntilTomorrow() { From aae85c11707e5022410df5549623304fad610ff2 Mon Sep 17 00:00:00 2001 From: sgallese Date: Sun, 3 Oct 2021 21:10:44 -0700 Subject: [PATCH 06/18] Rename variable --- .../jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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..7c2c0a4fd 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 @@ -77,11 +77,11 @@ abstract class DateUtils { } @JvmStatic - fun getLocalTime(testTimeInMillis: Long? = null): Long { + fun getLocalTime(utcTimeInMillis: Long? = null): Long { if (fixedLocalTime != null) return fixedLocalTime as Long val tz = getTimeZone() - val now = testTimeInMillis ?: Date().time + val now = utcTimeInMillis ?: Date().time return now + tz.getOffset(now) } From 707b2b4380dc256c641d9fbc583ba4bc939560bf Mon Sep 17 00:00:00 2001 From: sgallese Date: Sun, 3 Oct 2021 21:19:04 -0700 Subject: [PATCH 07/18] Add test helper for hour offset --- .../uhabits/core/utils/DateUtilsTest.kt | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) 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..07c9dc631 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 @@ -144,9 +144,7 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetStartOfTomorrowWithOffset_priorToOffset() { - val hourOffset = 3 - setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val hourOffset = configureAndGetHourOffset() val startOfTomorrowWithOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset, 0) val priorToOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset - 1, 0) setFixedLocalTime(priorToOffset) @@ -156,9 +154,7 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetStartOfTomorrowWithOffset_afterOffset() { - val hourOffset = 3 - setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val hourOffset = configureAndGetHourOffset() val startOfTomorrowWithOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset, 0) val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) setFixedLocalTime(afterOffset) @@ -168,9 +164,7 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetStartOfTodayWithOffset_priorToOffset() { - val hourOffset = 3 - setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val hourOffset = configureAndGetHourOffset() val startOfYesterday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) val priorToOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset - 1, 0) setFixedLocalTime(priorToOffset) @@ -180,9 +174,7 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetStartOfTodayWithOffset_afterOffset() { - val hourOffset = 3 - setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) + val hourOffset = configureAndGetHourOffset() val startOfToday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) setFixedLocalTime(afterOffset) @@ -190,6 +182,13 @@ class DateUtilsTest : BaseUnitTest() { assertThat(startOfToday, equalTo(startOfTodayWithOffset)) } + private fun configureAndGetHourOffset(): Int { + val hourOffset = 3 + setStartDayOffset(hourOffset, 0) + setFixedTimeZone(TimeZone.getTimeZone("GMT")) + return hourOffset + } + @Test fun testTruncate_dayOfWeek() { val field = DateUtils.TruncateField.WEEK_NUMBER From 4fbf8a8ca287c87b3d835cc646ba3dd48490dc36 Mon Sep 17 00:00:00 2001 From: sgallese Date: Sun, 3 Oct 2021 22:01:42 -0700 Subject: [PATCH 08/18] DRYer offset tests --- .../uhabits/core/utils/DateUtilsTest.kt | 113 +++++++++--------- 1 file changed, 59 insertions(+), 54 deletions(-) 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 07c9dc631..75280ab9b 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 @@ -127,16 +127,16 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetStartOfDay() { - val expectedStartOfDayUtc = unixTime(2017, Calendar.JANUARY, 1, 0, 0) - val laterInTheDayUtc = unixTime(2017, Calendar.JANUARY, 1, 20, 0) + val expectedStartOfDayUtc = fixedStartOfToday() + val laterInTheDayUtc = fixedStartOfTodayWithOffset(20) val startOfDay = DateUtils.getStartOfDay(laterInTheDayUtc) assertThat(expectedStartOfDayUtc, equalTo(startOfDay)) } @Test fun testGetStartOfToday() { - val expectedStartOfDayUtc = unixTime(2017, Calendar.JANUARY, 1, 0, 0) - val laterInTheDayUtc = unixTime(2017, Calendar.JANUARY, 1, 20, 0) + val expectedStartOfDayUtc = fixedStartOfToday() + val laterInTheDayUtc = fixedStartOfTodayWithOffset(20) setFixedLocalTime(laterInTheDayUtc) val startOfToday = DateUtils.getStartOfToday() assertThat(expectedStartOfDayUtc, equalTo(startOfToday)) @@ -144,49 +144,42 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetStartOfTomorrowWithOffset_priorToOffset() { - val hourOffset = configureAndGetHourOffset() - val startOfTomorrowWithOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset, 0) - val priorToOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset - 1, 0) - setFixedLocalTime(priorToOffset) - val startOfTomorrow = DateUtils.getStartOfTomorrowWithOffset() - assertThat(startOfTomorrowWithOffset, equalTo(startOfTomorrow)) + val priorToOffset = HOUR_OFFSET - 1 + testGetStartOfTomorrowWithOffset(priorToOffset) } @Test fun testGetStartOfTomorrowWithOffset_afterOffset() { - val hourOffset = configureAndGetHourOffset() - val startOfTomorrowWithOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset, 0) - val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) - setFixedLocalTime(afterOffset) - val startOfTomorrow = DateUtils.getStartOfTomorrowWithOffset() - assertThat(startOfTomorrowWithOffset, equalTo(startOfTomorrow)) + val afterOffset = HOUR_OFFSET + 1 - HOURS_IN_ONE_DAY + testGetStartOfTomorrowWithOffset(afterOffset) + } + + private fun testGetStartOfTomorrowWithOffset(startOfTodayOffset: Int) { + configureOffsetTest(startOfTodayOffset) + assertThat( + fixedStartOfTodayWithOffset(HOUR_OFFSET), + equalTo(DateUtils.getStartOfTomorrowWithOffset()) + ) } @Test fun testGetStartOfTodayWithOffset_priorToOffset() { - val hourOffset = configureAndGetHourOffset() - val startOfYesterday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) - val priorToOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset - 1, 0) - setFixedLocalTime(priorToOffset) - val startOfTodayWithOffset = DateUtils.getStartOfTodayWithOffset() - assertThat(startOfYesterday, equalTo(startOfTodayWithOffset)) + val priorToOffset = HOURS_IN_ONE_DAY + HOUR_OFFSET - 1 + testGetStartOfTodayWithOffset(priorToOffset) } @Test fun testGetStartOfTodayWithOffset_afterOffset() { - val hourOffset = configureAndGetHourOffset() - val startOfToday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) - val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) - setFixedLocalTime(afterOffset) - val startOfTodayWithOffset = DateUtils.getStartOfTodayWithOffset() - assertThat(startOfToday, equalTo(startOfTodayWithOffset)) + val afterOffset = HOUR_OFFSET + 1 + testGetStartOfTodayWithOffset(afterOffset) } - private fun configureAndGetHourOffset(): Int { - val hourOffset = 3 - setStartDayOffset(hourOffset, 0) - setFixedTimeZone(TimeZone.getTimeZone("GMT")) - return hourOffset + private fun testGetStartOfTodayWithOffset(startOfTodayOffset: Int) { + configureOffsetTest(startOfTodayOffset) + assertThat( + fixedStartOfToday(), + equalTo(DateUtils.getStartOfTodayWithOffset()) + ) } @Test @@ -296,16 +289,16 @@ class DateUtilsTest : BaseUnitTest() { setFixedTimeZone(TimeZone.getTimeZone("GMT")) setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 1, 23, 59)) assertThat(millisecondsUntilTomorrowWithOffset(), equalTo(DateUtils.MINUTE_LENGTH)) - setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 1, 20, 0)) + setFixedLocalTime(fixedStartOfTodayWithOffset(20)) assertThat( millisecondsUntilTomorrowWithOffset(), equalTo(4 * DateUtils.HOUR_LENGTH) ) - setStartDayOffset(3, 30) + setStartDayOffset(HOUR_OFFSET, 30) setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 1, 23, 59)) assertThat( millisecondsUntilTomorrowWithOffset(), - equalTo(3 * DateUtils.HOUR_LENGTH + 31 * DateUtils.MINUTE_LENGTH) + equalTo(HOUR_OFFSET * DateUtils.HOUR_LENGTH + 31 * DateUtils.MINUTE_LENGTH) ) setFixedLocalTime(unixTime(2017, Calendar.JANUARY, 2, 1, 0)) assertThat( @@ -327,30 +320,37 @@ class DateUtilsTest : BaseUnitTest() { @Test fun testGetStartOfTodayCalendarWithOffset_priorToOffset() { - val hourOffset = 3 - setStartDayOffset(hourOffset, 0) - val priorToOffset = unixTime(2017, Calendar.JANUARY, 2, hourOffset - 1, 0) - setFixedLocalTime(priorToOffset) - setFixedLocale(Locale.GERMANY) - val startOfYesterday = unixTime(2017, Calendar.JANUARY, 2, 0, 0) - val expectedCalendar = GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.GERMANY) - expectedCalendar.timeInMillis = startOfYesterday - val startOfTodayCalendar = DateUtils.getStartOfTodayCalendar() - assertThat(expectedCalendar, equalTo(startOfTodayCalendar)) + val priorToOffset = HOUR_OFFSET - 1 + testGetStartOfTodayCalendarWithOffset(priorToOffset) } @Test fun testGetStartOfTodayCalendarWithOffset_afterOffset() { - val hourOffset = 3 - setStartDayOffset(hourOffset, 0) - val afterOffset = unixTime(2017, Calendar.JANUARY, 1, hourOffset + 1, 0) - setFixedLocalTime(afterOffset) + val afterOffset = HOUR_OFFSET + 1 + testGetStartOfTodayCalendarWithOffset(afterOffset) + } + + private fun testGetStartOfTodayCalendarWithOffset(startOfTodayOffset: Int) { + configureOffsetTest(startOfTodayOffset) setFixedLocale(Locale.GERMANY) - val startOfToday = unixTime(2017, Calendar.JANUARY, 1, 0, 0) val expectedCalendar = GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.GERMANY) - expectedCalendar.timeInMillis = startOfToday - val startOfTodayCalendar = DateUtils.getStartOfTodayCalendar() - assertThat(expectedCalendar, equalTo(startOfTodayCalendar)) + expectedCalendar.timeInMillis = fixedStartOfToday() + assertThat( + expectedCalendar, + equalTo(DateUtils.getStartOfTodayCalendar()) + ) + } + + private fun configureOffsetTest(startOfTodayOffset: Int) { + setStartDayOffset(HOUR_OFFSET, 0) + setFixedTimeZone(TimeZone.getTimeZone("GMT")) + setFixedLocalTime(fixedStartOfTodayWithOffset(startOfTodayOffset)) + } + + private fun fixedStartOfToday() = fixedStartOfTodayWithOffset(0) + + private fun fixedStartOfTodayWithOffset(hourOffset: Int): Long { + return unixTime(2017, Calendar.JANUARY, 1, hourOffset, 0) } @Test @@ -656,4 +656,9 @@ class DateUtilsTest : BaseUnitTest() { unixTime(2018, Calendar.APRIL, 1, 18, 0) ) } + + companion object { + const val HOUR_OFFSET = 3 + const val HOURS_IN_ONE_DAY = 24 + } } From 6531445d7f9ebdb6c4d0e79c89723f6654fac61e Mon Sep 17 00:00:00 2001 From: Jakub Kalinowski Date: Sun, 12 Sep 2021 18:22:55 +0200 Subject: [PATCH 09/18] Add delay after toggling a habit --- .../org/isoron/uhabits/acceptance/HabitsTest.kt | 5 +++++ .../activities/habits/list/views/HabitCardView.kt | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.kt index 171a9ed41..bfbdf3bb8 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.kt @@ -55,6 +55,7 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) @LargeTest class HabitsTest : BaseUserInterfaceTest() { + @Test @Throws(Exception::class) fun shouldCreateHabit() { @@ -180,6 +181,8 @@ class HabitsTest : BaseUserInterfaceTest() { longPressCheckmarks("Wake up early", count = 2) clickText("Wake up early") verifyShowsScreen(SHOW_HABIT) + // TODO: find a better way than sleeping in tests + Thread.sleep(2001L) verifyDisplaysText("10%") } @@ -194,6 +197,8 @@ class HabitsTest : BaseUserInterfaceTest() { verifyDoesNotDisplayText("Track time") verifyDisplaysText("Wake up early") longPressCheckmarks("Wake up early", count = 1) + // TODO: find a better way than sleeping in tests + Thread.sleep(2001L) verifyDoesNotDisplayText("Wake up early") clickMenu(TOGGLE_COMPLETED) verifyDisplaysText("Track time") diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index d6e7a2ad3..39260a637 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -36,6 +36,7 @@ import android.widget.TextView import org.isoron.platform.gui.toInt import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.RingView +import org.isoron.uhabits.activities.habits.list.views.HabitCardView.Companion.delay import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.ModelObservable import org.isoron.uhabits.core.models.Timestamp @@ -143,7 +144,11 @@ class HabitCardView( checkmarkPanel = checkmarkPanelFactory.create().apply { onToggle = { timestamp, value -> triggerRipple(timestamp) - habit?.let { behavior.onToggle(it, timestamp, value) } + habit?.let { + { + behavior.onToggle(it, timestamp, value) + }.delay(TOGGLE_DELAY_MILLIS) + } } } @@ -263,4 +268,12 @@ class HabitCardView( } innerFrame.setBackgroundResource(background) } + + companion object { + const val TOGGLE_DELAY_MILLIS = 2000L + + fun (() -> Unit).delay(delayInMillis: Long) { + Handler(Looper.getMainLooper()).postDelayed(this, delayInMillis) + } + } } From 9ddab6ee59ee550da5ea598260f9e2cbe40b1744 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 03:02:10 +0000 Subject: [PATCH 10/18] Bump com.github.johnrengelman.shadow from 7.0.0 to 7.1.0 Bumps com.github.johnrengelman.shadow from 7.0.0 to 7.1.0. --- updated-dependencies: - dependency-name: com.github.johnrengelman.shadow dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- uhabits-server/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uhabits-server/build.gradle.kts b/uhabits-server/build.gradle.kts index 8f0fc2554..2dd787bb4 100644 --- a/uhabits-server/build.gradle.kts +++ b/uhabits-server/build.gradle.kts @@ -22,7 +22,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { application id("kotlin") - id("com.github.johnrengelman.shadow") version "7.0.0" + id("com.github.johnrengelman.shadow") version "7.1.0" } From e3c53bf07fec1580667bce5c2bb077b8e9fee4d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 03:02:26 +0000 Subject: [PATCH 11/18] Bump daggerVersion from 2.39 to 2.40 Bumps `daggerVersion` from 2.39 to 2.40. Updates `dagger` from 2.39 to 2.40 - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/compare/dagger-2.39...dagger-2.40) Updates `dagger-compiler` from 2.39 to 2.40 - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/compare/dagger-2.39...dagger-2.40) --- updated-dependencies: - dependency-name: com.google.dagger:dagger dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.google.dagger:dagger-compiler dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- uhabits-android/build.gradle.kts | 2 +- uhabits-core/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 451e27583..3d97312e4 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -86,7 +86,7 @@ android { } dependencies { - val daggerVersion = "2.39" + val daggerVersion = "2.40" val kotlinVersion = "1.5.31" val kxCoroutinesVersion = "1.5.2" val ktorVersion = "1.6.4" diff --git a/uhabits-core/build.gradle.kts b/uhabits-core/build.gradle.kts index ae3a8b44f..c846a8888 100644 --- a/uhabits-core/build.gradle.kts +++ b/uhabits-core/build.gradle.kts @@ -43,7 +43,7 @@ kotlin { val jvmMain by getting { dependencies { implementation(kotlin("stdlib-jdk8")) - compileOnly("com.google.dagger:dagger:2.39") + compileOnly("com.google.dagger:dagger:2.40") implementation("com.google.guava:guava:31.0.1-android") implementation("org.jetbrains.kotlin:kotlin-stdlib:1.5.31") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.2") From b27f3f854014c4bcabb1f222c323d5cd93ac17aa Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Fri, 5 Nov 2021 20:02:34 +0100 Subject: [PATCH 12/18] Use the value of the Entry during CSV export Fixes #1162. --- .../java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt index 341b6716c..35e459a27 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitsCSVExporter.kt @@ -167,7 +167,7 @@ class HabitsCSVExporter( checksWriter.write(sb.toString()) scoresWriter.write(sb.toString()) for (j in selectedHabits.indices) { - checksWriter.write(checkmarks[j][i].toString()) + checksWriter.write(checkmarks[j][i].value.toString()) checksWriter.write(delimiter) val score = String.format(Locale.US, "%.4f", scores[j][i].value) scoresWriter.write(score) From 7776093217ea326e69acdd88f774da72abc9ae8a Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Fri, 5 Nov 2021 20:47:23 +0100 Subject: [PATCH 13/18] Test CSV export file content --- .../csv_export/001 Meditate/Checkmarks.csv | 0 .../test/csv_export/001 Meditate/Scores.csv | 1 + .../002 Wake up early/Checkmarks.csv | 10 +++++ .../csv_export/002 Wake up early/Scores.csv | 10 +++++ .../assets/test/csv_export/Checkmarks.csv | 11 +++++ .../assets/test/csv_export/Habits.csv | 3 ++ .../assets/test/csv_export/Scores.csv | 11 +++++ .../uhabits/core/io/HabitsCSVExporterTest.kt | 44 +++++++++++++------ 8 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 uhabits-core/assets/test/csv_export/001 Meditate/Checkmarks.csv create mode 100644 uhabits-core/assets/test/csv_export/001 Meditate/Scores.csv create mode 100644 uhabits-core/assets/test/csv_export/002 Wake up early/Checkmarks.csv create mode 100644 uhabits-core/assets/test/csv_export/002 Wake up early/Scores.csv create mode 100644 uhabits-core/assets/test/csv_export/Checkmarks.csv create mode 100644 uhabits-core/assets/test/csv_export/Habits.csv create mode 100644 uhabits-core/assets/test/csv_export/Scores.csv diff --git a/uhabits-core/assets/test/csv_export/001 Meditate/Checkmarks.csv b/uhabits-core/assets/test/csv_export/001 Meditate/Checkmarks.csv new file mode 100644 index 000000000..e69de29bb diff --git a/uhabits-core/assets/test/csv_export/001 Meditate/Scores.csv b/uhabits-core/assets/test/csv_export/001 Meditate/Scores.csv new file mode 100644 index 000000000..6004f60bc --- /dev/null +++ b/uhabits-core/assets/test/csv_export/001 Meditate/Scores.csv @@ -0,0 +1 @@ +2015-01-25,0.0000 diff --git a/uhabits-core/assets/test/csv_export/002 Wake up early/Checkmarks.csv b/uhabits-core/assets/test/csv_export/002 Wake up early/Checkmarks.csv new file mode 100644 index 000000000..89f788f68 --- /dev/null +++ b/uhabits-core/assets/test/csv_export/002 Wake up early/Checkmarks.csv @@ -0,0 +1,10 @@ +2015-01-25,2 +2015-01-24,0 +2015-01-23,1 +2015-01-22,2 +2015-01-21,2 +2015-01-20,2 +2015-01-19,1 +2015-01-18,1 +2015-01-17,2 +2015-01-16,2 diff --git a/uhabits-core/assets/test/csv_export/002 Wake up early/Scores.csv b/uhabits-core/assets/test/csv_export/002 Wake up early/Scores.csv new file mode 100644 index 000000000..7f4fa4780 --- /dev/null +++ b/uhabits-core/assets/test/csv_export/002 Wake up early/Scores.csv @@ -0,0 +1,10 @@ +2015-01-25,0.2557 +2015-01-24,0.2226 +2015-01-23,0.1991 +2015-01-22,0.1746 +2015-01-21,0.1379 +2015-01-20,0.0995 +2015-01-19,0.0706 +2015-01-18,0.0515 +2015-01-17,0.0315 +2015-01-16,0.0107 diff --git a/uhabits-core/assets/test/csv_export/Checkmarks.csv b/uhabits-core/assets/test/csv_export/Checkmarks.csv new file mode 100644 index 000000000..c0788570b --- /dev/null +++ b/uhabits-core/assets/test/csv_export/Checkmarks.csv @@ -0,0 +1,11 @@ +Date,Meditate,Wake up early, +2015-01-25,-1,2, +2015-01-24,-1,0, +2015-01-23,-1,1, +2015-01-22,-1,2, +2015-01-21,-1,2, +2015-01-20,-1,2, +2015-01-19,-1,1, +2015-01-18,-1,1, +2015-01-17,-1,2, +2015-01-16,-1,2, diff --git a/uhabits-core/assets/test/csv_export/Habits.csv b/uhabits-core/assets/test/csv_export/Habits.csv new file mode 100644 index 000000000..672189f33 --- /dev/null +++ b/uhabits-core/assets/test/csv_export/Habits.csv @@ -0,0 +1,3 @@ +Position,Name,Question,Description,NumRepetitions,Interval,Color +001,Meditate,Did you meditate this morning?,,1,1,#FF8F00 +002,Wake up early,Did you wake up before 6am?,,2,3,#00897B diff --git a/uhabits-core/assets/test/csv_export/Scores.csv b/uhabits-core/assets/test/csv_export/Scores.csv new file mode 100644 index 000000000..931c6c41c --- /dev/null +++ b/uhabits-core/assets/test/csv_export/Scores.csv @@ -0,0 +1,11 @@ +Date,Meditate,Wake up early, +2015-01-25,0.0000,0.2557, +2015-01-24,0.0000,0.2226, +2015-01-23,0.0000,0.1991, +2015-01-22,0.0000,0.1746, +2015-01-21,0.0000,0.1379, +2015-01-20,0.0000,0.0995, +2015-01-19,0.0000,0.0706, +2015-01-18,0.0000,0.0515, +2015-01-17,0.0000,0.0315, +2015-01-16,0.0000,0.0107, diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.kt index c6655bba6..c56bfe622 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.kt @@ -34,6 +34,7 @@ import java.util.zip.ZipFile class HabitsCSVExporterTest : BaseUnitTest() { private lateinit var baseDir: File + @Before @Throws(Exception::class) override fun setUp() { @@ -41,12 +42,7 @@ class HabitsCSVExporterTest : BaseUnitTest() { habitList.add(fixtures.createShortHabit()) habitList.add(fixtures.createEmptyHabit()) baseDir = Files.createTempDirectory("csv").toFile() - } - - @Throws(Exception::class) - override fun tearDown() { - FileUtils.deleteDirectory(baseDir) - super.tearDown() + baseDir.deleteOnExit() } @Test @@ -63,14 +59,20 @@ class HabitsCSVExporterTest : BaseUnitTest() { assertAbsolutePathExists(filename) val archive = File(filename) unzip(archive) - assertPathExists("Habits.csv") - assertPathExists("001 Meditate/Checkmarks.csv") - assertPathExists("001 Meditate/Scores.csv") - assertPathExists("002 Wake up early") - assertPathExists("002 Wake up early/Checkmarks.csv") - assertPathExists("002 Wake up early/Scores.csv") - assertPathExists("Checkmarks.csv") - assertPathExists("Scores.csv") + val filesToCheck = arrayOf( + "001 Meditate/Checkmarks.csv", + "001 Meditate/Scores.csv", + "002 Wake up early/Checkmarks.csv", + "002 Wake up early/Scores.csv", + "Checkmarks.csv", + "Habits.csv", + "Scores.csv" + ) + + for (file in filesToCheck) { + assertPathExists(file) + assertFileAndReferenceAreEqual(file) + } } @Throws(IOException::class) @@ -104,4 +106,18 @@ class HabitsCSVExporterTest : BaseUnitTest() { file.exists() ) } + + private fun assertFileAndReferenceAreEqual(s: String) { + val assetFilename = String.format("csv_export/%s", s) + val file = File.createTempFile("asset", "") + file.deleteOnExit() + copyAssetToFile(assetFilename, file) + + assertTrue( + FileUtils.contentEquals( + file, + File(String.format("%s/%s", baseDir.absolutePath, s)) + ) + ) + } } From d553c2f3f2ba1686427c2331694e0aa3b4c68700 Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Fri, 5 Nov 2021 20:48:16 +0100 Subject: [PATCH 14/18] Delete unused test resources --- .../src/jvmTest/resources/databases/021.db | Bin 32768 -> 0 bytes .../src/jvmTest/resources/databases/022.db | Bin 32768 -> 0 bytes .../src/jvmTest/resources/habitbull.csv | 19 ------------------ uhabits-core/src/jvmTest/resources/loop.db | Bin 53248 -> 0 bytes uhabits-core/src/jvmTest/resources/rewire.db | Bin 57344 -> 0 bytes .../src/jvmTest/resources/tickmate.db | Bin 32768 -> 0 bytes 6 files changed, 19 deletions(-) delete mode 100644 uhabits-core/src/jvmTest/resources/databases/021.db delete mode 100644 uhabits-core/src/jvmTest/resources/databases/022.db delete mode 100644 uhabits-core/src/jvmTest/resources/habitbull.csv delete mode 100644 uhabits-core/src/jvmTest/resources/loop.db delete mode 100644 uhabits-core/src/jvmTest/resources/rewire.db delete mode 100644 uhabits-core/src/jvmTest/resources/tickmate.db diff --git a/uhabits-core/src/jvmTest/resources/databases/021.db b/uhabits-core/src/jvmTest/resources/databases/021.db deleted file mode 100644 index 850479ca0fd42a28698f5ee787fffad1bb357821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI*O>Y}T00!V0JIUIPorOx(Di<`ZL5)>MYKsszpahFlR0x_NTB(w?-JRI0taqK= zaYzJ0aw>7+4;GDaT3`;>OIZcl})j2?0spb-eM;_dGK@&M1nr z_3=$laJCah9b2&1$xDP%@(yE!5JNr-@|hl%e6cXNP~lWQ&kwHWeKW}Vliw@F@5qvI zOw1pQh8}+C>kdJefbMrDI90Cx400bZafxjbgeg{ zM4X%#Hf}YpZ#UTX^>=SJSQ5t8nCCJt5WK}B){VT59UZb=e#q>e2))3Gc!vj~&g{r( zd;2^~TW3z_hf$if&RiZlk=GSo7%;&PWR{(X?=@W>4Abb4pw}6Ow7pi_mrpSa3hWLa zl+X=hPZv07V4cb4c!A5KW;^VSRGtOP*t8@zlG?Qo<19P~1q*tju%i|i&6B3vxBVWM?X`V2RiP}c7kEPVays_n#oF?ZFd&9L~nffUgNeL$mw)Ujz*GpP3NsMnYp$s%hx~O`4z)@+oFAQ zSdkM(d{B?@Iy@G3r@N&Bm!>P5l~&iNBGL-8QfmE$l3{&NrTt4;brJ7!p~pC$tn}6} zYP#y@DwMvgR^er-ycI2focC(B`ocNB>-r0kJu2!>=n>MV@>s)l&_CPcSPib8*fW}6 zTlto@)cSLDDQTCUr^yT~jJHh3%xYS{xT2S^en%J4*p~}XoSestNWx|nF>?uIGr871XVLtWE?MjA)X}z(|}Q%=RsJ*h|>5P$##AOHaf zKmY;|fB*y_009X6{{3VX@0ek ze4au{_9|~aB<4f&iTUi*b`cGS00bZa0SG_<0uX=z1Rwwb2)wug%L|1?O7A}So{{|E z^-sTiL2@M-UZi(_e)=m>zyHsh^0WD$nvdl-91ws21Rwwb2tWV=5P$##AOHafoEm|0 zevxEb|6DmYxYC>dG96s0?SD?~|K&gZ!vO&ZKmY;|fB*y_009U<00Izzz!?_!3q+6` A@&Et; diff --git a/uhabits-core/src/jvmTest/resources/databases/022.db b/uhabits-core/src/jvmTest/resources/databases/022.db deleted file mode 100644 index 01237dfc8d4234f74a2cefe6f405f55b8bb01218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)&u$w<90%|jJBimO&Zd#56$zwKbFo#oP&o7mrL{yvRgurK{98~KE6^j&9HyYtVppZV=Xn|S?T z@2=E>^+V-z&E6-Qgi`V$V}y{)X0^xoEjeu5bQRuYO0?DksGL zp>ndZTi>evS$kZ2T;IxH7d3!92tWV=5P$##<`ww*cB#_X-lpGh&7XMUWBx?yDBG^w zzTdgk?Xd2xkM4F@md2V)x=aRI90y1;F(pQB?a6UlNN?yB+~{b z9c(kx9T~VnIfF1Ry!mOe$<140h0-n`MW^XOs96wup6PO*$DU?4-n-dmdNdTTFY>M_ zz}11!&b;N0xEBl4U+%GUZ)jSJ1F6%qJfC~zO6!eh4nvqiMm1)O_nxq z1}$&DHSXAz#?B7?YA?Mo3WW>1Yg3m2U}R}?$HZw6=A+zZCh8-8 zkk50GP)BA?E6l{Ljc>`1OTzhSd988vD*Y@)iw-?=SLsCJFiyjL`fzoMai(lDnfcqM zX3N}Rt}pb-2mf8~9@4eOwQIDO>hi!

!QzXzrTd@UzF|Dc{*#*7U+2_XO*99(7yE zO?-MM|H@4%$$jl6$;1Ky2tWV=5P$##AOHafKmY;|fWYDl)J+$u{Wmc`SReoa2tWV= z5P$##AOHafKmY;|_m#`=SY zlbx+Yw{HJs?*E??`?>wwBAp=m0s#m>00Izz00bZa0SG_<0uX?}#R4`h@6f{6mXxcd z@^&@*svlExvsgR({QnDLzp#I`Pl`F%hX4d1009U<00Izz00bZa0SG`~c?H(#DzR26 z4ZrCBPD(X%BGi6K?3eZ*_AkqOR_HkdAOHafKmY;|fB*y_009U<00J`twH0f%n*9MF k`Tzg)Cjw^5;t&E5fB*y_009U<00Izz00bZafu$Gt7dP<8fB*mh diff --git a/uhabits-core/src/jvmTest/resources/habitbull.csv b/uhabits-core/src/jvmTest/resources/habitbull.csv deleted file mode 100644 index 977a8e8df..000000000 --- a/uhabits-core/src/jvmTest/resources/habitbull.csv +++ /dev/null @@ -1,19 +0,0 @@ -HabitName,HabitDescription,HabitCategory,CalendarDate,Value,CommentText -Breed dragons,with love and fire,Diet & Food,2016-03-18,1, -Breed dragons,with love and fire,Diet & Food,2016-03-19,1, -Breed dragons,with love and fire,Diet & Food,2016-03-21,1, -Reduce sleep,only 2 hours per day,Time Management,2016-03-15,1, -Reduce sleep,only 2 hours per day,Time Management,2016-03-16,1, -Reduce sleep,only 2 hours per day,Time Management,2016-03-17,1, -Reduce sleep,only 2 hours per day,Time Management,2016-03-21,1, -No-arms pushup,Become like water my friend!,Fitness,2016-03-15,1, -No-arms pushup,Become like water my friend!,Fitness,2016-03-16,1, -No-arms pushup,Become like water my friend!,Fitness,2016-03-18,1, -No-arms pushup,Become like water my friend!,Fitness,2016-03-21,1, -No-arms pushup,Become like water my friend!,Fitness,2016-03-15,1, -No-arms pushup,Become like water my friend!,Fitness,2016-03-16,1, -No-arms pushup,Become like water my friend!,Fitness,2016-03-18,1, -No-arms pushup,Become like water my friend!,Fitness,2016-03-21,1, -Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-15,1, -Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-17,1, -Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-21,1, diff --git a/uhabits-core/src/jvmTest/resources/loop.db b/uhabits-core/src/jvmTest/resources/loop.db deleted file mode 100644 index 25f0f32cd9471930dac3dc90ec784e8a69f73588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 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 Date: Wed, 29 Sep 2021 06:37:06 -0500 Subject: [PATCH 15/18] Small tweaks to checkmark size --- .../render_implicit_check.png | Bin 1054 -> 1227 bytes .../habits/list/views/CheckmarkButtonView.kt | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/uhabits-android/src/androidTest/assets/views/habits/list/CheckmarkButtonView/render_implicit_check.png b/uhabits-android/src/androidTest/assets/views/habits/list/CheckmarkButtonView/render_implicit_check.png index 86e6a540609cb2ef1622c4125d6126be24e601ae..c45314e037b683bbeb91d9be236b259699766f0a 100644 GIT binary patch delta 1207 zcmV;o1W5ay2+IkOB!2{RLP=Bz2nYy#2xN!=00e?bL_t(|obB0vXw-Ea$MNU;ySw2{ z%Rln>xhOT;-Az*`XyGDSq0C8hMpQ(C6#Y>e7=ea=MnMtPU(p|e1re;ao!#wpEPo~u zxZIp_idcaXh*@q!x7_`B_s4BIchk+e+kI#6$6xz?_x-~A^M88r`QE-aFvb{Tj4{R- zV~jDz7-Nhv#u#IaF~%5Uj4{R-V~jDzm{F5_50FcdNa(?YuuD{zgLET$sL1Qtw0d>> z)qKy^@18AS_nt==r;`Qy5Scdcyeg+B7ZxmcO9@WC2grrGNMKnyWbd4Ht-$C3x~JSG61d=D_z>LP(N}QI^^Ku5c^ntGhYF~R1y)K* znuiMi28RXnUb}Imx@=sB9D?f}LE*-dMXFMvFxf#4SASQ^;HGriX#wX`!FgYi!{JEqqubpRjt0wBW$#GB@8~?quWj#S z4wP;@PHe2#aHm{TKtnY6iXb~hq;TMQ6?wNl8v0f>`%mVENU%ax_97IGB>bbt-l8|r z38;#rTYsxppFE$F#oPf`6cBCrffpMZL*EZ9p&=5i zP$4?9@K4+nKIog(YvW($d|@My_ZP8nQ)#jG>S=_cBA=h-OF!qnDf0nHCa=)izMYGg zj$|%YqQ$c()ttZB^Ngmc7i7}N!ry#T`0J}qeSa}Ns~cY4cYr2RRR~1@WlKJ}9zKA_ zGliv#KV-(VRhbh))wv5jU78{~%J5%zQ~2P50>HWcRe{epC+oL^OUMK-&T!#h?rgsv zzACA{@OS2B4WpO$0z_%+|M~Qp&q${eS=VHhFoN(~j%^tj{zf;34=(r&0BDE?e*swm zP=D;Np){}!$MI%emrP!v?Zgg>{nd9Ae$Bf0H#uFvU2sJKjg6sMy{d;m7Q*dIP)#B- z^!sD~V<(a5%7icaQcYF-yWCEHcU(~bKrFUk`n7c7L69IovA>$qz;+y`@b)+Mx!iG_ zqpe#=B)R~SioWdj@WBP20sSf~&;I45V1Jb=#{tg&8Rq1v4@jqbhrKr|e9`A8LipgK z9ni0~dEQj-HQzp<44~Nm9HoKxZn+bN41aBW_xMeGcU)HhKvUD=$=$uFW`xH9=FVBi zqTr6K5-xYNakTaAzGuGn;_$*m3Ljir06^`}bA8@_?r#DqhwKsthc5+Gudj^n$$#t6 zqu|;C0BUPPgeE|Rm4&dpy8a&efvX-G;D!e+;p811Khynmqk=@bY26YH& zS}v(1_H3v+^LxJMGR7EVj4{R-V=#;{#u#IaF~%5Uj4{R-V~jDz7-Nhv#u)Se^&eG) V&^>E@I;j8v002ovPDHLkV1l%cRyY6v delta 1033 zcmX@jIgew4NGZx^prw85kH?ik&<|IDnvrBc+3Zf%$}|i(^Q|oVPdb=Le_C zuzh&`yG+m^(QUWxv9g#OIc2WqVTL!G3>6vGKC8z*5_&w9P3YZMFNZ*Vg=5)zKbTDv zbrsfiWJYXi@nCuslWT2SaWG7vtY9jZ`obwG2mzv$@i;%1G#9ES8vzH9@={Hdtjm1g2u?4H95vV zXI==gUJ&<#;ljmj%ztZ-GknhoIosaWqqA*QCRc>_k9prdT$+4b@b3P+?k^XUJ{=7| z1$4t7>8gXjPtB-W`r&QV`snN*3<3Lg)|W&F?)V`v?caelKY2XTtJ#hOE@$b`le_Y( zdhf}~w{_=V96NkI$>{&W>gokkso*jIDAI;^hs{hgOQg*>p_xJBVo!uCkw)PI^ zx?d0Lb8CMv2pIi*6kl7ZZvU(7_zH%%+u!*-xacdmC9m#S`Z9$-E<#MLJNK`@##_Iv zMl86s|8C>ahs2XRqy!Q6vQtygC8{?ezXy{{_j);GDt9$AwDL!UF+2!Alvv^xwEEnB!`Y7eB+h(bO;gy%YQZH0z&i?D-P~FE@pqE90FqP5!!rr*?Yvgv0Di8DTw#!$&_ayYB3Q3#8nr=NCU_Z&}A~56tQep00i_>ztSpngFb-?6v>^ diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt index 339cc46b4..71fc18bd8 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt @@ -37,9 +37,9 @@ import org.isoron.uhabits.core.models.Entry.Companion.YES_AUTO import org.isoron.uhabits.core.models.Entry.Companion.YES_MANUAL import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.inject.ActivityContext -import org.isoron.uhabits.utils.dim import org.isoron.uhabits.utils.getFontAwesome import org.isoron.uhabits.utils.showMessage +import org.isoron.uhabits.utils.sp import org.isoron.uhabits.utils.sres import org.isoron.uhabits.utils.toMeasureSpec import javax.inject.Inject @@ -145,6 +145,11 @@ class CheckmarkButtonView( } else -> R.string.fa_check } + paint.textSize = when { + id == R.string.fa_question -> sp(12.0f) + value == YES_AUTO -> sp(13.0f) + else -> sp(14.0f) + } if (value == YES_AUTO) { paint.strokeWidth = 5f paint.style = Paint.Style.STROKE @@ -153,11 +158,6 @@ class CheckmarkButtonView( paint.style = Paint.Style.FILL } - paint.textSize = when (id) { - UNKNOWN -> dim(R.dimen.smallerTextSize) - else -> dim(R.dimen.smallTextSize) - } - val label = resources.getString(id) val em = paint.measureText("m") From bf63b4dbcfe35d608ad9e2021a564882881697f0 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 6 Nov 2021 06:50:28 -0500 Subject: [PATCH 16/18] Remove HabitMatcherBuilder --- .../uhabits/automation/EditSettingActivity.kt | 10 ++-- .../isoron/uhabits/core/models/HabitList.kt | 2 +- .../uhabits/core/models/HabitMatcher.kt | 8 ++-- .../core/models/HabitMatcherBuilder.kt | 48 ------------------- .../habits/list/ListHabitsMenuBehavior.kt | 9 ++-- .../uhabits/core/models/HabitListTest.kt | 18 +++---- .../core/models/sqlite/SQLiteHabitListTest.kt | 12 ++--- 7 files changed, 29 insertions(+), 78 deletions(-) delete mode 100644 uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.kt index c40335545..6361397ef 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.kt @@ -23,17 +23,17 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.activities.AndroidThemeSwitcher -import org.isoron.uhabits.core.models.HabitMatcherBuilder +import org.isoron.uhabits.core.models.HabitMatcher class EditSettingActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val app = applicationContext as HabitsApplication val habits = app.component.habitList.getFiltered( - HabitMatcherBuilder() - .setArchivedAllowed(false) - .setCompletedAllowed(true) - .build() + HabitMatcher( + isArchivedAllowed = false, + isCompletedAllowed = true, + ) ) AndroidThemeSwitcher(this, app.component.preferences).apply() diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt index 69b738dda..74ee0a700 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt @@ -43,7 +43,7 @@ abstract class HabitList : Iterable { */ constructor() { observable = ModelObservable() - filter = HabitMatcherBuilder().setArchivedAllowed(true).build() + filter = HabitMatcher(isArchivedAllowed = true) } protected constructor(filter: HabitMatcher) { diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt index f26e00006..7e87e2efb 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt @@ -32,9 +32,9 @@ data class HabitMatcher( companion object { @JvmField - val WITH_ALARM = HabitMatcherBuilder() - .setArchivedAllowed(true) - .setReminderRequired(true) - .build() + val WITH_ALARM = HabitMatcher( + isArchivedAllowed = true, + isReminderRequired = true, + ) } } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt deleted file mode 100644 index c9f1a7f7e..000000000 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.kt +++ /dev/null @@ -1,48 +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.uhabits.core.models - -class HabitMatcherBuilder { - private var archivedAllowed = false - private var reminderRequired = false - private var completedAllowed = true - - fun build(): HabitMatcher { - return HabitMatcher( - isArchivedAllowed = archivedAllowed, - isReminderRequired = reminderRequired, - isCompletedAllowed = completedAllowed, - ) - } - - fun setArchivedAllowed(archivedAllowed: Boolean): HabitMatcherBuilder { - this.archivedAllowed = archivedAllowed - return this - } - - fun setCompletedAllowed(completedAllowed: Boolean): HabitMatcherBuilder { - this.completedAllowed = completedAllowed - return this - } - - fun setReminderRequired(reminderRequired: Boolean): HabitMatcherBuilder { - this.reminderRequired = reminderRequired - return this - } -} diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt index d538f1950..cc04ea492 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt @@ -20,7 +20,6 @@ package org.isoron.uhabits.core.ui.screens.habits.list import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.HabitMatcher -import org.isoron.uhabits.core.models.HabitMatcherBuilder import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.ui.ThemeSwitcher import javax.inject.Inject @@ -99,10 +98,10 @@ class ListHabitsMenuBehavior @Inject constructor( private fun updateAdapterFilter() { adapter.setFilter( - HabitMatcherBuilder() - .setArchivedAllowed(showArchived) - .setCompletedAllowed(showCompleted) - .build() + HabitMatcher( + isArchivedAllowed = showArchived, + isCompletedAllowed = showCompleted, + ) ) adapter.refresh() } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.kt index 7f67d3adf..0d2314be5 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.kt @@ -53,12 +53,12 @@ class HabitListTest : BaseUnitTest() { habitsArray[1].isArchived = true habitsArray[4].isArchived = true habitsArray[7].isArchived = true - activeHabits = habitList.getFiltered(HabitMatcherBuilder().build()) + activeHabits = habitList.getFiltered(HabitMatcher()) reminderHabits = habitList.getFiltered( - HabitMatcherBuilder() - .setArchivedAllowed(true) - .setReminderRequired(true) - .build() + HabitMatcher( + isArchivedAllowed = true, + isReminderRequired = true, + ) ) } @@ -181,10 +181,10 @@ class HabitListTest : BaseUnitTest() { fun testOrder_inherit() { habitList.primaryOrder = HabitList.Order.BY_COLOR_ASC val filteredList = habitList.getFiltered( - HabitMatcherBuilder() - .setArchivedAllowed(false) - .setCompletedAllowed(false) - .build() + HabitMatcher( + isArchivedAllowed = false, + isCompletedAllowed = false, + ) ) assertEquals(filteredList.primaryOrder, HabitList.Order.BY_COLOR_ASC) } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.kt index 59ee7a585..d5a551012 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.kt @@ -28,7 +28,7 @@ import org.isoron.uhabits.core.database.Database import org.isoron.uhabits.core.database.Repository import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList -import org.isoron.uhabits.core.models.HabitMatcherBuilder +import org.isoron.uhabits.core.models.HabitMatcher import org.isoron.uhabits.core.models.ModelObservable import org.isoron.uhabits.core.models.Reminder import org.isoron.uhabits.core.models.WeekdayList @@ -69,12 +69,12 @@ class SQLiteHabitListTest : BaseUnitTest() { habitsArray[4].isArchived = true habitsArray[7].isArchived = true habitList.update(habitsArray) - activeHabits = habitList.getFiltered(HabitMatcherBuilder().build()) + activeHabits = habitList.getFiltered(HabitMatcher()) reminderHabits = habitList.getFiltered( - HabitMatcherBuilder() - .setArchivedAllowed(true) - .setReminderRequired(true) - .build() + HabitMatcher( + isArchivedAllowed = true, + isReminderRequired = true, + ) ) habitList.observable.addListener(listener) } From b62e436054ea95a8b60f089f52c4b9d4a395cd47 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 6 Nov 2021 07:16:24 -0500 Subject: [PATCH 17/18] Fix "hide completed" for numerical habits Fixes #1179 --- .../habits/list/ListHabitsActivity.kt | 1 + .../activities/habits/list/ListHabitsMenu.kt | 2 +- .../org/isoron/uhabits/core/models/Habit.kt | 11 ++---- .../uhabits/core/models/HabitMatcher.kt | 4 ++- .../habits/list/ListHabitsMenuBehavior.kt | 24 ++++++++++--- .../isoron/uhabits/core/models/HabitTest.kt | 35 ++----------------- 6 files changed, 29 insertions(+), 48 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index f8d1ef477..22fd1b42e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -53,6 +53,7 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { override fun onQuestionMarksChanged() { invalidateOptionsMenu() + menu.behavior.onPreferencesChanged() } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt index c92d0dd3f..a70008d13 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt @@ -39,7 +39,7 @@ class ListHabitsMenu @Inject constructor( @ActivityContext context: Context, private val preferences: Preferences, private val themeSwitcher: ThemeSwitcher, - private val behavior: ListHabitsMenuBehavior + val behavior: ListHabitsMenuBehavior ) { val activity = (context as AppCompatActivity) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt index 20c3d7949..68bbabc08 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt @@ -68,17 +68,10 @@ data class Habit( } } - fun isFailedToday(): Boolean { + fun isEnteredToday(): Boolean { val today = DateUtils.getTodayWithOffset() val value = computedEntries.get(today).value - return if (isNumerical) { - when (targetType) { - NumericalHabitType.AT_LEAST -> value / 1000.0 < targetValue - NumericalHabitType.AT_MOST -> value / 1000.0 > targetValue - } - } else { - value == Entry.NO - } + return value != Entry.UNKNOWN } fun recompute() { diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt index 7e87e2efb..ed6bc023b 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitMatcher.kt @@ -22,11 +22,13 @@ data class HabitMatcher( val isArchivedAllowed: Boolean = false, val isReminderRequired: Boolean = false, val isCompletedAllowed: Boolean = true, + val isEnteredAllowed: Boolean = true, ) { fun matches(habit: Habit): Boolean { if (!isArchivedAllowed && habit.isArchived) return false if (isReminderRequired && !habit.hasReminder()) return false - if (!isCompletedAllowed && (habit.isCompletedToday() || habit.isFailedToday())) return false + if (!isCompletedAllowed && habit.isCompletedToday()) return false + if (!isEnteredAllowed && habit.isEnteredToday()) return false return true } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt index cc04ea492..deb42e384 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt @@ -32,6 +32,7 @@ class ListHabitsMenuBehavior @Inject constructor( ) { private var showCompleted: Boolean private var showArchived: Boolean + fun onCreateHabit() { screen.showSelectHabitTypeDialog() } @@ -96,13 +97,26 @@ class ListHabitsMenuBehavior @Inject constructor( screen.applyTheme() } + fun onPreferencesChanged() { + updateAdapterFilter() + } + private fun updateAdapterFilter() { - adapter.setFilter( - HabitMatcher( - isArchivedAllowed = showArchived, - isCompletedAllowed = showCompleted, + if (preferences.areQuestionMarksEnabled) { + adapter.setFilter( + HabitMatcher( + isArchivedAllowed = showArchived, + isEnteredAllowed = showCompleted, + ) ) - ) + } else { + adapter.setFilter( + HabitMatcher( + isArchivedAllowed = showArchived, + isCompletedAllowed = showCompleted, + ) + ) + } adapter.refresh() } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitTest.kt index 5ba6ced1f..da568adf2 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitTest.kt @@ -82,12 +82,12 @@ class HabitTest : BaseUnitTest() { @Test @Throws(Exception::class) - fun test_isFailed() { + fun test_isEntered() { val h = modelFactory.buildHabit() - assertFalse(h.isFailedToday()) + assertFalse(h.isEnteredToday()) h.originalEntries.add(Entry(getToday(), Entry.NO)) h.recompute() - assertTrue(h.isFailedToday()) + assertTrue(h.isEnteredToday()) } @Test @@ -119,35 +119,6 @@ class HabitTest : BaseUnitTest() { assertTrue(h.isCompletedToday()) } - @Test - @Throws(Exception::class) - fun test_isFailedNumerical() { - val h = modelFactory.buildHabit() - h.type = HabitType.NUMERICAL - h.targetType = NumericalHabitType.AT_LEAST - h.targetValue = 100.0 - assertTrue(h.isFailedToday()) - h.originalEntries.add(Entry(getToday(), 200000)) - h.recompute() - assertFalse(h.isFailedToday()) - h.originalEntries.add(Entry(getToday(), 100000)) - h.recompute() - assertFalse(h.isFailedToday()) - h.originalEntries.add(Entry(getToday(), 50000)) - h.recompute() - assertTrue(h.isFailedToday()) - h.targetType = NumericalHabitType.AT_MOST - h.originalEntries.add(Entry(getToday(), 200000)) - h.recompute() - assertTrue(h.isFailedToday()) - h.originalEntries.add(Entry(getToday(), 100000)) - h.recompute() - assertFalse(h.isFailedToday()) - h.originalEntries.add(Entry(getToday(), 50000)) - h.recompute() - assertFalse(h.isFailedToday()) - } - @Test @Throws(Exception::class) fun testURI() { From 64337b9bee2fa03f9e7144c1aaa9fe5103858247 Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Mon, 8 Nov 2021 19:11:31 +0100 Subject: [PATCH 18/18] Bump AGP from 7.0.2 to 7.0.3 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8b4bfc046..675df891e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ plugins { val kotlinVersion = "1.5.0" - id("com.android.application") version ("7.0.2") apply (false) + id("com.android.application") version ("7.0.3") apply (false) id("org.jetbrains.kotlin.android") version kotlinVersion apply (false) id("org.jetbrains.kotlin.kapt") version kotlinVersion apply (false) id("org.jetbrains.kotlin.android.extensions") version kotlinVersion apply (false)