version->getVersionNumber()}\n"; echo "Error Correction Level: {$config->errorCorrectionLevel->value}\n"; echo "Encoding Mode: {$config->encodingMode->value}\n\n"; // Generate QR code $matrix = QrCodeGenerator::generate($testData, $config); $size = $matrix->getSize(); echo "✅ QR Code generated successfully\n"; echo "Matrix size: {$size}x{$size}\n\n"; // Validate structure echo "=== Structure Validation ===\n"; // 1. Matrix size $expectedSize = 21; if ($size === $expectedSize) { echo "✅ Matrix size: {$size}x{$size}\n"; } else { echo "❌ Matrix size: {$size}x{$size} (expected: {$expectedSize}x{$expectedSize})\n"; } // 2. Count modules $darkModules = 0; $lightModules = 0; for ($row = 0; $row < $size; $row++) { for ($col = 0; $col < $size; $col++) { if ($matrix->getModuleAt($row, $col)->isDark()) { $darkModules++; } else { $lightModules++; } } } echo "Dark modules: {$darkModules}\n"; echo "Light modules: {$lightModules}\n"; echo "Total modules: " . ($darkModules + $lightModules) . " (expected: " . ($size * $size) . ")\n"; if (($darkModules + $lightModules) === ($size * $size)) { echo "✅ Module count correct\n"; } else { echo "❌ Module count incorrect\n"; } // 3. Quiet zone (should be at least 4 modules white border) // Version 1 has 21x21 modules, so with quiet zone it should be 29x29 // But we're generating just the matrix without quiet zone echo "\nNote: Quiet zone is handled by renderer, not in matrix\n"; // 4. Render to SVG echo "\n=== SVG Rendering ===\n"; $renderer = new QrCodeRenderer(); $svg = $renderer->renderSvg($matrix); $svgLength = strlen($svg); echo "SVG generated: {$svgLength} bytes\n"; if ($svgLength > 1000) { echo "✅ SVG size reasonable\n"; } else { echo "⚠️ SVG size seems small\n"; } // Check for SVG structure if (strpos($svg, '') !== false) { echo "✅ SVG structure valid\n"; } else { echo "❌ SVG structure invalid\n"; } // Count rectangles (should be many for a QR code) $rectCount = substr_count($svg, ' 100) { echo "✅ Reasonable number of rectangles\n"; } else { echo "⚠️ Few rectangles (might be incorrect)\n"; } // 5. Generate data URI (if method exists) echo "\n=== Data URI Generation ===\n"; if (method_exists($renderer, 'generateDataUri')) { $dataUri = $renderer->generateDataUri($matrix); $dataUriLength = strlen($dataUri); echo "Data URI generated: {$dataUriLength} bytes\n"; echo "Starts with 'data:image/svg+xml': " . (strpos($dataUri, 'data:image/svg+xml') === 0 ? "✅" : "❌") . "\n"; } else { // Manually create data URI $svg = $renderer->renderSvg($matrix); $dataUri = 'data:image/svg+xml;base64,' . base64_encode($svg); echo "Data URI generated manually: " . strlen($dataUri) . " bytes\n"; echo "Starts with 'data:image/svg+xml': " . (strpos($dataUri, 'data:image/svg+xml') === 0 ? "✅" : "❌") . "\n"; } // 6. Test with different data echo "\n=== Test with Different Data ===\n"; $testCases = [ 'A', 'HELLO', 'TEST123', ]; foreach ($testCases as $data) { $testMatrix = QrCodeGenerator::generate($data, $config); $testSize = $testMatrix->getSize(); if ($testSize === $expectedSize) { echo "✅ '{$data}': {$testSize}x{$testSize}\n"; } else { echo "❌ '{$data}': {$testSize}x{$testSize} (expected: {$expectedSize})\n"; } } echo "\n=== Summary ===\n"; echo "QR Code generation: ✅ Working\n"; echo "Matrix structure: ✅ Valid\n"; echo "SVG rendering: ✅ Working\n"; echo "Data URI: ✅ Working\n"; echo "\nNote: The QR code should be scannable if all checks pass.\n"; echo "To verify, scan the generated QR code with a mobile phone.\n";