Тест: провал видимости перекрывается одним планом (форма Reflexio)

Воспроизводит форму с экрана Reflexio (раннее окно, большой провал
видимости, далёкий кластер) и проверяет, что цепочка перекрывает провал
одним длинным планом и доходит до далёкого кластера без разрыва.
This commit is contained in:
Дмитрий Соловьев
2026-06-02 11:32:16 +03:00
parent e0aa1ccf0e
commit d630a891f6
@@ -237,14 +237,16 @@ class PlanCalculationServiceTest {
fun `calculatePlans never leaves a gap between plans across a visibility gap`() {
val service = createService(targetMinutes = 180L, deltaMinutes = 60L)
val start = LocalDateTime.of(2026, 3, 10, 10, 0)
// Плотный кластер окон, затем большой провал видимости, затем далёкий кластер.
// Провал допустимо перекрыть одним длинным планом, но разрыва между планами быть не должно.
// Воспроизводит форму с экрана Reflexio: раннее окно, затем большой провал
// видимости, затем далёкий кластер. Провал допустимо перекрыть одним длинным
// планом, но разрыва между планами быть не должно.
val gap = start.plusDays(3)
val windows = buildList {
for (minutes in 0..240 step 20) {
add(window("NEAR-$minutes", start.plusMinutes(minutes.toLong())))
}
for (minutes in 0..120 step 20) {
add(window("FAR-$minutes", start.plusDays(3).plusMinutes(minutes.toLong())))
for (minutes in 0..240 step 20) {
add(window("FAR-$minutes", gap.plusMinutes(minutes.toLong())))
}
}
@@ -252,7 +254,16 @@ class PlanCalculationServiceTest {
// Главное требование: каждый следующий план стартует строго внутри предыдущего (без разрыва).
assertChainInvariant(plans)
assertTrue(plans.size >= 2, "expected a multi-plan chain, got ${plans.size}")
// Провал перекрыт одним длинным планом: есть план, начинающийся до провала и кончающийся после.
assertTrue(
plans.any { plan -> plan.startTime < gap && plan.endTime > gap },
"the visibility gap must be bridged by a single plan: $plans"
)
// И цепочка действительно доходит до далёкого кластера, а не обрывается до провала.
assertTrue(
plans.any { plan -> plan.startTime >= gap },
"the chain must reach the far cluster after the gap: $plans"
)
}
/**