1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package cn.iocoder.yudao.module.mes.service.collect;
 
import org.junit.jupiter.api.Test;
import java.time.Duration;
import java.time.LocalDateTime;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
 
class CollectOfflinePolicyTest {
    private final LocalDateTime t = LocalDateTime.of(2026, 11, 6, 8, 0);
    private final Duration timeout = Duration.ofMinutes(5);
 
    @Test void recordsOnlyGapsAfterLastObservedSampleAndClipsAtQueryBounds() {
        var intervals = CollectOfflinePolicy.calculate(List.of(t, t.plusMinutes(2), t.plusMinutes(12)),
                t.plusMinutes(5), t.plusMinutes(20), timeout);
        assertEquals(2, intervals.size());
        assertEquals(t.plusMinutes(7), intervals.get(0).start());
        assertEquals(t.plusMinutes(12), intervals.get(0).end());
        assertEquals(t.plusMinutes(17), intervals.get(1).start());
        assertEquals(t.plusMinutes(20), intervals.get(1).end());
        assertTrue(CollectOfflinePolicy.calculate(List.of(), t, t.plusHours(1), timeout).isEmpty());
    }
 
    @Test void doesNotInferBeforeFirstSampleOrCountShortGaps() {
        var result = CollectOfflinePolicy.calculate(List.of(t.plusMinutes(5), t.plusMinutes(9)),
                t, t.plusMinutes(12), timeout);
        assertTrue(result.isEmpty());
    }
 
    @Test void openOfflineIntervalIsClippedToTheRequestedWindow() {
        var result = CollectOfflinePolicy.calculate(List.of(t), t.plusMinutes(10), t.plusMinutes(20), timeout);
        assertEquals(1, result.size());
        assertEquals(t.plusMinutes(10), result.getFirst().start());
        assertEquals(t.plusMinutes(20), result.getFirst().end());
    }
}