Files
Enelix-EMS/tests/NachrichtenvertragTest.php
2026-09-27 08:46:17 +00:00

156 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
namespace Belevo\EnelixEMS\Tests;
use Belevo\EnelixEMS\Nachrichtenvertrag;
use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
final class NachrichtenvertragTest extends TestCase
{
public function testGueltigeManagerdatenWerdenAkzeptiert(): void
{
Nachrichtenvertrag::pruefeManagerdaten([
'Kopf' => $this->kopf(10001, 20001),
'Betriebsart' => Nachrichtenvertrag::BETRIEBSART_PV,
'Sollleistung_W' => 1501,
]);
Nachrichtenvertrag::pruefeManagerdaten([
'Kopf' => $this->kopf(10001, 20001),
'Betriebsart' => Nachrichtenvertrag::BETRIEBSART_PEAK,
'Sollleistung_W' => null,
]);
self::assertTrue(true);
}
public function testUngueltigeBetriebsartWirdAbgelehnt(): void
{
$daten = $this->verbraucherdaten();
$daten['Betriebsart'] = 'Unbekannt';
$this->expectException(InvalidArgumentException::class);
Nachrichtenvertrag::pruefeVerbraucherdaten($daten);
}
public function testGueltigeVerbraucherdatenMitEinzelwertenUndBereichenWerdenAkzeptiert(): void
{
Nachrichtenvertrag::pruefeVerbraucherdaten($this->verbraucherdaten());
self::assertTrue(true);
}
public function testLeistungswertWirdInEinzelwertenUndBereichenGefunden(): void
{
$angebot = [0, ['Von_W' => 1000, 'Bis_W' => 2000], 3000];
self::assertTrue(Nachrichtenvertrag::enthaeltLeistungswert($angebot, 0));
self::assertTrue(Nachrichtenvertrag::enthaeltLeistungswert($angebot, 1537));
self::assertTrue(Nachrichtenvertrag::enthaeltLeistungswert($angebot, 2000));
self::assertFalse(Nachrichtenvertrag::enthaeltLeistungswert($angebot, 999));
self::assertFalse(Nachrichtenvertrag::enthaeltLeistungswert($angebot, 2500));
}
public function testNegativePrioritaetWirdAbgelehnt(): void
{
$daten = $this->verbraucherdaten();
$daten['PrioritaetPV'] = -1;
$this->expectException(InvalidArgumentException::class);
Nachrichtenvertrag::pruefeVerbraucherdaten($daten);
}
public function testUeberlappendeLeistungsbereicheWerdenAbgelehnt(): void
{
$daten = $this->verbraucherdaten();
$daten['Leistungswerte_W'] = [0, ['Von_W' => 100, 'Bis_W' => 200], 200];
$this->expectException(InvalidArgumentException::class);
Nachrichtenvertrag::pruefeVerbraucherdaten($daten);
}
public function testMesswertOhneLeistungsquelleWirdAbgelehnt(): void
{
$daten = $this->verbraucherdaten();
$daten['Leistungsquelle'] = Nachrichtenvertrag::LEISTUNGSQUELLE_NICHT_VORHANDEN;
$this->expectException(InvalidArgumentException::class);
Nachrichtenvertrag::pruefeVerbraucherdaten($daten);
}
public function testFehlenderGemeinsamerSollwertImZustandWirdAbgelehnt(): void
{
$daten = $this->verbraucherdaten();
$daten['Zustand'] = [];
$this->expectException(InvalidArgumentException::class);
Nachrichtenvertrag::pruefeVerbraucherdaten($daten);
}
public function testUnbekanntesFeldWirdAbgelehnt(): void
{
$daten = $this->verbraucherdaten();
$daten['WeiteresFeld'] = true;
$this->expectException(InvalidArgumentException::class);
Nachrichtenvertrag::pruefeVerbraucherdaten($daten);
}
/**
* @return array<string, mixed>
*/
private function kopf(int $absenderID, int $empfaengerID): array
{
return [
'Version' => Nachrichtenvertrag::VERSION,
'AbsenderID' => $absenderID,
'EmpfaengerID' => $empfaengerID,
'Zeitpunkt' => 1788825600,
];
}
/**
* @return array<string, mixed>
*/
private function verbraucherdaten(): array
{
return [
'Kopf' => $this->kopf(20001, 10001),
'Betriebsart' => Nachrichtenvertrag::BETRIEBSART_PEAK,
'PrioritaetPV' => 0,
'PrioritaetPeak' => 12,
'Leistungswerte_W' => [
-3000,
-2000,
['Von_W' => -1000, 'Bis_W' => -500],
0,
100,
['Von_W' => 1000, 'Bis_W' => 2000],
3000,
],
'AenderungMoeglich' => true,
'Verfuegbar' => true,
'Istleistung_W' => 1498.5,
'Leistungsquelle' => Nachrichtenvertrag::LEISTUNGSQUELLE_GEMESSEN,
'Zustand' => [
[
'Kennung' => 'Sollleistung_W',
'Art' => 'Sollwert',
'Wert' => 1501,
'Einheit' => 'W',
],
[
'Kennung' => 'Fuehlerfehler',
'Art' => 'Stoerung',
'Wert' => false,
'Einheit' => '',
],
],
];
}
}