getData())->toBe('Testdaten'); expect($qrCode->getErrorCorrectionLevel())->toBe(ErrorCorrectionLevel::M); expect($qrCode->getVersion())->toBeNull(); }); test('QrCode wirft Exception bei leeren Daten', function () { expect(fn () => new QrCode(''))->toThrow(QrCodeException::class); }); test('QrCode withMethods erzeugen neue Instanzen', function () { $original = new QrCode('Test'); $withLevel = $original->withErrorCorrectionLevel(ErrorCorrectionLevel::H); $withVersion = $original->withVersion(new QrCodeVersion(5)); expect($withLevel)->not->toBe($original); expect($withVersion)->not->toBe($original); expect($withLevel->getErrorCorrectionLevel())->toBe(ErrorCorrectionLevel::H); expect($withVersion->getVersion()->getValue())->toBe(5); }); test('MaskPattern kann Maskenbedingungen korrekt auswerten', function () { $pattern = MaskPattern::PATTERN_0; expect($pattern->shouldMask(0, 0))->toBeTrue(); // (0+0)%2 = 0 expect($pattern->shouldMask(1, 0))->toBeFalse(); // (1+0)%2 = 1 expect($pattern->shouldMask(1, 1))->toBeTrue(); // (1+1)%2 = 0 }); test('QrCodeEncoder kann Daten kodieren', function () { $encoder = new QrCodeEncoder(); $qrCode = new QrCode('123'); $version = new QrCodeVersion(1); $encoded = $encoder->encode($qrCode, $version); expect($encoded)->toBeString(); expect(strlen($encoded))->toBeGreaterThan(0); }); test('QrCodeGenerator kann QR-Code-Matrix generieren', function () { $generator = new QrCodeGenerator( new QrCodeEncoder(), new QrCodeRenderer(new QrCodeMasker(), new ReedSolomon()) ); $qrCode = new QrCode('Test123'); $matrix = $generator->generate($qrCode); expect($matrix->getSize())->toBeGreaterThan(20); // QR-Code ist mindestens Version 1 (21x21) }); test('QrCodeMasker berechnet Maskenstrafen korrekt', function () { $masker = new QrCodeMasker(); $size = 21; // Version 1 // Matrix mit alternierenden Modulen (geringe Strafe) $alternatingMatrix = []; for ($i = 0; $i < $size; $i++) { $alternatingMatrix[$i] = []; for ($j = 0; $j < $size; $j++) { $alternatingMatrix[$i][$j] = ($i + $j) % 2 === 0; } } // Matrix mit vielen aufeinanderfolgenden gleichen Modulen (hohe Strafe) $repeatingMatrix = []; for ($i = 0; $i < $size; $i++) { $repeatingMatrix[$i] = []; for ($j = 0; $j < $size; $j++) { $repeatingMatrix[$i][$j] = $j < $size / 2; } } $alternatingPenalty = $masker->calculateMaskPenalty($alternatingMatrix, $size); $repeatingPenalty = $masker->calculateMaskPenalty($repeatingMatrix, $size); expect($alternatingPenalty)->toBeLessThan($repeatingPenalty); });