Files
Enelix-EMS/tests/VerbraucherEinStufig/EinStufigReglerTest.php
T
2026-09-21 18:46:17 +00:00

155 lines
5.0 KiB
PHP

<?php
declare(strict_types=1);
namespace Belevo\EnelixEMS\Tests;
use Belevo\EnelixEMS\EinStufigRegler;
use DateTimeImmutable;
use DateTimeZone;
use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
final class EinStufigReglerTest extends TestCase
{
public function testFreiesLeistungsangebotEnthaeltAusUndEin(): void
{
self::assertSame(
[0, 3500],
EinStufigRegler::leistungsangebot(3500, 0, true, true, false, false)
);
}
public function testPeakbetriebBietetBeiFreierSchaltungNurAus(): void
{
self::assertSame(
[0],
EinStufigRegler::leistungsangebot(3500, 0, true, true, false, true)
);
}
public function testTechnischGesperrtesAngebotEnthaeltNurIstleistung(): void
{
self::assertSame(
[3500],
EinStufigRegler::leistungsangebot(3500, 3500, true, false, false, true)
);
self::assertSame(
[3500],
EinStufigRegler::leistungsangebot(3500, 3500, false, true, false, true)
);
}
public function testPeakSperreBeiMindestlaufzeitIstKonfigurierbar(): void
{
self::assertSame(
[0, 3500],
EinStufigRegler::leistungsangebot(3500, 0, true, true, true, true, true)
);
self::assertSame(
[3500],
EinStufigRegler::leistungsangebot(3500, 0, true, true, true, true, false)
);
self::assertSame(
[3500],
EinStufigRegler::leistungsangebot(3500, 0, true, true, true, false, true)
);
}
public function testUngueltigeIstleistungWirdAbgewiesen(): void
{
$this->expectException(InvalidArgumentException::class);
EinStufigRegler::leistungsangebot(3500, 1200, true, true, false, 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));
}
}