@@ -130,6 +130,38 @@ class AapsV3InsulinInventoryTest {
130130 assertTrue(result.records.isEmpty())
131131 }
132132
133+ @Test fun lateMovedShortenedOrDeletedDeliveryCannotBecomeEarlierAbsence () {
134+ val changed = listOf (
135+ row(time = at + 1 , revision = at + 10 ),
136+ row(time = at - 7_200_000 , revision = at + 10 ),
137+ row(time = at - 7_200_000 , revision = at + 10 , fields = buildJsonObject {
138+ put(" eventType" , " Temp Basal" ); put(" duration" , 1 ); put(" absolute" , 0.8 )
139+ }),
140+ row(time = at + 1 , revision = at + 10 , deleted = true )
141+ )
142+ for (source in changed) {
143+ val result = read(source)
144+ assertEquals(AapsV3ObservedInsulinStatus .LATE_EVIDENCE , result.status)
145+ assertTrue(result.records.isEmpty())
146+ assertFalse(result.upstreamCompletenessVerified)
147+ }
148+ }
149+
150+ @Test fun newerEmptyOrUnrelatedSnapshotCannotReconstructEarlierInventory () {
151+ val unrelated = row(" note" , time = at + 1 , revision = at + 10 ,
152+ fields = buildJsonObject { put(" eventType" , " Note" ) })
153+ for (rows in listOf (emptyList(), listOf (unrelated), listOf (row(), unrelated))) {
154+ val timeline = AapsV3InsulinInventoryTimeline (LocalV3RetainedSnapshot .Complete (at + 10 , rows))
155+ val historical = timeline.read(at - 3_600_000 , at, at)
156+ assertEquals(AapsV3ObservedInsulinStatus .LATE_EVIDENCE , historical.status)
157+ assertTrue(historical.records.isEmpty())
158+ val current = timeline.read(at - 3_600_000 , at, at + 10 )
159+ assertEquals(if (rows.size == 2 ) AapsV3ObservedInsulinStatus .OBSERVED
160+ else AapsV3ObservedInsulinStatus .NOT_OBSERVED , current.status)
161+ assertFalse(current.upstreamCompletenessVerified)
162+ }
163+ }
164+
133165 @Test fun emptyAndOverLimitAreExplicitAndNeverProveCoverage () {
134166 val empty = read()
135167 assertEquals(AapsV3ObservedInsulinStatus .NOT_OBSERVED , empty.status)
0 commit comments