addErrorCorrection($data, $dataCapacity, $level); // Überprüfe, dass das Ergebnis länger als die Eingabe ist (ECC wurde hinzugefügt) expect(strlen($encoded))->toBeGreaterThan(strlen($data)); // Überprüfe, dass die ursprünglichen Daten am Anfang vorhanden sind expect(substr($encoded, 0, strlen($data)))->toBe($data); }); test('ReedSolomonEncoder kann Bytes kodieren', function () { $encoder = new ReedSolomonEncoder(); // Testdaten: [0x32, 0x54, 0x67, 0x89] $data = [0x32, 0x54, 0x67, 0x89]; $eccLength = 4; // 4 ECC Bytes hinzufügen $encoded = $encoder->encode($data, $eccLength); // Erwarte Originaldaten + ECC-Bytes expect(count($encoded))->toBe(count($data) + $eccLength); // Überprüfe, dass die ursprünglichen Daten am Anfang vorhanden sind for ($i = 0; $i < count($data); $i++) { expect($encoded[$i])->toBe($data[$i]); } // Überprüfe, dass die ECC-Bytes nicht alle 0 sind (echte Berechnung) $allZero = true; for ($i = count($data); $i < count($encoded); $i++) { if ($encoded[$i] !== 0) { $allZero = false; break; } } expect($allZero)->toBeFalse(); }); test('ReedSolomon kann Daten in Blöcke organisieren', function () { $rs = new ReedSolomon(); $method = new ReflectionMethod($rs, 'organizeDataBlocks'); $method->setAccessible(true); // Testdaten: 8 Bytes [1, 2, 3, 4, 5, 6, 7, 8] $data = [1, 2, 3, 4, 5, 6, 7, 8]; $version = 1; $level = ErrorCorrectionLevel::M; // 1 Block für Version 1-M $blocks = $method->invoke($rs, $data, $version, $level); // Version 1-M hat 1 Block expect(count($blocks))->toBe(1); expect($blocks[0])->toBe($data); }); test('ReedSolomon kann Blöcke interleaven', function () { $rs = new ReedSolomon(); $method = new ReflectionMethod($rs, 'interleaveBlocks'); $method->setAccessible(true); // 2 Blöcke: [1, 2, 3] und [4, 5, 6] $blocks = [[1, 2, 3], [4, 5, 6]]; $interleaved = $method->invoke($rs, $blocks); // Erwartetes Ergebnis: [1, 4, 2, 5, 3, 6] expect($interleaved)->toBe([1, 4, 2, 5, 3, 6]); });