expectException(InvalidArgumentException::class); EinStufigRegler::leistungsangebot(3500, 1200, true, true, false); } public function testFreigabeVerwendetZustandsabhaengigeMindestdauer(): void { self::assertSame(1010, EinStufigRegler::freigabezeitpunkt(true, 1000, 10, 20)); self::assertSame(1020, EinStufigRegler::freigabezeitpunkt(false, 1000, 10, 20)); } public function testRestMindestzeitWirdNieNegativ(): void { self::assertSame(7, EinStufigRegler::restMindestzeit(1007, 1000)); self::assertSame(0, EinStufigRegler::restMindestzeit(1000, 1007)); } public function testNegativeMindestdauerWirdAbgewiesen(): void { $this->expectException(InvalidArgumentException::class); EinStufigRegler::freigabezeitpunkt(true, 1000, -1, 0); } 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)); } }