diff --git a/services/pcp-tgu-service/src/test/kotlin/space/nstart/pcp_tgu_service/service/PlanCalculationServiceTest.kt b/services/pcp-tgu-service/src/test/kotlin/space/nstart/pcp_tgu_service/service/PlanCalculationServiceTest.kt index a6474a0..5dde633 100644 --- a/services/pcp-tgu-service/src/test/kotlin/space/nstart/pcp_tgu_service/service/PlanCalculationServiceTest.kt +++ b/services/pcp-tgu-service/src/test/kotlin/space/nstart/pcp_tgu_service/service/PlanCalculationServiceTest.kt @@ -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" + ) } /**