$row) { echo " Row {$r}: " . implode('', $row) . "\n"; } echo "\n"; // Create matrix and apply finder pattern $matrix = QrCodeMatrix::create(QrCodeVersion::fromNumber(1)); $matrix = FinderPattern::apply($matrix); // Test top-left finder pattern echo "Actual Top-Left Finder Pattern:\n"; $errors = 0; for ($r = 0; $r < 7; $r++) { $bits = ''; for ($c = 0; $c < 7; $c++) { $isDark = $matrix->getModuleAt($r, $c)->isDark(); $bit = $isDark ? '1' : '0'; $bits .= $bit; if ($bit !== (string)$expectedPattern[$r][$c]) { $errors++; } } echo " Row {$r}: {$bits}"; if ($bits === implode('', $expectedPattern[$r])) { echo " āœ…\n"; } else { echo " āŒ (expected: " . implode('', $expectedPattern[$r]) . ")\n"; // Show differences for ($c = 0; $c < 7; $c++) { $actual = $bits[$c]; $expected = (string)$expectedPattern[$r][$c]; if ($actual !== $expected) { echo " Column {$c}: got {$actual}, expected {$expected}\n"; } } } } echo "\nTotal errors: {$errors}\n\n"; // Test the logic manually echo "=== Manual Logic Test ===\n"; echo "For position (r=2, c=3):\n"; $r = 2; $c = 3; echo " r = {$r}, c = {$c}\n"; echo " Outer ring? (r==0 || r==6 || c==0 || c==6): " . (($r === 0 || $r === 6 || $c === 0 || $c === 6) ? "YES" : "NO") . "\n"; echo " White ring? (r==1 || r==5 || c==1 || c==5): " . (($r === 1 || $r === 5 || $c === 1 || $c === 5) ? "YES" : "NO") . "\n"; echo " Expected: DARK (inner 3x3)\n"; echo " Actual: " . ($matrix->getModuleAt($r, $c)->isDark() ? "DARK" : "LIGHT") . "\n"; if (!$matrix->getModuleAt($r, $c)->isDark()) { echo "\nāŒ PROBLEM FOUND: Position (2,3) should be DARK but is LIGHT!\n"; echo "This means the white ring condition is matching incorrectly.\n"; }