116 lines
3.7 KiB
PHP
116 lines
3.7 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)
|
|
);
|
|
}
|
|
|
|
public function testGesperrtesOderErzwungenesAngebotEnthaeltNurIstleistung(): void
|
|
{
|
|
self::assertSame(
|
|
[3500],
|
|
EinStufigRegler::leistungsangebot(3500, 3500, true, false, false)
|
|
);
|
|
self::assertSame(
|
|
[0],
|
|
EinStufigRegler::leistungsangebot(3500, 0, true, true, true)
|
|
);
|
|
self::assertSame(
|
|
[3500],
|
|
EinStufigRegler::leistungsangebot(3500, 3500, false, true, false)
|
|
);
|
|
}
|
|
|
|
public function testUngueltigeIstleistungWirdAbgewiesen(): void
|
|
{
|
|
$this->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));
|
|
}
|
|
}
|