diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/WeekdayList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/WeekdayList.kt index 212e8cee2..abdc00ec1 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/WeekdayList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/WeekdayList.kt @@ -34,7 +34,7 @@ class WeekdayList { } } - constructor(weekdays: BooleanArray?) { + constructor(weekdays: BooleanArray) { this.weekdays = Arrays.copyOf(weekdays, 7) } @@ -89,5 +89,6 @@ class WeekdayList { companion object { val EVERY_DAY = WeekdayList(127) val NO_DAY = WeekdayList(booleanArrayOf(false, false, false, false, false, false, false)) + val WEEKENDS = WeekdayList(booleanArrayOf(true, true, false, false, false, false, false)) } } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/SkipDaysTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/SkipDaysTest.kt new file mode 100644 index 000000000..c39f49c84 --- /dev/null +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/SkipDaysTest.kt @@ -0,0 +1,85 @@ +package org.isoron.uhabits.core.models + +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat +import org.isoron.uhabits.core.BaseUnitTest +import org.isoron.uhabits.core.preferences.Preferences +import org.isoron.uhabits.core.preferences.PropertiesStorage +import org.isoron.uhabits.core.ui.screens.habits.show.views.TargetCardPresenter +import org.isoron.uhabits.core.ui.views.LightTheme +import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday +import org.junit.Test +import java.io.File + +class SkipDaysTest : BaseUnitTest() { + private lateinit var preferences: Preferences + private lateinit var storage: PropertiesStorage + private lateinit var today: Timestamp + private lateinit var monday: Timestamp + +// private val themeSwitcher: ThemeSwitcher = mock() + private val theme = LightTheme() + + @Throws(Exception::class) + override fun setUp() { + super.setUp() + val file = File.createTempFile("prefs", ".properties") + file.deleteOnExit() + storage = PropertiesStorage(file) + preferences = Preferences(storage) + preferences.isSkipEnabled = true + today = getToday() + monday = today.plus(2 - today.weekday) + } + + @Test + @Throws(Exception::class) + fun streakWithSkip() { + val h = modelFactory.buildHabit() + h.skipDays = SkipDays(true, WeekdayList.WEEKENDS) + h.originalEntries.add(Entry(monday, Entry.YES_MANUAL)) + h.originalEntries.add(Entry(monday.minus(3), Entry.YES_MANUAL)) + h.recompute() + assertThat(h.streaks.getBest(1)[0].length, equalTo(4)) + } + + @Test + @Throws(Exception::class) + fun ignoreSkipDays() { + val h = modelFactory.buildHabit() + h.skipDays = SkipDays(true, WeekdayList.WEEKENDS) + h.originalEntries.add(Entry(monday.minus(1), Entry.YES_MANUAL)) + h.recompute() + assertThat(h.computedEntries.getKnown().size, equalTo(0)) + } + + @Test + @Throws(Exception::class) + fun targetCardWithSkips() { + val h = Habit( + skipDays = SkipDays(true, WeekdayList(booleanArrayOf(false, false, false, true, true, false, false))), + type = HabitType.NUMERICAL, + frequency = Frequency.WEEKLY, + targetValue = 40.0, + computedEntries = modelFactory.buildComputedEntries(), + originalEntries = modelFactory.buildOriginalEntries(), + streaks = modelFactory.buildStreakList(), + scores = modelFactory.buildScoreList() + ) + h.recompute() + var target = TargetCardPresenter.buildState( + habit = h, + firstWeekday = preferences.firstWeekdayInt, + theme = theme + ) + assertThat(target.targets, equalTo(arrayListOf(40.0, 160.0, 520.0, 2080.0))) + h.originalEntries.add(Entry(today, Entry.SKIP)) + h.recompute() + target = TargetCardPresenter.buildState( + habit = h, + firstWeekday = preferences.firstWeekdayInt, + theme = theme + ) + assertThat(target.targets, equalTo(arrayListOf(32.0, 152.0, 512.0, 2072.0))) + } +}