expectException(InvalidArgumentException::class); EinStufigRegler::leistungsangebot(3500, 1200, true, true, false); } public function testMindestlaufzeitWirdErstZumSpaetestmoeglichenStartErzwungen(): void { self::assertFalse(EinStufigRegler::mussMindestlaufzeitErzwingen(0, 3600, 7200)); self::assertTrue(EinStufigRegler::mussMindestlaufzeitErzwingen(0, 3600, 3600)); self::assertTrue(EinStufigRegler::mussMindestlaufzeitErzwingen(1800, 3600, 1200)); self::assertFalse(EinStufigRegler::mussMindestlaufzeitErzwingen(3600, 3600, 1)); } public function testNaechsteTagespruefungIstEreignisbasiert(): void { self::assertSame( 3600, EinStufigRegler::sekundenBisNaechsteTagespruefung(0, 3600, 7200, false) ); self::assertSame( 1800, EinStufigRegler::sekundenBisNaechsteTagespruefung(1800, 3600, 7200, true) ); self::assertSame( 7200, EinStufigRegler::sekundenBisNaechsteTagespruefung(3600, 3600, 7200, false) ); } public function testLaufzeitWirdInnerhalbEinesTagesFortgeschrieben(): void { $zone = new DateTimeZone('Europe/Zurich'); $von = (new DateTimeImmutable('2026-09-17 10:00:00', $zone))->getTimestamp(); $bis = (new DateTimeImmutable('2026-09-17 10:02:30', $zone))->getTimestamp(); self::assertSame( ['Tag' => '2026-09-17', 'Sekunden' => 250, 'StandZeit' => $bis], EinStufigRegler::aktualisiereTageslaufzeit( '2026-09-17', 100, $von, $bis, true, $zone ) ); } public function testLaufzeitWirdAnLokalerTagesgrenzeGetrennt(): void { $zone = new DateTimeZone('Europe/Zurich'); $von = (new DateTimeImmutable('2026-09-16 23:59:50', $zone))->getTimestamp(); $bis = (new DateTimeImmutable('2026-09-17 00:00:10', $zone))->getTimestamp(); self::assertSame( ['Tag' => '2026-09-17', 'Sekunden' => 10, 'StandZeit' => $bis], EinStufigRegler::aktualisiereTageslaufzeit( '2026-09-16', 1000, $von, $bis, true, $zone ) ); } public function testTagesendeBeruecksichtigtSommerzeit(): void { $zone = new DateTimeZone('Europe/Zurich'); $zeitpunkt = (new DateTimeImmutable('2026-03-29 00:00:00', $zone))->getTimestamp(); self::assertSame(23 * 3600, EinStufigRegler::sekundenBisTagesende($zeitpunkt, $zone)); } }