package com.ruoyi.system.service.impl; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.Test; /** 区间完整性序号检查的外部行为测试。 */ class IntervalIntegrityCheckerTest { @Test void ignoresDuplicatesAndOutOfOrderSamples() { assertEquals(List.of(new IntervalIntegrityChecker.Gap(3, 3), new IntervalIntegrityChecker.Gap(5, 5)), IntervalIntegrityChecker.gaps(List.of(4L, 1L, 2L, 4L, 6L))); } @Test void treatsEachReceptionIntervalIndependently() { assertEquals(List.of(), IntervalIntegrityChecker.gaps(List.of(1L, 2L))); assertEquals(List.of(), IntervalIntegrityChecker.gaps(List.of(8L, 9L))); } @Test void reportsMultipleOpenGaps() { assertEquals(List.of(new IntervalIntegrityChecker.Gap(3, 4), new IntervalIntegrityChecker.Gap(7, 8)), IntervalIntegrityChecker.gaps(List.of(1L, 2L, 5L, 6L, 9L))); } @Test void doesNotTreatPauseOrHandoverAsAnIntraIntervalGap() { assertEquals(List.of(), IntervalIntegrityChecker.gaps(List.of(10L, 11L))); assertEquals(List.of(), IntervalIntegrityChecker.gaps(List.of(20L, 21L))); } @Test void emptyIntervalHasNoSyntheticSequenceGap() { assertEquals(List.of(), IntervalIntegrityChecker.gaps(List.of())); } @Test void filtersInvalidSequenceValuesWithoutInventingGaps() { assertEquals(List.of(), IntervalIntegrityChecker.gaps(Arrays.asList(null, 0L, -1L, 5L))); } @Test void remainsStableAcrossReplayPermutationsAndDuplicates() { List expected = List.of( new IntervalIntegrityChecker.Gap(3, 3), new IntervalIntegrityChecker.Gap(6, 7)); List> replays = List.of( List.of(8L, 1L, 2L, 4L, 5L, 8L), List.of(1L, 8L, 5L, 4L, 2L, 5L), List.of(2L, 4L, 1L, 8L, 4L, 5L)); for (List replay : replays) assertEquals(expected, IntervalIntegrityChecker.gaps(replay)); assertEquals(expected, IntervalIntegrityChecker.gaps(replays.get(0))); } }