verbraucher(20, 5, [0, 3000], 0), $this->verbraucher(10, 0, [0, ['Von_W' => 1000, 'Bis_W' => 2000], 4000], 0), ], 'PrioritaetPV' ); self::assertSame(4500, $ergebnis['Verteilbudget_W']); self::assertSame([10 => 4000, 20 => 0], $ergebnis['Sollwerte']); self::assertSame(500, $ergebnis['Restabweichung_W']); } public function testNichtAenderbarerVerbraucherReserviertSeineIstleistung(): void { $fest = $this->verbraucher(10, 0, [0, 3000], 3000, false); $steuerbar = $this->verbraucher(20, 1, [0, ['Von_W' => 1, 'Bis_W' => 4000]], 0); $ergebnis = ManagerRegler::verteile(3000.0, 5000.0, [$fest, $steuerbar], 'PrioritaetPV'); self::assertSame(3000, $ergebnis['NichtSteuerbar_W']); self::assertSame([20 => 2000], $ergebnis['Sollwerte']); self::assertSame(0, $ergebnis['Restabweichung_W']); } public function testFehlendeIstleistungFaelltAufAngenommenenSollwertZurueck(): void { $verbraucher = $this->verbraucher(10, 0, [0, 3000], null, false); $verbraucher['Daten']['Leistungsquelle'] = Nachrichtenvertrag::LEISTUNGSQUELLE_NICHT_VORHANDEN; $verbraucher['Daten']['Istleistung_W'] = null; $verbraucher['Daten']['Zustand'][0]['Wert'] = 3000; $ergebnis = ManagerRegler::verteile(3000.0, 0.0, [$verbraucher], 'PrioritaetPV'); self::assertSame(3000, $ergebnis['AktuelleVerbraucherleistung_W']); self::assertSame(-3000, $ergebnis['Restabweichung_W']); } public function testMonatlicheGrenzeMussVollstaendigSein(): void { $this->expectException(InvalidArgumentException::class); ManagerRegler::wirksameLastspitzengrenze(2, 0.0, [1 => 12000.0], 9); } /** * @param list $leistungswerte * @return array{InstanzID: int, Daten: array} */ private function verbraucher( int $instanzID, int $prioritaet, array $leistungswerte, ?int $istleistung, bool $aenderungMoeglich = true ): array { $quelle = $istleistung === null ? Nachrichtenvertrag::LEISTUNGSQUELLE_NICHT_VORHANDEN : Nachrichtenvertrag::LEISTUNGSQUELLE_GEMESSEN; return [ 'InstanzID' => $instanzID, 'Daten' => [ 'Kopf' => [ 'Version' => Nachrichtenvertrag::VERSION, 'AbsenderID' => $instanzID, 'EmpfaengerID' => 1, 'Zeitpunkt' => 1788825600, ], 'Betriebsart' => Nachrichtenvertrag::BETRIEBSART_PV, 'PrioritaetPV' => $prioritaet, 'PrioritaetPeak' => $prioritaet, 'Leistungswerte_W' => $leistungswerte, 'AenderungMoeglich' => $aenderungMoeglich, 'Verfuegbar' => true, 'Istleistung_W' => $istleistung, 'Leistungsquelle' => $quelle, 'Zustand' => [[ 'Kennung' => 'Sollleistung_W', 'Art' => 'Sollwert', 'Wert' => $istleistung, 'Einheit' => 'W', ]], ], ]; } }