From f6754ff180a66ee78be2f625725b8fd16692d596 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Fri, 25 Dec 2020 13:14:27 -0600 Subject: [PATCH] Implement Entries.getValues --- .../org/isoron/uhabits/core/models/Entries.kt | 20 ++++++++++++++++++ .../isoron/uhabits/core/models/EntriesTest.kt | 21 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Entries.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Entries.kt index 62eeb33b9..2482293cd 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Entries.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Entries.kt @@ -174,6 +174,26 @@ open class Entries { return map } + /** + * Returns the values of the entries that fall inside a certain interval of time. The values + * are returned in an array containing one integer value for each day of the interval. The + * first entry corresponds to the most recent day in the interval. Each subsequent entry + * corresponds to one day older than the previous entry. The boundaries of the time interval + * are included. + */ + fun getValues(from: Timestamp, to: Timestamp): IntArray { + if (from.isNewerThan(to)) throw IllegalArgumentException() + val nDays = from.daysUntil(to) + 1 + val result = IntArray(nDays) { UNKNOWN } + getKnown().filter { entry -> + !entry.timestamp.isNewerThan(to) && !entry.timestamp.isOlderThan(from) + }.forEach { entry -> + val offset = entry.timestamp.daysUntil(to) + result[offset] = entry.value + } + return result + } + data class Interval(val begin: Timestamp, val center: Timestamp, val end: Timestamp) { val length: Int get() = begin.daysUntil(end) + 1; diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntriesTest.kt b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntriesTest.kt index 9c57a7d2d..ad78abeb1 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntriesTest.kt +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntriesTest.kt @@ -64,6 +64,27 @@ class EntriesTest { assertEquals(Entry(today.minus(5), 20), actual[5]) } + @Test + fun testGetValues() { + val entries = Entries() + val today = DateUtils.getToday() + + entries.add(Entry(today.minus(3), YES_MANUAL)) + entries.add(Entry(today.minus(5), YES_MANUAL)) + entries.add(Entry(today.minus(6), YES_MANUAL)) + + val expected = intArrayOf( + UNKNOWN, // 1 + UNKNOWN, // 2 + YES_MANUAL, // 3 + UNKNOWN, // 4 + YES_MANUAL, // 5 + YES_MANUAL, // 6 + UNKNOWN, // 7 + ) + assertThat(entries.getValues(today.minus(7), today.minus(1)), equalTo(expected)) + } + @Test fun testComputeBoolean() { val today = DateUtils.getToday()